kotlin Android事件分发

事件由Activity的dispatchTouchEvent开始做分发,true表示消费,事件不再继续往上传递。
dispatchTouchEvent事件:由Activity -> ViewGroup -> View
onInterceptTouchEvent事件: 只有ViewGroup存在事件拦截, true为拦截
onTouchEvent: 由View -> ViewGroup -> Activity


1、 自己消费,终结传递。------->return true;
2、 给自己的onTouchEvent处理-------> 调用super.dispatchTouchEvent()系统默认会去调用 onInterceptTouchEvent,在onInterceptTouchEvent return true就会去把事件分给自己的onTouchEvent处理。
3、 传给子View------>调用super.dispatchTouchEvent()默认实现会去调用 onInterceptTouchEvent 在onInterceptTouchEvent return false,就会把事件传给子类。
4、 不传给子View,事件终止往下传递,事件开始回溯,从父View的onTouchEvent开始事件从下到上回归执行每个控件的onTouchEvent------->return false;

DispatchMainActivity类:
/**
 * Author : wn
 * Email : maoning20080809@163.com
 * Date : 2025/2/12 9:05
 * Description :
 */
class DispatchMainActivity : Activity() {

    override fun onCreate(savedInstanceState: Bundle?) {

        super.onCreate(savedInstanceState)

        setContentView(R.layout.dispatch_main)
    }

    override fun dispatchTouchEvent(ev: MotionEvent?): Boolean {
        LogUtils.d("Dispatch", "Activity dispatchTouchEvent")
        return super.dispatchTouchEvent(ev)
    }

    override fun onTouchEvent(event: MotionEvent?): Boolean {
        LogUtils.d("Dispatch", "Activity onTouchEvent")
        return super.onTouchEvent(event)
    }
}
DispatchViewGroup类:
/**
 * Author : wn
 * Email : maoning20080809@163.com
 * Date : 2025/2/12 9:12
 * Description :
 */
class DispatchViewGroup : LinearLayout {

    constructor(context : Context) : this(context, null)

    constructor(context : Context, attrs : AttributeSet?) : this(context, attrs, 0)

    constructor(context : Context, attrs : AttributeSet? , defStyleAttr : Int) : super(context, attrs, defStyleAttr)

    override fun dispatchTouchEvent(ev: MotionEvent?): Boolean {
        LogUtils.d("Dispatch", "DispatchViewGroup dispatchTouchEvent")
        return super.dispatchTouchEvent(ev)
    }

    override fun onInterceptTouchEvent(ev: MotionEvent?): Boolean {
        LogUtils.i("Dispatch", "DispatchViewGroup onInterceptTouchEvent")
        return super.onInterceptTouchEvent(ev)
    }

    override fun onTouchEvent(event: MotionEvent?): Boolean {
        LogUtils.e("Dispatch", "DispatchViewGroup onTouchEvent")
        return super.onTouchEvent(event)
    }

}
DispatchView类:
/**
 * Author : wn
 * Email : maoning20080809@163.com
 * Date : 2025/2/12 9:15
 * Description :
 */
class DispatchView : View {

    constructor(context : Context) : this(context, null)

    constructor(context : Context, attrs : AttributeSet?) : this(context, attrs, 0)

    constructor(context : Context, attrs : AttributeSet?, defStyleAttr : Int) : super(context, attrs, defStyleAttr)


    override fun onDraw(canvas: Canvas) {
        super.onDraw(canvas)

        var paint = Paint()
        paint.setColor(resources.getColor(R.color.red))
        canvas.drawCircle(200f, 200f, 100f, paint)
    }

    override fun dispatchTouchEvent(event: MotionEvent?): Boolean {
        LogUtils.d("Dispatch", "DispatchView dispatchTouchEvent")

        return super.dispatchTouchEvent(event)
    }

    override fun onTouchEvent(event: MotionEvent?): Boolean {
        LogUtils.e("Dispatch", "DispatchView onTouchEvent")
        return super.onTouchEvent(event)
    }

}
Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