事件分发机制

事件分发机制

事件分发机制就是一个触摸事件发生了,从一个窗口传递到一个视图,再传递到另一个视图,最后被消费的过程

View和ViewGroup

Android的UI界面都是由View和ViewGroup及其派生类组合而成的。其中,View是所有UI组件的基类,而ViewGroup是容纳这些组件的容器,其本身也是从View派生出来的,也就是说ViewGroup的父类就是View。

通常来说,Button、ImageView、TextView等控件都是继承父类View来实现的。RelativeLayout、LinearLayout、FrameLayout等布局都是继承父类ViewGroup来实现的。

事件

当手指触摸到View或ViewGroup派生的控件后,将会触发一系列的触发响应事件,如:

onTouchEvent、onClick、onLongClick等。每个View都有自己处理事件的回调方法,开发人员只需要重写这些回调方法,就可以实现需要的响应事件。

而事件通常重要的有如下三种:

MotionEvent.ACTION_DOWN 按下View,是所有事件的开始

MotionEvent.ACTION_MOVE 滑动事件

MotionEvent.ACTION_UP 与down对应,表示抬起

事件的响应原理:

在android开发设计模式中,最广泛应用的就是监听、回调,进而形成了事件响应的过程。

`/*定义接口成员变量/

protected OnClickListener mOnClickListener;

/**

 * Interface definition for a callback to be invoked when a view is clicked.

 */

public interface OnClickListener {

    /**

     * Called when a view has been clicked.

     *

     * @param v The view that was clicked.

     */

    void onClick(View v);

}

/**

 * Register a callback to be invoked when this view is clicked. If this view is not

 * clickable, it becomes clickable.

 *

 * @param l The callback that will run

 *

 * @see #setClickable(boolean)

 */

public void setOnClickListener(OnClickListener l) {

    if (!isClickable()) {

        setClickable(true);

    }

    mOnClickListener = l;

}

/**

 * Call this view's OnClickListener, if it is defined.

 *

 * @return True there was an assigned OnClickListener that was called, false

 *         otherwise is returned.

 */

public boolean performClick() {

    sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_CLICKED);



    if (mOnClickListener != null) {

        playSoundEffect(SoundEffectConstants.CLICK);

        mOnClickListener.onClick(this);

        return true;

    }



    return false;

}

/*触摸了屏幕后,实现并调用的方法/

public boolean onTouchEvent(MotionEvent event) {

       …..

               if (mPerformClick == null) {

                                mPerformClick = new PerformClick();

                            }

                            if (!post(mPerformClick)) {

                                performClick();

                            }

       …..

}`
1、 OnClickListener类是一个当控件被点击后进行回调的一个接口,它完成被点击后的回调通知。

2、 创建一个按钮Button,并设置监听事件,对这个Button进行setOnClickListener操作

3、 当手指触摸到Button按钮,通过一系列方法(之后将会详细讲解,这里暂时忽略),触发并执行到onTouchEvent方法并执行mPerformClick方法,在mPerformClick方法中,首先会判断注册的mOnClickListener是否为空,若不为空,它就会回调之前注册的onClick方法,进而执行用户自定义代码。

事件响应机制,简单来说上面的例子就已经基本上诠释了

注册一个监听对象

实现监听对象的监听事件

当某一触发事件到来,在触发事件中通过注册过的监听对象,回调注册对象的响应事件,来完成用户自定义实现。

触摸一个View就会执行dispatchTouchEvent方法去“分发”事件, 既然触摸的是按钮Button,那么我们就查看Button的源码,寻找dispatchTouchEvent方法,Button源码中没有dispatchTouchEvent方法,但知道Button继承自TextView,寻找TextView,发现它也没有dispatchTouchEvent方法,继续查找TextView的父类View,发现View有dispatchTouchEvent方法,那我们就分析dispatchTouchEvent方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值