<span style="font-family: Arial, Helvetica, sans-serif;">
</span>
简单想一下,viewpager + handler(或者thread之类的线程)。无限轮播,解决了播放到最后,重复跳到第一页。有几点要注意
一、首先看pagerAdapter的四个函数
<span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:14px;">public MyAdapter(List<ImageView> pisc, String[] titles) {</span></span>
<span style="font-size:14px;"> this.pics = pisc;
this.titles = titles;
}
@Override
public int getCount() {
if (pics != null) {
return Integer.MAX_VALUE; // <span style="color: rgb(0, 153, 0);">返回一个没有边界的数值,用于无限轮播</span>
}
return 0;
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view == object;
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
if (position < 0) {
position = pics.size() + position;
}
View iv = pics.get(position % pics.size());
ViewGroup parent = (ViewGroup) iv.getParent();
if (parent != null) {
parent.removeView(iv); // <span style="color: rgb(0, 153, 0);">这里容易出错,稍稍处理了一下</span>
}
container.addView(iv);
return iv;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView(pics.get(position % pics.size()));
}</span>
二、设置viewpager
<span style="white-space:pre"> </span><span style="font-size:14px;">arrayList = new int[]{R.mipmap.a, b, R.mipmap.c};</span>
<span style="font-size:14px;">
for (int i = 0; i < arrayList.length; i++) {
ImageView iv = new ImageView(this);
iv.setScaleType(ImageView.ScaleType.FIT_XY);
iv.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 200));
iv.setImageResource(arrayList[i]);
pics.add(iv);</span>
<span style="font-size:14px;">
</span>
<span style="font-size:14px;"><span style="white-space:pre"> </span> //以下是处理 指示器的小圆点,代码会在底部给出</span>
<span style="font-size:14px;"> View pointView = new View(this);
pointView.setBackgroundResource(R.drawable.point_selector);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(15, 15);
params.leftMargin = 5;
pointView.setLayoutParams(params);
pointView.setEnabled(false);
ll.addView(pointView);
}
vp.setAdapter(new MyAdapter(pics, titles));
currentPos = Integer.MAX_VALUE / 2 + (Integer.MAX_VALUE / 2 % pics.size()); <span style="color:#009900;">//为了轮播图能够平稳的过度,让轮播图可以左右滑动。 </span></span>
<span style="font-size:14px;"><span style="color:#009900;"><span style="white-space:pre"> </span>// 这里如果位置不对可试试 减号。</span>
vp.setCurrentItem(currentPos);
ll.getChildAt(0).setEnabled(true);
cirPicHandler.sendEmptyMessageDelayed(MSG_UPDATE, MSG_DELAY); // 开始发送消息轮播</span>
<span style="font-size:14px;">public Handler cirPicHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case MSG_UPDATE: // 更新
currentPos++;
vp.setCurrentItem(currentPos);
cirPicHandler.sendEmptyMessageDelayed(MSG_UPDATE, MSG_DELAY);
break;
case MSG_STOP://停止
break;
case MSG_RESUME://重新开始
cirPicHandler.sendEmptyMessageDelayed(MSG_UPDATE, MSG_DELAY);
break;
case MSG_PAGE://记录当前的位置
currentPos = msg.arg1;
break;
}
}
};</span>
四、viewpager的事件处理
<span style="font-size:14px;">vp.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
ll.getChildAt((position - 1) % arrayList.length).setEnabled(false);//回复上一点
ll.getChildAt(position % arrayList.length).setEnabled(true); //选中当前点
cirPicHandler.sendMessage(Message.obtain(cirPicHandler, MSG_PAGE,position,0));
}
@Override
public void onPageScrollStateChanged(int state) {
switch (state) {
case ViewPager.SCROLL_STATE_DRAGGING:
cirPicHandler.sendEmptyMessage(MSG_STOP); //拖动的时候 什么也不处理
break;
case ViewPager.SCROLL_STATE_IDLE:
break;
}
}
});</span>
五、小圆点的绘制
1.point_enable
<span style="font-size:14px;"><shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<size
android:width="10dp"
android:height="10dp" />
<solid android:color="#88ffffff" />
<padding android:left="2dp"/>
</shape></span>
2.point_normal
<span style="font-size:14px;"><shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<size android:height="10dp"
android:width="10dp"/>
<corners android:radius="5dp"/>
<solid android:color="#33000000"/>
</shape></span>
3.写一个selector:point_selector
<span style="font-size:14px;"><selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_enabled="false" android:drawable="@drawable/points_normal"/>
<item android:state_enabled="true" android:drawable="@drawable/point_enable"/>
</selector></span>
至此全部的内容完毕,个人觉得处理时不会让用Integer.MAX_VALUE这个属性,怎么让轮播如左右都可以滑动。