android自定义ViewPager之——处理与ScrollView的事件冲突
2014-10-23 20:29
471 查看
在我们平时的开发中一般是不推荐ScrollView中再嵌套ListView,ViewPager等其他可滑动组件的(至少Google是不推荐我们这样做的),但是为了实现一些特殊的需求,我们又不得不这样做,像一些知名的APP都有这样的先例,那他们是怎么做到的呢.
最近由于项目需要,需要展示公司所有的产品目录,一级目录只有27个,可美工为了视觉的美观,将27个一级目录分为了三个组,每组中又有三屏可以滑动,为了这个需求,就不得不在ScrollView中嵌套ViewPager了,我目前只有这个思路,等我将界面绘制出来后,发现ViewPager几乎是滑不动的,要想滑起来特别困难,这样的用户体验太差了,第一时间想到了事件冲突,ScrollView拦截到事件后要处理,就导致ViewPager滑起来非常的吃力,上网查阅后也没有相关的现成的方法,只好自己苦想了.
有了需求以后,我们就着手开始编写程序了,下面是我对ViewPager的一个重写:
先看下效果图:
这样就会有即上下滑动又左右滑动的情况出现
最近由于项目需要,需要展示公司所有的产品目录,一级目录只有27个,可美工为了视觉的美观,将27个一级目录分为了三个组,每组中又有三屏可以滑动,为了这个需求,就不得不在ScrollView中嵌套ViewPager了,我目前只有这个思路,等我将界面绘制出来后,发现ViewPager几乎是滑不动的,要想滑起来特别困难,这样的用户体验太差了,第一时间想到了事件冲突,ScrollView拦截到事件后要处理,就导致ViewPager滑起来非常的吃力,上网查阅后也没有相关的现成的方法,只好自己苦想了.
有了需求以后,我们就着手开始编写程序了,下面是我对ViewPager的一个重写:
先看下效果图:
这样就会有即上下滑动又左右滑动的情况出现
public class HomeBannerViewPager extends ViewPager { private int timerIndex = 0; private int currentPositon = 0; private boolean flag = true; private float mLastMotionY; private float mLastMotionX; public HomeBannerViewPager(Context context) { super(context); } public HomeBannerViewPager(Context context, AttributeSet attrs) { super(context, attrs); } @Override public boolean dispatchTouchEvent(MotionEvent ev) { final float x = ev.getX(); final float y = ev.getY(); switch (ev.getAction()) { case MotionEvent.ACTION_DOWN: setPullToScrollViewStatus(true); flag = true; mLastMotionX = x; mLastMotionY = y; mHandler.sendEmptyMessage(1); break; case MotionEvent.ACTION_MOVE: if (flag) { if (Math.abs(y - mLastMotionY) > Util.dip2px(20) && Math.abs(x - mLastMotionX) < Util.dip2px(5)) { flag = false; setPullToScrollViewStatus(false); } } break; case MotionEvent.ACTION_UP: setPullToScrollViewStatus(false); mHandler.sendEmptyMessage(0); break; case MotionEvent.ACTION_CANCEL: setPullToScrollViewStatus(false); mHandler.sendEmptyMessage(0); break; } return super.dispatchTouchEvent(ev); } @Override public boolean onInterceptTouchEvent(MotionEvent event) { return super.onInterceptTouchEvent(event); } @Override public boolean onTouchEvent(MotionEvent event) { return super.onTouchEvent(event); } /** * ������ҳ����ScrollView�ؼ���״̬�������Banner�����¼���ͻ * * @param disallowIntercept */ private void setPullToScrollViewStatus(boolean disallowIntercept) { getParent().getParent().getParent() .requestDisallowInterceptTouchEvent(disallowIntercept); }
相关文章推荐
- 【Android 事件处理】关于Android ViewPager中嵌套ScrollView的手势冲突
- Android中scrollview与webview冲突事件,viewpager同理!!!
- Android自定义ViewPager(二)——添加ScrollView,事件分发应用
- Android ViewPager和SlidingPaneLayout的滑动事件冲突处理方法
- Android自定义View—事件分发机制与滑动冲突处理(三)
- 从ListView与ScrollView的冲突调查android view的事件处理机制
- Android触摸事件传递机制及viewpager嵌套fragment冲突处理
- 从ListView与ScrollView的冲突调查android view的事件处理机制
- 【Android】viewpager嵌套4个带侧滑的listview 事件冲突处理解决方案,可动态设置是否可以侧滑
- Android进阶-多个ViewPager嵌套时事件传递的处理
- 处理ViewPager嵌套ViewPager的滑动事件冲突
- android 开发-ListView与ScrollView事件冲突处理(事件分发机制处理)
- 一次性学会处理Touch事件的冲突问题(listView/tabhost/viewpager)
- ScrollView中包含ViewPager是滑动事件冲突问题
- Android ScrollView与ViewPager滑动上下左右冲突
- [Android开发]使用ViewPagerIndicator开源库处理其中事件分发机制
- Android中Scrollview、ViewPager冲突问题汇总(已解决)