mHandler = new Handler(){
@Override
public void handleMessage(Message msg){
if(msg.what == MOVE_TO_NEXT){
int item = viewPager.getCurrentItem();
if(++item >= myPageAdapter.getCount()){
item =0;
}
viewPager.setCurrentItem(item);
mHandler.sendEmptyMessageDelayed(MOVE_TO_NEXT,3000);//不断发送实现自动化
}
}
};
viewPager = view.findViewById(R.id.loop_image);
myPageAdapter = new MyPageAdapter(pageList);
viewPager.setAdapter(myPageAdapter);
viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
}
@Override
public void onPageScrollStateChanged(int state) {
if (state == ViewPager.SCROLL_STATE_IDLE && mDragging) {
mHandler.sendEmptyMessageDelayed(MOVE_TO_NEXT, 3000);
mDragging = false;
} else if (state == ViewPager.SCROLL_STATE_DRAGGING){
mHandler.removeMessages(MOVE_TO_NEXT);
mDragging = true;
}
}
});
mHandler.sendEmptyMessageDelayed(MOVE_TO_NEXT,3000);
public class MyPageAdapter extends PagerAdapter {
private ArrayList<View> pageList;
public MyPageAdapter(ArrayList pageList){
this.pageList = pageList;
}
@Override
public Object instantiateItem(ViewGroup container, int position){
View view;
if(position==0){
view = pageList.get(pageList.size()-1);
}else if(position == pageList.size()){
view = pageList.get(0);
}else{
view = pageList.get(position-1);
}
try{
container.addView(view);
}catch (Exception e){
}
return view;
}
@Override
public int getCount() {
return pageList.size();
}
@Override
public void destroyItem(ViewGroup container, int position , Object object){
}
@Override
public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
return view == object;
}
}
以上是三个代码块,接下来是感想
第一块是handler,那个异步消息处理机制,第二块是处理模块,第三块是适配器模块,一一来吧。
-
handler
在这里要处理自动播放的逻辑,通过viewPager.getCurrentItem()函数得到当前播放的图片在图片列表的排号,通过++item后的item和getCount得到的图片长度比较的方法判断当前图片是否是最后一张,如果是,把下张要播放的图片换成第一张,否则播放第++item张 -
逻辑模块
在这里要实现监听器和适配器,首先找到xml文件中的viewpager,再通过setAdapter设置适配器,添加好适配器后再设置监听器,onPageScrollStateChanged用来判断是向左还是向右滑动,SCROLL_STATE_IDLE,如果当前图片处于运动状态,就3s发送一次。
SCROLL_STATE_DRAGGING,如果当前图片处于被拖动状态,就把message去掉,改变mDragging,再在下张图设置message,避免在拖动图片的时候还在自动播放,这里可以实现用手拖动图片的效果,mDragging的用处在于实现用手拖动图片后继续自动轮播图片。如果没有这个mDragging的话,图片切换速度会比3000ms快2倍左右,因为messagequeue里有太多MOVE_TO_NEXT。 -
适配器
instantiateItem是预加载,下一张或者上一张图片,再通过isviewfromproject把图传出去。。
萌新想到的就是这些,日后有新感想还会更新