伪代码模拟View的点击事件分发

点击事件有三个重要的方法它们分别是:

  • dispatchTouchEvent(MotionEvent ev):用来进行事件的分发
  • onInterceptTouchEvent(MotionEvent ev):用来进行事件的拦截,在dispatchTouchEvent()中调用,需要注意的是View没有提供该方法
  • onTouchEvent(MotionEvent ev):用来处理点击事件,在dispatchTouchEvent()方法中进行调用

由ViewGroup开始

class ViewGroup : View() {

    private val children = arrayOf<View>()

    override fun dispatchTouchEvent(ev: MotionEvent?): Boolean {
        var result = onInterceptTouchEvent(ev)
        if (!result){
            for (child in children){
                dispatchTransformedTouchEvent(ev , child)
            }
        }
        return result
    }

    open fun onInterceptTouchEvent(ev: MotionEvent?):Boolean{
        return false
    }

    private fun dispatchTransformedTouchEvent(event : MotionEvent? , child : View?): Boolean {
        return if (child == null) {
            super.dispatchTouchEvent(event)
        } else {
            child.dispatchTouchEvent(event)
        }
    }

}
open class View {
    open fun dispatchTouchEvent(ev: MotionEvent?): Boolean {
        var result = false
        val li: ListenerInfo = mListenerInfo
        if (li != null
            && li.mOnTouchListener != null
            && mViewFlags and ENABLED_MASK === ENABLED
            && li.mOnTouchListener.onTouch(this, event)
        ) {
            result = true
        }

        if (!result && onTouchEvent(event)) {
            result = true;
        }
        return result
    }

    open fun onTouchEvent(ev: MotionEvent?): Boolean {
        if (mTouchDelegate != null) {
            if (mTouchDelegate.onTouchEvent(event)) {
                return true
            }
        }
        val clickable = CLICKABLE || LONG_CLICKABLE
        return if (clickable) {
            when (ev?.action) {
                MotionEvent.ACTION_UP -> {
                    performClick()
                }
            }
            true
        } else {
            false
        }
    }

    fun performClick(): Boolean {
        val li = mListenerInfo;
        val result = if (li != null && li.mOnClickListener != null) {
            li.mOnClickListener.onClick(this);
            true;
        } else {
            false;
        }
        return result;
    }
}

参考了刘望舒大佬的文章Android View体系(五)从源码解析View的事件分发机制 | BATcoder - 刘望舒

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值