自定义控件实现广告头自动移动,viewpager的运用,和自己利用xml画图,自定义圆点,构造选择器的方法

1、viewpager在广告头里经常运用到,它是android3后出现的控件,在因此在添加的时候android.support.v4.view.ViewPager.class里,因此在xml定义的时候需要加全名称,同时注意不要后缀名class。下面从demo里学习viewpager的运用。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.viewdemo.MainActivity$PlaceholderFragment"
    android:background="@android:color/darker_gray"
    >

    <android.support.v4.view.ViewPager
         android:id="@+id/img_view"
        android:layout_width="fill_parent"
        android:layout_height="200dp"
        />

    <!-- 这里background设置后6位为rgb的值,前面是透明度参数,33为半透明 -->
    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:background="#33000000"
        android:layout_alignBottom="@+id/img_view"
        >
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:textColor="@android:color/white"
            android:paddingTop="5dp"
            android:id="@+id/title"
             />

        <!-- 这里定义一个空的线性布局,在代码里加入点的ui ,
        注意gravity的运用是在容器里控件的排列,用于ui是ui在它布局里的排列-->
        <LinearLayout
            android:id="@+id/dians"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            android:gravity="center_horizontal"
            android:paddingBottom="10dp"
            android:layout_marginTop="2dp"
            >
        </LinearLayout>
    </LinearLayout>

</RelativeLayout>

  2、java的activity代码:

public class MainActivity extends Activity {
	private ViewPager viewpager;
	private ArrayList <ImageView> imageviews;
	private int number;
	private View[] points;
	private LinearLayout dians;
	private String[] titles;
	private TextView title;
	private boolean flag=true;//标识应用程序是否为可见

	public  Handler handler=new Handler(){

		@Override
		public void handleMessage(Message msg) {
			int a=msg.what;
			points[a].setEnabled(true);
			a++;
			int c=a%number;
			viewpager.setCurrentItem(c);
			title.setText(titles[c]);
			points[c].setEnabled(false);
			super.handleMessage(msg);
		}

	};

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        dians=(LinearLayout) findViewById(R.id.dians);
        title=(TextView) findViewById(R.id.title);
        number=5;
        initview();
        viewpager.setOnPageChangeListener(new PagerLisetner());
        setpointsOnclick();

