viewpager实现自动滑动以及手势滑动功能
2015-11-08 21:36
288 查看
今天在做项目的时候,有一个viewpgaer展示图片的页面,第一反应是去网上查找,后来看了好多文章,其实也就是那么两三篇文章,其他的都是转载来转载去的,主要就是运用线程来进行无限循环进行实现的操作,个人感觉并不需要运用到线程,尤其是你写了死循环后,线程的回收就是个问题,所以就寻思着自己实现功能好了。
先看效果图吧:
实现思路:
在项目里比较重要的两个东西,一个是handler的使用,一个是监听viewpager的触摸事件,具体的思路是设定一个bool值来监听是否触摸viewpager,我们都知道你如果手动滑动,肯定是要触摸的,我们在触摸的时候把isTouch设定为true,这时候我们手动的把handler里面的消息全部清除掉,当action_up的时候,我们在重新向handler里面发送信息,在handler中进行自动滑动的操作,自动滑动的时间间隔是3秒,最后代码如下:
hanlder类
viewpager的触摸事件
全部代码:
先看效果图吧:
实现思路:
在项目里比较重要的两个东西,一个是handler的使用,一个是监听viewpager的触摸事件,具体的思路是设定一个bool值来监听是否触摸viewpager,我们都知道你如果手动滑动,肯定是要触摸的,我们在触摸的时候把isTouch设定为true,这时候我们手动的把handler里面的消息全部清除掉,当action_up的时候,我们在重新向handler里面发送信息,在handler中进行自动滑动的操作,自动滑动的时间间隔是3秒,最后代码如下:
hanlder类
handler=new Handler(){ @Override public void handleMessage(Message msg) { //自动循环 if (!isTouch) { int item=msg.what; if (item==2) { viewPager.setCurrentItem(item); item=0; handler.sendEmptyMessageDelayed(item, 3000); }else { viewPager.setCurrentItem(item); item++; handler.sendEmptyMessageDelayed(item, 3000); } } } }; //发送第一个自动更换的信息 handler.sendEmptyMessageDelayed(1, 3000);
viewpager的触摸事件
viewPager.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View view, MotionEvent motionEvent) { int action = motionEvent.getAction(); switch (action) { case MotionEvent.ACTION_DOWN: //这里的操作很重要 //从消息队列中移除所有message handler.removeMessages(1); handler.removeMessages(2); handler.removeMessages(0); isTouch = true; break; case MotionEvent.ACTION_UP: isTouch = false; //重新发送 handler.sendEmptyMessageDelayed(viewPager.getCurrentItem(), 3000); break; } return false; } });
//初始化viewpager private void initViewPager(final View view) { viewPager = (ViewPager) view.findViewById(R.id.viewpager); mainPagerAdapter = new MainPagerAdapter(imageList); viewPager.setAdapter(mainPagerAdapter); viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { dotsView.get(position).setBackgroundResource(R.drawable.blue_circle); dotsView.get(oldposition).setBackgroundResource(R.drawable.white_circle); oldposition = position; currentPostion = position; } @Override public void onPageScrollStateChanged(int state) { } });
全部代码:
//初始化viewpager
private void initViewPager(final View view) {
viewPager = (ViewPager) view.findViewById(R.id.viewpager);
mainPagerAdapter = new MainPagerAdapter(imageList);
viewPager.setAdapter(mainPagerAdapter);
viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
dotsView.get(position).setBackgroundResource(R.drawable.blue_circle);
dotsView.get(oldposition).setBackgroundResource(R.drawable.white_circle);
oldposition = position;
currentPostion = position;
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
viewPager.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
int action = motionEvent.getAction();
switch (action) {
case MotionEvent.ACTION_DOWN:
case MotionEvent.ACTION_MOVE:
//从消息队列中移除所有message
handler.removeMessages(1);
handler.removeMessages(2);
handler.removeMessages(0);
isTouch = true;
break;
case MotionEvent.ACTION_UP:
isTouch = false;
//重新发送
handler.sendEmptyMessageDelayed(currentPostion, 3000);
break;
}
return false;
}
});
MainActivity.menu.addIgnoredView(viewPager);
handler=new Handler(){ @Override public void handleMessage(Message msg) { //自动循环 if (!isTouch) { int item=msg.what; if (item==2) { viewPager.setCurrentItem(item); item=0; handler.sendEmptyMessageDelayed(item, 3000); }else { viewPager.setCurrentItem(item); item++; handler.sendEmptyMessageDelayed(item, 3000); } } } }; //发送第一个自动更换的信息 handler.sendEmptyMessageDelayed(1, 3000);
}
相关文章推荐
- 用户故事
- 需求工程-软件需求模式读书笔记1
- JVM系列四:生产环境参数实例及分析【生产环境实例增加中】
- JAVA学习笔记(33-53)
- Generative classfiers And Discrimivative
- HTTP长连接和短连接
- [leetcode] 219 Contains Duplicate II(map)
- 文件系统
- 1.Unity脚本生命周期
- lenovo E450触摸板关闭方法
- 信息安全系统设计基础第八周学习总结
- C语言实现链表之单向链表(十二)判断链表是否为空和获取链表长度
- 从问题到程序
- github免密码设置
- mybatis_generator 自动化生成实体及mapper
- 数据结构之最小生成树 Kruskal算法
- 信息安全设计基础系统第九周学习总结
- JVM系列三:JVM参数设置、分析
- JVM系列二:GC策略&内存申请、对象衰老
- 博客地址变更