效果图
整体
自定义提示性圆点的样式
point_bg_enable.xml(启用时的样式---灰色圆点)
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<!--启用时的 圆点 -->
<!--corners为圆角,radius为角的弧度 -->
<corners android:radius="0.5dp"/>
<!-- 实体,以#AAFFFFFF颜色填充 -->
<solid android:color="#AAFFFFFF"/>"
</shape>
point_bg_normal.xml(未
启用时的样式---白色圆点)
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<!--未启用时的 圆点 -->
<!--corners为圆角,radius为角的弧度 -->
<corners android:radius="0.5dp"/>
<!-- 试题,以#AAFFFFFF颜色填充 -->
<solid android:color="#55000000"/>
</shape>
point.xml(圆点的效果)
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
<!-- android:state_enabled 能够接受触摸或者点击事件,未点击和点击时的控件背景 -->
<item android:drawable="@drawable/point_bg_enable" android:state_enabled="true"></item>
<item android:drawable="@drawable/point_bg_normal" android:state_enabled="false"></item>
</selector>
activity_main.xml
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<android.support.v4.view.ViewPager
android:id="@+id/viewpager"
android:layout_width="match_parent"
android:layout_height="200dp" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignBottom="@id/viewpager"
android:background="#33000000"
android:orientation="vertical"
android:padding="5dp" >
<TextView
android:id="@+id/tv_image_description"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="图片下方的文字描述"
android:textColor="@android:color/white" />
<LinearLayout
android:id="@+id/ll_point_group"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="5dp"
android:orientation="horizontal" >
</LinearLayout>
</LinearLayout>
</LinearLayout>
MainActivity
package com.example.viewpagerdemo;
import java.util.ArrayList;
import java.util.List;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.support.v7.app.ActionBarActivity;
import android.app.Activity;
import android.os.Bundle;
import android.os.SystemClock;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.LinearLayout.LayoutParams;
public class MainActivity extends Activity {
private List<ImageView> mImageList;
//图片描述的字符串数组
private String[] imageDescriptionArray={
"可爱的萨摩耶", //
"扑树又回来啦!再唱经典老歌引万人大合唱", //
"揭秘北京电影如何升级", //
"乐视网TV版大派送", //
"热血屌丝的反杀" };
//记录上一次点的位置,默认为0
private int previousPointEnale = 0;
//动态播放图片的控件
private ViewPager myViewPager;
//图片下方提示性点点控件
private LinearLayout IIPointGroup;
private TextView tvDescription;
//记录是否停止播放
private boolean isStop=false;
ImageView mImageView;
LayoutParams params;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//初始化数据
init();
}
private void init() {
initControl();
inEvent();
initBanners();
}
private void initControl() {
mImageList = new ArrayList<ImageView>();
myViewPager=(ViewPager)findViewById(R.id.viewpager);
tvDescription=(TextView)findViewById(R.id.tv_image_description);
IIPointGroup=(LinearLayout)findViewById(R.id.ll_point_group);
}
private void inEvent() {
//初始化图片数组
int ImageIds[]={R.drawable.a,R.drawable.b,R.drawable.c,R.drawable.d,R.drawable.e};
//初始化广告资源
for(int id:ImageIds){
mImageView=new ImageView(this);
mImageView.setBackgroundResource(id);
mImageList.add(mImageView);
//初始化图片下方的提示性点点
View dot=new View (this);
dot.setBackgroundResource(R.drawable.point);
params=new LayoutParams(5,5);
params.leftMargin=10;
dot.setLayoutParams(params);
dot.setEnabled(false);
IIPointGroup.addView(dot);
};
myViewPager.setAdapter(new MyAdapter());
// 设置广告标语和底部“点”选择状态
tvDescription.setText(imageDescriptionArray[0]);
IIPointGroup.getChildAt(0).setEnabled(true);
// 设置广告条跳转时,广告语和状态语的变化
myViewPager.setOnPageChangeListener(new MyListener());
// 初始化广告条,当前索引Integer.MAX_VALUE的一半
int index = (Integer.MAX_VALUE / 2) - (Integer.MAX_VALUE / 2 % mImageList.size());
myViewPager.setCurrentItem(index); // 设置当前选中的Page,会触发onPageChangListener.onPageSelected方法
}
// ViewPager数据适配器
private class MyAdapter extends PagerAdapter {
@Override
public int getCount() {
// 将viewpager页数设置成Integer.MAX_VALUE,可以模拟无限循环
return Integer.MAX_VALUE;
}
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
// 复用对象 true 复用view false 复用的是Object
return arg0==arg1;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
//销毁对象,销毁索引的位置
container.removeView(mImageList.get(position % mImageList.size()));
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
//初始化一个对象, 初始化对象的索引位置
container.addView(mImageList.get(position % mImageList.size()));
return mImageList.get(position % mImageList.size());
}
}
private class MyListener implements OnPageChangeListener {
@Override
public void onPageScrollStateChanged(int arg0) {
// TODO Auto-generated method stub
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
// TODO Auto-generated method stub
}
@Override
public void onPageSelected(int arg0) {
// 获取新的位置
int newPosition = arg0 % imageDescriptionArray.length;
// 设置广告标语
tvDescription.setText(imageDescriptionArray[newPosition]);
// 消除上一次的状态点
IIPointGroup.getChildAt(previousPointEnale).setEnabled(false);
// 设置当前的状态点“点”
IIPointGroup.getChildAt(newPosition).setEnabled(true);
// 记录位置
previousPointEnale = newPosition;
}
}
private void initBanners() {
// 开启子线程,让广告条以2秒的频率循环播放
new Thread(new Runnable() {
@Override
public void run() {
while (!isStop) {
SystemClock.sleep(2000);
runOnUiThread(new Runnable() {
public void run() {
myViewPager.setCurrentItem(myViewPager.getCurrentItem() + 1);
}
});
}
}
}).start();
}
@Override
protected void onDestroy() {
// activity销毁时候,关闭循环播放
isStop = true;
super.onDestroy();
}
}