常见滑动事件冲突情况分析及解决

来源:互联网 发布:js对象数组按属性排序 编辑:程序博客网 时间:2024/06/18 17:53

常见滑动事件冲突情况分析及解决


转载请注明出处
http://blog.csdn.net/jsmeli/article/details/73248836
本文源于:http://blog.csdn.net/jsmeli


一、百度地图嵌入可滑动页面产生的冲突问题



1.概述


最近出一个需求,首页改版成一个地图,让用户在地图中操作查看房源数据,能看到距离,比较有直观的概念,我们选择了百度地图来完成这个需求,那么久开发进入开发了,那么嵌入的时候问题来了,相信很多人用了镶嵌型的百度地图都会有滑动冲突的问题,那么如何解决呢?


2.问题分析


其实最根本的问题在与事件冲突,也就恶心人的事件分发造成的,如果事件在上层消费后无法分发到下层,知道原因后处理起来其实也就有思路了,就是需要拦截这个滑动事件的出发,用户如果在MapView中滑动就需要让MapView来消费当前滑动事件,这样就能合理的控制滑动了(当然主界面是用ViewPager实现的)


3.问题解决


解决思路简单点说就是屏蔽ViewPager在MapView区域的滑动事件,那么怎么知道当前滑动区域在MapView区域呢?下面就来一波农药了,因为百度地图这个View名称的特殊性,我们就可以简单点来完成这个功能了,在滑动事件中比较名称即可。


4.代码送上

public class MyViewPager extends ViewPager{    public MyViewPager(Context context) {        super(context);    }    public MyViewPager(Context context, AttributeSet attrs) {        super(context, attrs);    }    @Override    protected boolean canScroll(View v, boolean checkV, int dx, int x, int y) {        //比较view名称,如果是MapView,将滑动事件交给MapView消费        if(v.getClass().getName().equals("com.baidu.mapapi.map.MapView")) {            return true;        }        return super.canScroll(v, checkV, dx, x, y);    }}

解释一波吧,自定义下ViewPager,重写ViewPager的canScroll方法,在该方法中做滑动判断,如果滑动区域是MapView,那么就将该事件给MapView去消费,否则,正常处理,这样就能够很好的解决这个冲突了。举一反三,以后碰到类似的冲突也是能够使用该方法来解决的,毕竟原理是事件分发。


二、EditText在ScrollView中产生的滑动冲突



1.概述


需求是在ScrollView中添加EditText,并且该EditText输入内容超过时候可以滑动,这样就会出现ScrollView的滑动与EditText的滑动产生冲突,这样就需要我们对这个滑动事件进行相应的处理才能做到不会产生冲突,那么我们首先想到了上面百度地图的解决办法,当然是适用的,只不过该View比较普遍,所以需要你自己自定义个特殊的EditText才能使用。


2.问题分析


其实实质性问题还是在于滑动事件的冲突,解决方法有各种各样,我们的目的就是找最简单的办法来解决才是我们屌丝程序员关心的,其实这个解决方法大致有三种思路去完成,第一种就是上面说的,第二种重写dispatch然后拦截事件,第三种就是我们说的重点了,通过EditText的id的来判定。


3.问题解决


解决思路,在onTouchListener中能够定位这个EditText趋于范围其实就可以做我们想要做的操作,那么就主要就是我们如何来进行比对定位,这个就可以通过id来进行判定。


4.代码送上

//EditText的滑动事件屏蔽EditText editText = (EditText)findViewById(R.id.edittext);editText.setOnTouchListener(new View.OnTouchListener() {    @Override    public boolean onTouch(View view, MotionEvent event) {        //通过Id的方式定位滑动区域        if (view.getId() == R.id.edittext) {            view.getParent().requestDisallowInterceptTouchEvent(true);            switch (event.getAction()&MotionEvent.ACTION_MASK){                case MotionEvent.ACTION_UP:                    view.getParent().requestDisallowInterceptTouchEvent(false);                    break;            }        }        return false;    }});

最后,推荐个第三方:https://github.com/jsmeli/PermissionCheck
ps:关于Android6.0权限检查
联系邮箱:jsmeli@163.com

阅读全文
1 0