事件分发机制

来源:互联网 发布:双板挑选 知乎 编辑:程序博客网 时间:2024/04/25 07:13

事件分发机制

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

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方法。

0 0
原创粉丝点击