Android学习(41) -- 自定义控件(5)图片轮播(伪循环)
2016-04-24 08:12
483 查看
右滑轮播问题解决
我使用ViewPager进行图片轮播时候,发现当到了开头或末尾不能再继续了,此时是因为PagerAdapter中的getCount方法进行了限定,明确了具体的数量,当到达数量的时候的,就不在进行调用instantiateItem方法了。如果想改变的话我们可以将getCount中返回值设置为最大值即可,即:Integer.MAX_VALUE。public int getCount() { return Integer.MAX_VALUE; }
我们还需要在instantiateItem和 updateIntroAndDot中
在获取位置处进行取模操作 % list.size()
@Override public Object instantiateItem(ViewGroup container, int position) { //将广告布局添加进来 View view = View.inflate(MainActivity.this, R.layout.adapter_ad, null); //获取到布局中ImageView ImageView imageView = (ImageView) view.findViewById(R.id.img); //获取到集合中指定的AD数据 Ad ad = list.get(position % list.size()); //将图片设置到ImageView 上 imageView.setImageResource(ad.getResId()); //一定不能少,将view加入到viewPager中 container.addView(view); return view; }
private void updateIntroAndDot() { //获取到当前第几页 int currentPage = viewPage.getCurrentItem() % list.size(); //设置文本信息 tv.setText(list.get(currentPage).getIntro()); for (int i = 0; i < lay_dot.getChildCount(); i++) { lay_dot.getChildAt(i).setEnabled(i == currentPage); } }
左滑轮播问题解决
但是我们会发现当在第一个的时候向左滑动是有问题的,我们需要解决这个问题1、我们需要在initData中设置 当前的item
2、我们发现Integer.MAX_VALUE/2; //正好在中间的位置
3、currentItem % list.size();能够获取到和第一个位置0的差值
4、用2中的值减去3中的差值 作为参数传递到instantiateItem方法中去的时候再 % list.size();就是0
/** * 初始化数据 */ private void initData() { list.add(new Ad(R.drawable.a, "不低俗,不能低俗")); list.add(new Ad(R.drawable.b, "回来了,再唱经典老歌引百万人同唱啊")); list.add(new Ad(R.drawable.c, "电影如何升级")); list.add(new Ad(R.drawable.d, "TV版大放送")); list.add(new Ad(R.drawable.e, "热血的反杀")); initDot(); tv.setText(list.get(0).getIntro()); //绑定Adapter viewPage.setAdapter(new MyPagerAdapter()); //当第一屏的时候 解决向左滑动问题 int currentItem = Integer.MAX_VALUE/2; //正好在中间的位置 int value = currentItem % list.size(); viewPage.setCurrentItem(currentItem - value); //更新数据 updateIntroAndDot(); }
最后我们实现自动播放
在initData()中添加 延迟操作 ,也就是说第一个图片的时候 发送一个空消息 延迟操作到handler中去hand.sendEmptyMessageDelayed(0, 4000);
定义Handler进行操作,在handler中接收消息后,让当前的item增加1,然后自己再给自己发送空消息,形成循环,即可成为自动播放
Handler hand = new Handler(){ @Override public void handleMessage(Message msg) { viewPage.setCurrentItem(viewPage.getCurrentItem()+1); hand.sendEmptyMessageDelayed(0, 4000); } };
触发触摸事件
在initData中进行处理//暂停 viewPage.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: //清除所有的callback 和 message hand.removeCallbacksAndMessages(null); break; case MotionEvent.ACTION_UP: //继续轮播 hand.sendEmptyMessageDelayed(0, 4000); break; } return false; } });
相关文章推荐
- Android6.0中的权限
- ubuntu下Android平台的libcurl的编译测试
- Android布局优化include 、merge、ViewStub的应用
- Android Studio常用快捷键
- Android源码下载
- 团队项目-BUG排查-ADT工程 To Android Studio 一整天的排查日记
- Android Studio小常识
- Android开发新工具Android Studio相关知识
- Android Path,PathMeasure
- 开启自己的Android学习之路
- android sdk 如何重新生成debug.keystore
- Android的Drawable之BitmapDrawable
- Android Studio
- 开发艺术探索总结-activity的启动模式
- 开发艺术探索阅读总结(1.1)典型情况下的生命周期的分析
- Android Google Sample
- Android性能优化
- android studio学习---快捷键
- android 6.0 开发中 遇到权限授予方式变更的问题
- Android中View的绘制