        Thread pagermove=new Thread(new ThreadpageChange());
        pagermove.start();

    }

    class  ThreadpageChange implements Runnable
    {

		@Override
		public void run() {

			while(true){

				synchronized (MainActivity.class) {
					if(flag){
			try {
				Thread.sleep(2000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			int a=viewpager.getCurrentItem();
			Message msg=new Message();
			msg.what=a;
			handler.sendMessage(msg);
					} else
						try {
							MainActivity.class.wait();
						} catch (InterruptedException e) {
							e.printStackTrace();
						}
				}
			}
		}

    }
   //页面改变监听器
class PagerLisetner implements OnPageChangeListener
{

	@Override
	public void onPageScrollStateChanged(int arg0) {

	}

	@Override
	public void onPageScrolled(int arg0, float arg1, int arg2) {

	}

	@Override
	public void onPageSelected(int arg0) {

		title.setText(titles[arg0]);
		for(int x=0;x<number;x++ )
		{
			View v=dians.getChildAt(x);
			if(x==arg0)
				v.setEnabled(false);
			else
				v.setEnabled(true);
		}

	}

}
//设置点被点击的监听器
 public void setpointsOnclick()
{
	for(int x=0;x<number;x++)
	{

		View v=points[x];
		v.setTag(x);
		v.setOnClickListener(new PointOnclickLinstener());
	}
}
//点被点击的监听器
 class PointOnclickLinstener implements OnClickListener
		{
			@Override
			public void onClick(View v) {
				System.out.println("点击了。。。"+v.getTag());
				int index=(Integer) v.getTag();
				title.setText(titles[index]);
				points[index].setEnabled(true);
				viewpager.setCurrentItem(index);
			}
		}
 //初始化界面
public void initview()
    {
	//将每张图片创建一个Imgeview,并存起来
    	int[] images={
    			R.drawable.a,
    			R.drawable.b,
    			R.drawable.c,
    			R.drawable.d,
    			R.drawable.e
    	};
    	imageviews=new ArrayList<ImageView>();
    	for(int i=0;i<number;i++)
    	{
    		ImageView im=new ImageView(this);
    		im.setBackground(getResources().getDrawable(images[i]));
    		imageviews.add(im);
    	}

    	 viewpager=(ViewPager) findViewById(R.id.img_view);
         viewpager.setAdapter(new VpAdapter());
    	//添加点
    	addpoints();
    	//初始化标题
    	addTitle();
    	title.setText(titles[0]);
    	points[0].setEnabled(false);

    }
//添加点
public void addpoints()
{
	points=new View[number];
	for(int i=0;i<number;i++)
    {
     View v=new View(this);
     //创建子视图
     LayoutParams pa=new LayoutParams(8, 8);
     pa.leftMargin=10;
     v.setLayoutParams(pa);//使点按照子视图格式形成view
     v.setBackgroundResource(R.drawable.bg);//设置点的背景,这里的bg是选择器,下面介绍
     v.setEnabled(true);
    //将创建的子视图点添加到LinearLayout中
     points[i]=v;
     dians.addView(v);
    }
}

//添加标题
public void addTitle()
{
	titles=new String[]{
		"巩俐不低俗,我就不能低俗",
		"朴树邮回来啦!唱经典老歌引万人大合唱",
		"揭秘北京电影如何升级",
		"乐视网TV版大派送",
		"热血屌丝的反杀"
	};

}

class VpAdapter extends PagerAdapter
{

	@Override
	public Object instantiateItem(ViewGroup container, int position) {

		viewpager.addView(imageviews.get(position));

		return imageviews.get(position);
	}
	@Override
	public void destroyItem(ViewGroup container, int position, Object object) {
		//从右向左划就删除当前页,从右往左就加,即执行instantiateItem,当1时候一下跳到5时,其实add了前面4个(仅我的看法)
		viewpager.removeView(imageviews.get(position));
	}
	@Override
	public int getCount() {
		return imageviews.size();
	}

	@Override
	public boolean isViewFromObject(View arg0, Object arg1) {
		return arg0==arg1;
	}

}

//重写下面activity生命周期是当程序后台时为了将资源消耗,让子线程等待
@Override
protected void onResume() {
		if(!flag)
		MainActivity.class.notify();
	super.onResume();
}
@Override
protected void onPause() {
	flag=false;
	super.onPause();
}

}

  3、下面介绍如何在xml文件里画图的,首先给出我的工程目录:

可以看出,文件里定义了dian_normal,和dian_select,这是点在被选择和没有被选择的时候的图像,bg其实就是这两种图像的选择器,当可点击时候选normal,不可点击时候显示select。画图是在drawable里选择shape,然后再里面可以画几种简单的形状:

normal的xml文件:android:shape=oval是指画圆,下面的corners 里radius是圆半径、solid是填充颜色。

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="oval">
    <corners
        android:radius="0.5dp"
        />
        <solid
            android:color="@android:color/background_dark"
            />
</shape>

  select的xml文件

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="oval">
    <corners
        android:radius="0.5dp"
        />
        <solid
            android:color="@android:color/white"
            />
</shape>

  下面是选择器:db.xml,即当enable=true时候选择一种drawable,false时候选择另一个

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
    <item android:state_enabled="false" android:drawable="@drawable/dian_select"></item>
	<item android:state_enabled="true" android:drawable="@drawable/dian_normal"></item>
</selector>

  

时间: 2024-10-12 12:35:44

自定义控件实现广告头自动移动,viewpager的运用,和自己利用xml画图,自定义圆点,构造选择器的方法的相关文章

Android自定义控件---导航栏SlideTab(Fragment+ViewPager)

一.前言 好久没有更新过博客了,趁今天有空分享一个导航栏的自定义控件.有关此控件的demo相信在网上已经烂大街了,一搜一大把. 我现在只着重分享一些我认为比较难理解的知识点.整个控件的难点大概有三个 1.游标的绘制. 2.ViewPager监听器的理解. 3.游标的移动. 本文将注重这三个方面重点分析. 先上Demo的最终效果 二.Demo结构图和知识点 样例Module,有四个java文件和两个xml文件 总结一下此控件的主要知识点 1.ViewGroup绘制流程. 2.ViewPager的用

Android-ConvenientBanner轻松实现广告头效果

Android-ConvenientBanner通用的广告栏控件,让你轻松实现广告头效果.支持无限循环,可以设置自动翻页和时间(而且非常智能,手指触碰则暂停翻页,离开自动开始翻页.你也可以设置在界面onPause的时候不进行自动翻页,onResume之后继续自动翻页),并且提供多种翻页特效. 对比其他广告栏控件,大多都需要对源码进行改动才能加载网络图片,或者帮你集成不是你所需要的图片缓存库.而这个库能让有代码洁癖的你欢喜,不需要对库源码进行修改你就可以使用任何你喜欢的网络图片库进行配合.自定义你

超炫Android-ConvenientBanner轻松实现广告头效果

Android-ConvenientBanner通用的广告栏控件,让你轻松实现广告头效果.支持无限循环,可以设置自动翻页和时间(而且非常智能,手指触碰则暂停翻页,离开自动开始翻页.你也可以设置在界面onPause的时候不进行自动翻页,onResume之后继续自动翻页),并且提供多种翻页特效. 对比其他广告栏控件,大多都需要对源码进行改动才能加载网络图片,或者帮你集成不是你所需要的图片缓存库.而这个库能让有代码洁癖的你欢喜,不需要对库源码进行修改你就可以使用任何你喜欢的网络图片库进行配合.自定义你

关于自定义控件在布局文件中使用时提示error: Error parsing XML: not well-formed (invalid token)错误的问题

今天在尝试自定义一个控件后,在布局文件中使用的时候报错 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" xmlns:carrey="http://schemas.android.com/apk/res/com.example.customview"

自定义控件--让背景颜色随ViewPager的滑动而渐变

转载请注明出处,谢谢~ 今天要说一个简单但不好想的效果实现.代码绝对简单,实现绝对easy,就是你可能想不到而已. 不多说,上效果图.第一个效果是仿最美应用的滑动颜色变化,第二个是我项目中要用的效果,实现后我就贴出来了,开源嘛. 下面分别说说这两个实现的原理和想法. 首先我们看纯色的第一张gif,纯色的渐变还是容易一些的. 1.实现一个ViewPager,因为我们要实现的是,随着手指的移动,viewpager的背景色改变,所以暂时的想法是,不需要自定义viewpager. 2.给背景设置一个纯色

【C#】妈妈再也不用担心自定义控件如何给特殊类型的属性添加默认值了,附自定义GroupBox一枚

标题有点那啥,但确实能表达我掌握此法后的心情. 写自定义控件时往往会有一个需求,就是给属性指定一个默认值(就是可以在VS中右键该属性→重置),如果该属性的类型是内置值类型还好,直接使用DefaultValue特性就好,例如: [DefaultValue(false)] public bool CanSelect { get; set; } 对于能够根据字符串常量转换得到的类型也还好,可以这样: [DefaultValue(typeof(Font), "宋体, 9pt")] public

ASP.NET利用XML实现旗帜广告和Jquery制作旗帜广告。

一.编写ad.xml,将其放入add_Data中(放在Add_Data中的理由:1.使该XML文件在ASP.NET运行时自动获得对其的读取权限.同时可以防止在浏览器中被查看): <?xml version="1.0" encoding="utf-8"?><Advertisements><Ad> <ImageUrl>要显示图片的链接</ImageUrl> <NavigateUrl>点击图片是指向的

Android自定义控件5--轮播图广告ViewPager基本实现

本文地址:http://www.cnblogs.com/wuyudong/p/5918021.html,转载请注明源地址. 本文开始实现轮播图广告系列,这篇文章首先实现让图片滑动起来(ViewPager),效果如下: 首先实现布局 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools&

[移动开发] Android自定义控件系列六:自定义ViewGroup(一)实现ViewPager效果

今天我们开始新的Android自定组件旅程,下面一个内容是如何自定义一个ViewGoup,之前我们已经通过几篇博文已经了解了自定义view的基本写法,如果有不了解的同学,可以参看下面专栏中的文章:Android自定义控件. 这次同样也是通过一个例子来说明要如何自定义一个ViewGroup,最终目标就是要实现一个类ViewPager功能的ViewGroup. 我们先来看看最终效果: 对于系统的ViewGroup我们已经是十分熟悉了,最常用的LinearLayout和RelativeLayout几乎