android中轮播图实现方法


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;

}

}