Android事件分发机制

花了一下午的事件研究了一下android的事件分发机制,觉得有必要总结一下

顺便分享出来,希望对大家有用


1】首先最重要的是需要了解ViewGroup里面重写的三个方法

      1)dispatchTouchEvent 用于事件的分发

      2)onInterceptTouchEvent用于事件的拦截

      3)onTouchEvent用于事件的处理

2】Android的事件分发是由上而下的,即从父类传递给子类,父View传递给子View

3】Android的事件处理是由下而上的,即从子类传递给父类,子View传递给父View


理解上面三点之后,再来分别看一下这三个方法

我们只需要知道每一个返回值对应的情况就能大致理解其作用了


1】dispatchTouchEvent方法

      1)return falas       

                        分为两种情况:

                               如果当前 View 获取的事件直接来自 Activity,则会将事件返回给 Activity 的 onTouchEvent 进行消费;

                               如果当前 View 获取的事件来自外层父控件,则会将事件返回给父 View 的  onTouchEvent 进行消费。

     2)return true     

                        事件会分发给当前 View 并由 dispatchTouchEvent 方法进行消费,同时事件会停止向下传递

     3) return super.dispatchTouchEvent(ev)

                        事件会自动的分发给当前 View 的 onInterceptTouchEvent 方法


2】onInterceptTouchEvent方法

     1)return false

                        事件会被当前View放行,将传递给子View的dispatchTouchEvent方法

     2)return true

                        事件被拦截,并且交给当前View的onTouchEvent去处理

     3)return super.onInterceptTouchEvent

                        事件会被当前View放行,将传递给子View的dispatchTouchEvent方法

3】onTouchEvent方法

     1)return false

                        事件会被传递给Activity或者父View的onTouchEvent处理,如果Activity或者父View的onTouchEvent也没有处理,则事件消失

     2)return true

                        事件会被拦截给当前View的onTouchEvent处理

     3)return super.onTouchEvent

                        事件会被传递给Activity或者父View的onTouchEvent处理,如果Activity或者父View的onTouchEvent也没有处理,则事件消失


画了一张图,来解释上面的文字描述




写了一个demo,可以自行更改每个方法的返回值来检测LOG

下面贴上代码,代码很简单

有一个Activity,一个SuperView,ChildView,TouchEventUtil用于打印日志

Activity:

public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent event) {
        Log.e("=================", "这是MainActivity的dispatchTouchEvent" + TouchEventUtil.getTouchAction(event));
        return super.dispatchTouchEvent(event);
    }



    @Override
    public boolean onTouchEvent(MotionEvent event) {
        Log.e("=================", "这是MainActivity的onTouchEvent" + TouchEventUtil.getTouchAction(event));
        return super.onTouchEvent(event);
    }
}

SuperView

public class SuperView extends RelativeLayout {
    public SuperView(Context context) {
        super(context);
    }

    public SuperView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public SuperView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent event) {
        Log.e("=================", "这是SuperView的dispatchTouchEvent" + TouchEventUtil.getTouchAction(event));
        return super.dispatchTouchEvent(event);
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent event) {
        Log.e("=================", "这是SuperView的onInterceptTouchEvent" + TouchEventUtil.getTouchAction(event));
        return super.onInterceptTouchEvent(event);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        Log.e("=================", "这是SuperView的onTouchEvent" + TouchEventUtil.getTouchAction(event));
        return super.onTouchEvent(event);
    }
}

ChildView:

public class ChildView extends LinearLayout {
    public ChildView(Context context) {
        super(context);
    }

    public ChildView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public ChildView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent event) {
        Log.e("=================", "这是ChildView的dispatchTouchEvent" + TouchEventUtil.getTouchAction(event));
        return super.dispatchTouchEvent(event);
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent event) {
        Log.e("=================", "这是ChildView的onInterceptTouchEvent" + TouchEventUtil.getTouchAction(event));
        return super.onInterceptTouchEvent(event);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        Log.e("=================", "这是ChildView的onTouchEvent" + TouchEventUtil.getTouchAction(event));
        return super.onTouchEvent(event);
    }
}



 
 








内容概要:该论文深入研究了液压挖掘机动臂下降势能回收技术,旨在解决传统液压挖掘机能耗高的问题。提出了一种新型闭式回路势能回收系统,利用模糊PI自整定控制算法控制永磁无刷直流电动机,实现了变转速容积调速控制,消除了节流和溢流损失。通过建立数学模型和仿真模型,分析了不同负载下的系统性能,并开发了试验平台验证系统的高效性和节能效果。研究还涵盖了执行机构能量分布分析、系统元件参数匹配及电机控制性能优化,为液压挖掘机节能技术提供了理论和实践依据。此外,通过实验验证,该系统相比传统方案可降低28%的能耗,控制系统响应时间缩短40%,为工程机械的绿色化、智能化发展提供了关键技术支撑。 适合人群:从事工程机械设计、制造及维护的工程师和技术人员,以及对液压系统节能技术感兴趣的科研人员。 使用场景及目标:①理解液压挖掘机闭式回路动臂势能回收系统的原理和优势;②掌握模糊PI自整定控制算法的具体实现;③学习如何通过理论建模、仿真和实验验证来评估和优化液压系统的性能。 其他说明:此研究不仅提供了详细的理论分析和数学建模,还给出了具体的仿真代码和实验数据,便于读者在实际工作中进行参考和应用。研究结果表明,该系统不仅能显著提高能源利用效率,还能延长设备使用寿命,降低维护成本,具有重要的工程应用价值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值