android 可滑动组件互相嵌套时滑动冲突解决方案总结

来源:互联网 发布:软件工资 编辑:程序博客网 时间:2024/05/23 23:15

参考文章:

http://www.jianshu.com/p/87a41b8c0dd0

http://www.jianshu.com/p/8bc0765dffc9


  强烈推荐使用以上两篇文章的方法。

         以下是我个人在项目中的解决方案,比较LOW,现在不建议使用,但可作为一种知识参考。

         本人自己以前都是重写ScrollView,ListView,在onTouch方法中判断触点落在谁身上,然后把时间传给谁。具体代码,以ScrollView嵌套ViewPager为例:


public class MaintainArchScrollView extends ScrollView {public MaintainArchScrollView(Context context) {super(context);}public MaintainArchScrollView(Context context, AttributeSet attrs) {super(context, attrs);}public MaintainArchScrollView(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);}@Overridepublic boolean onInterceptTouchEvent(MotionEvent ev) {// 判断触摸事件是否落在XListView上,如果是则不让// ScrollView滑动,以免影响XListView的滑动xLV = (XListView) findViewById(R.id.maintain_archives_lv);if (isTouchOnLv(ev)&&xLV.isCanPullDownOnTop()&&xLV.isCanPullUpOnbottom()) {return false;}//return super.onInterceptTouchEvent(ev);}private boolean isTouchOnWheelMenu(MotionEvent ev) {// 判断触摸事件是否落在WheelMenu上,如果是则不让// ScrollView滑动,以免影响WheelMenu的手动滑动PieChartView vp = (PieChartView) findViewById(R.id.maintain_archives_wheelMenu);if (vp == null)return false;int w = vp.getHeight();int[] xy = new int[2];float rawY = ev.getRawY();vp.getLocationInWindow(xy);return rawY >= xy[1] && rawY <= (xy[1]) + w;}private XListView xLV;private boolean isTouchOnLv(MotionEvent ev) {if (xLV == null)return false;int w = xLV.getHeight();int[] xy = new int[2];float rawY = ev.getRawY();xLV.getLocationInWindow(xy);return rawY >= xy[1] && rawY <= (xy[1]) + w;}


0 0
原创粉丝点击