Android 事件分发笔记 一

284 阅读2分钟

好记性不如烂笔头,说不如写。备注自己用加深印象

1.事件定义:点击事件 touch 。当用户触摸到view viewgroup会产生事件

2.事件封装:事件的相关信息会(被)封装成 MotionEvent.

3.事件分类: MotionEvent.ACTION_DOWN MotionEvent.ACTION_UP MotionEvent.ACTION_MOVE MotionEvent.ACTION_CANCEL

   /**
 * Constant for {@link #getActionMasked}: A pressed gesture has started, the
 * motion contains the initial starting location.
 * <p>
 * This is also a good time to check the button state to distinguish
 * secondary and tertiary button clicks and handle them appropriately.
 * Use {@link #getButtonState} to retrieve the button state.
 * </p>
 */
public static final int ACTION_DOWN             = 0;

    /**
 * Constant for {@link #getActionMasked}: A pressed gesture has finished, the
 * motion contains the final release location as well as any intermediate
 * points since the last down or move event.
 */
public static final int ACTION_UP               = 1;

 /**
 * Constant for {@link #getActionMasked}: A change has happened during a
 * press gesture (between {@link #ACTION_DOWN} and {@link #ACTION_UP}).
 * The motion contains the most recent point, as well as any intermediate
 * points since the last down or move event.
 */
public static final int ACTION_MOVE             = 2;

/**
 * Constant for {@link #getActionMasked}: The current gesture has been aborted.
 * You will not receive any more points in it.  You should treat this as
 * an up event, but not perform any action that you normally would.
 */
public static final int ACTION_CANCEL           = 3;

事件从down 开始到 up结束 中间的 move会有很多 所以很多实时获取位置的计算需要在move中去进行

特殊状态 cancel You should treat this as an up event

将MotionEvent 事件发送到相应的view 并且进行处理 这一个过程就是事件的分发本质

事件传递的对象顺序为: activity --> viewgroup --> view

事件分发涉及到的方法有:

 /**
 * Pass the touch screen motion event down to the target view, or this
 * view if it is the target.
 *
 * @param event The motion event to be dispatched.
 * @return True if the event was handled by the view, false otherwise.
 */
public boolean dispatchTouchEvent(MotionEvent event) {
    xxx
}



 /**
 * Implement this method to handle touch screen motion events.
 * <p>
 * If this method is used to detect click actions, it is recommended that
 * the actions be performed by implementing and calling
 * {@link #performClick()}. This will ensure consistent system behavior,
 * including:
 * <ul>
 * <li>obeying click sound preferences
 * <li>dispatching OnClickListener calls
 * <li>handling {@link AccessibilityNodeInfo#ACTION_CLICK ACTION_CLICK} when
 * accessibility features are enabled
 * </ul>
 *
 * @param event The motion event.
 * @return True if the event was handled, false otherwise.
 */
public boolean onTouchEvent(MotionEvent event) {
    xxxxx
}

以上两个方法在 View 类中

/**
 * A helper class to handle touches on the heads-up views.
 */
public class HeadsUpTouchHelper implements Gefingerpoken {
    @Override
    public boolean onInterceptTouchEvent(MotionEvent event) {
        xxxx
    }
}

以上就是事件分发的总概念 后面一点点的详细记录