自定义布局实现简单View之间的联动(事件分发机制的拦截)
·
当前布局
通过点击左边下边按钮控制右边布局拦截事件改变右边按钮2能否收到点击事件
右边最外层是一个自定义线性布局,继承自系统的Linearlayout
class CustomLinearLayout @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
) : LinearLayout(context, attrs, defStyleAttr) {
/**
* 设置是否消费触摸事件
* @param consume true 表示消费触摸事件,返回 true;false 表示不消费,调用父类方法
*/
fun changeConsumeTouchEvent() {
Log.d(TAG, "changeConsumeTouchEvent: 改变前:$isConsumeTouchEvent")
isConsumeTouchEvent = !isConsumeTouchEvent
Log.d(TAG, "changeConsumeTouchEvent: 改变前:$isConsumeTouchEvent")
}
override fun dispatchTouchEvent(ev: MotionEvent?): Boolean {
return if (isConsumeTouchEvent) {
// 如果标志位为 true,直接返回 true,消费触摸事件
true
} else {
// 否则调用父类的 dispatchTouchEvent 方法
super.dispatchTouchEvent(ev)
}
}
companion object{
var TAG = "CustomLinearLayout"
var isConsumeTouchEvent = false
}
}
点击左边按钮2触发点击事件如下:
change2为左边按钮2,linear为右侧线性布局
change2.setOnClickListener {
linear.changeConsumeTouchEvent()
}
改变线性布局是否拦截事件

效果:
改变前点击右侧布局按钮能收到点击事件触发点击效果

点击左侧改变状态按钮后,再次点击按钮2没反应,实现了点击事件的拦截|
更多推荐
所有评论(0)