Android事件分发机制在实战开发中的应用之一

学习的最终目标就是要学以致用,本文所分享的案例都是自己在公司实战开发过程中的真实案例,现在把它分享出来,希望对初学者有所帮助

版权声明:本文来自门心叼龙的博客,属于原创内容,转载请注明出处:https://blog.csdn.net/geduo_83/article/details/90145083

github源码下载地址:https://github.com/geduo83/android-touch-event
Android事件分发机制的探索与发现之View篇
Android事件分发机制的探索与发现之ViewGroup篇
Android事件分发机制的探索与发现之Activity篇
Android事件分发机制的探索与发现之总结篇
Android事件分发机制在实战开发中的应用之一
Android事件分发机制在实战开发中的应用之二

通过对前面几篇文章的学习,我想现在大家对这块的知识已经有了一个比较全面理解和认识,就在上个周我在公司面试了两位android开发工程师,当然事件分发这么重要的问题也是必考题,有一位对View和ViewGroup对onTouchEvent方法调用父类同名方法时流程搞错了,另外一位对ViewGroup的dispatchTouchEvent和onTouchevent方法先后调用顺序搞不清楚,我问他们这块以前研究过没有?他们都说学习过,但是过一阵就忘记了,在自己实际工作中好像用不到这些知识,学了没有用,而导致对这块理解不深刻,而网上大部分文章也只是讲讲理论,所以我打算写几篇实战案例的文章,来帮助大家来理解这块的知识点。

扩大小按钮的事件点击范围

我们在平时的实战开发过程中经常会碰到这样的一些需求,我们要点击一个小按钮弹出一个DialogFragment或者点击之后跳转到另外一个界面上去,我们发现由于按钮太小了不容易点击,这样的体验非常不好,怎么办?

  • 效果图
    Android事件分发机制在实战开发中的应用之一

很多长人肯定会说给View加个Padding就行了嘛,是的这样可以解决问题,但是你有没有想过如果该View有背景图,结果你加了个Padding ,View的背景图变形了,这种情况下通过加Padding加大点击范围的方案就行不通了,如何**?其实很简单,稍微懂点脑筋就把这个问题解决了,我们给这个小按钮外围包裹一个LinearLayout或RelativeLayout,当我们点击外围的LinearLayout或RelativeLayout的时候把这个事件传递给小按钮问题立马就解决了

  • 关键代码:
public class FatArrowView extends RelativeLayout {
      //拦截事件
    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        Log.v(TAG,"onInterceptTouchEvent start...");
        return true;
    }

    //把事件分发给我们的子View CheckBox
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        Log.v(TAG,"onTouchEvent start...");
        //当手指离开屏幕的时候设置CheckBox的状态
        if (event.getAction() == MotionEvent.ACTION_UP){
            ischeck = !ischeck;
            mCheckBox.setChecked(ischeck);
        }
         return true;
    }
}

SettingBar的点击事件拦截

接下来我们再来看另外一个案例,正如上面界面上显示的两个条目,车辆选择和始发地点选择,他们都有一个共同的特点就是都有共同的标题,内容和右剪头按钮,这种情况下我们都会把它封装成一个组合的自定义View来显示它,我们现在来看一下它的

  • 效果图:
    Android事件分发机制在实战开发中的应用之一
    用户的需求是这样的: 当用户在点击车辆选择的条目的时候他会跳转到另外一个页面上去,而用户在事发地点上点击请输入的时候是可以输入文字信息的,也就是说有两种需求,一种处于不可编辑状态点击整个条目要进行事件拦截,另外一种处于可编辑状态事件,点击请输入需要弹出软键盘可输入文字,也就是点击的时候不需要拦截可直接传递给子View EditText,很显然我们的自定义设置条目需要一个是否可以编辑的开关,当处于不可编辑的状态的时候,点击的时候拦截该事件,当处于可编辑状态的时候,事件可以继续往下分发。

  • 关键代码:

public class SettingBarView extends RelativeLayout {
    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        //当处于不可编辑状态的时候拦截该事件,否则该事件就继续往下分发
        return !isEdit;
    }
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        //当拦截该事件的时候就把它分发给自己的根View,响应全局的点击事件
        return layoutSettingBar.onTouchEvent(event);
    }
}

好了,今天的两个小案例就讲完了,需求很简单,通过这两个案例的实操,我们进一步的加深了android事件分发机制的理解,项目案例的完整代码我已经分享到github上了,使用过程中有任何问题,请在文章下方留言,下一篇我们讲一个更加复杂的案例,来进一步帮助大家理解事件分发机制在实战开发当中的应用。

github源码下载地址:https://github.com/geduo83/android-touch-event