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>
自定义控件实现广告头自动移动,viewpager的运用,和自己利用xml画图,自定义圆点,构造选择器的方法
原文:http://www.cnblogs.com/bokeofzp/p/4764719.html