kotlin Android事件分发
kotlin Android 事件分发
·
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)
}
}更多推荐


所有评论(0)