xml中插入以下代码,轮播指示器和提示文本样式可以根据需求修改
<FrameLayout
android:layout_width="match_parent"
android:layout_height="@dimen/dimen_190_dp">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<android.support.v4.view.ViewPager
android:id="@+id/viewpager"
android:layout_width="match_parent"
android:layout_height="@dimen/dimen_190_dp">
</android.support.v4.view.ViewPager>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="@dimen/dimen_40_dp"
android:layout_alignParentBottom="true"
android:background="#b4000000"
android:orientation="horizontal">
<TextView
android:id="@+id/tv_pager_pic_title"
android:layout_width="270dp"
android:layout_height="match_parent"
android:ellipsize="end"
android:gravity="center|left"
android:maxLines="1"
android:paddingLeft="@dimen/dimen_20_dp"
android:text=""
android:textColor="#ffffff"
android:textSize="@dimen/dimen_16_dp" />
<LinearLayout
android:id="@+id/dotcontaint"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="3"
android:gravity="center|right"
android:orientation="horizontal"></LinearLayout>
</LinearLayout>
</RelativeLayout>
</FrameLayout>
全局变量
private ArrayList<View> toviewList;
private boolean isFirst = true;
private ArrayList<View> dots;
private int currentIndex = 0;
protected Timer timer;
activity中UI线程添加加载轮播图线程
toviewList = new ArrayList<View>();//view数组
ViewpagerThread viewpagerThread = new ViewpagerThread();
viewpagerThread.start();
加载轮播图线程
private class ViewpagerThread extends Thread {
@Override
public void run() {
int x = 0;
while (x < 4) { //加载图片数量,按需加载
Bitmap bitmap = null;
try {
bitmap = Picasso.with(getActivity()).load(newschanListModel.getLink() + newschanListModel.getData().getList().get(x).getPicUrl()).get(); //此处图片获取
} catch (IOException e) {
e.printStackTrace();
}
View view = new View(getActivity());
view.setLayoutParams(viewpager.getLayoutParams());
view.setBackground(new BitmapDrawable(getResources(), bitmap));
toviewList.add(view);
x++;
}
Message msg = new Message();
msg.what = 0x111;
handler.sendMessage(msg);
super.run();
}
}
定义handler中添加以下代码
Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case 0x111:
if (isFirst) {
if (toviewList.size() < 1) {
return;
}
getDotList(toviewList.size());
Log.i("anzhen", "dots:" + dots.size());
dots.get(0).setBackgroundResource(R.drawable.dot_focus);
viewpager.setAdapter(new ImageAdapter(toviewList));
timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
currentIndex = viewpager.getCurrentItem() + 1;//下一个页
handler.sendEmptyMessage(0x123);//在此线程中,不能操作ui主线程
}
}, 5000, 5000);
viewpager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
//切换选中的圆点
for (int i = 0; i < toviewList.size(); i++) {
dots.get(i).setBackgroundResource(R.drawable.dot_nomal);//设置上次选中的圆点为不选中
}
dots.get(position % toviewList.size()).setBackgroundResource(R.drawable.dot_focus);//设置当前选中的圆点为选中
tvPagerPicTitle.setText(newschanListModel.getData().getList().get(position % toviewList.size()).getTitle());
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
isFirst = false;
}
break;
case 0x123:
Log.i("anzhen", "currentIndex:" + currentIndex);
viewpager.setCurrentItem(currentIndex);//设置此次要显示的pager
tvPagerPicTitle.setText(newschanListModel.getData().getList().get(currentIndex % 4).getTitle()); //此处为设置提示文本,没有可以不加
break;
}
}
};
备注:在onDestroy()中取消时钟,由于不确定时钟是否存在,使用try包裹
try {
timer.cancel();
} catch (Exception e) {
e.printStackTrace();
}
定义一个getDotList方法来生成滚动图导航器
private void getDotList(int length) {
// TODO Auto-generated method stub
dots = new ArrayList<View>();
//循环图片数组,创建对应数量的dot
for (int i = 0; i < length; i++) {
View view = LayoutInflater.from(getActivity()).inflate(R.layout.dot_layout, null);//加载布局
View dot = view.findViewById(R.id.dotView);//得到布局中的dot点组件
//收集dot
dots.add(dot);
//把布局添加到线性布局
dotcontaint.addView(view);
}
}
dot_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<View
android:id="@+id/dotView"
android:layout_width="8dp"
android:layout_height="8dp"
android:layout_margin="5dp"
android:background="@drawable/dot_nomal"
/>
</LinearLayout>
dot_nomal.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
<solid android:color="#c2c1c1"/>
<corners android:radius="8dip"/>
</shape>
工具类ImageAdapter
public class ImageAdapter extends PagerAdapter {
private ArrayList<View> viewlist;
public ImageAdapter(ArrayList<View> viewlist) {
this.viewlist = viewlist;
}
@Override
public int getCount() {
//设置成最大,使用户看不到边界
return Integer.MAX_VALUE;
}
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
return arg0 == arg1;
}
@Override
public void destroyItem(ViewGroup container, int position,
Object object) {
//Warning:不要在这里调用removeView
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
//对ViewPager页号求模取出View列表中要显示的项
position %= viewlist.size();
if (position < 0) {
position = viewlist.size() + position;
}
View view = viewlist.get(position);
//如果View已经在之前添加到了一个父组件,则必须先remove,否则会抛出IllegalStateException。
ViewParent vp = view.getParent();
if (vp != null) {
ViewGroup parent = (ViewGroup) vp;
parent.removeView(view);
}
container.addView(view);
//add listeners here if necessary
return view;
}
}