触摸事件传递

点击事件的相关方法

在开发App的过程中,我们或多或少需要对点击事件进行处理。而为达到这一目的,通常需要对以下一个或者几个方法进行重载:

方法之间调用关系

时序图:

时序图

说明:

  1. 接收到点击事件后,会先调用ViewGroup.dispatchTouchEvent()来派发点击事件;
  2. 而后,先检索能接受点击事件的Child View, 即newTouchTarget
  3. 如果newTouchTarget不为空,即有接收点击事件的子View,则调用ViewGroup.dispatchTransformedTouchEvent()dispatchTransformedTouchEvent会嵌套调用ViewGroup.dispatchTouchEvent方法,并将child.dispatchTouchEvent的返回结果(Boolean型)作为dispatchTranformedTouchEvent的返回结果,如果dispatchTransformedTouchEvent返回true,则设置mFirstTouchTarget
  4. 如果 mFirstTouchTarget为空,即点击事件没有子View消费掉。则调用View.dispatchTouchEvent
  5. View.dispatchTouchEvent会调用onTouch
  6. 如果onTouch返回false,则会调用View.onTouchEvent
  7. View.onTouchEvent中,ACTION_UP动作时,则会调用onClick

关系图

方法关系图

鱼骨图

鱼骨图

注意事项

  1. 如果只是简单的响应点击事件,onClick就可以满足需求,如果点击按钮等;
  2. 如果要响应View中的某个区域的点击事件,onTouch可以满足需求
  3. 如果拖动View,需要重载onTouchEvent
  4. 如果要拦截View的点击事件,需要重载onInterceptTouchEventonTouchEvent ;

例子

待续

源码


OnClickListener

/**
  * 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);
 }

OnTouchListener

/**
 * Interface definition for a callback to be invoked when 
 * a touch event is dispatched to this view. 
 * The callback will be invoked before the touch
 * event is given to the view.
 */
 public interface OnTouchListener {
     /**
      * Called when a touch event is dispatched to a view. 
      * This allows listeners to get a chance to respond 
      * before the target view.
      *
      * @param v The view the touch event has been
      * dispatched to.
      * @param event The MotionEvent object containing full 
      * information about the event.
      * @return True if the listener has consumed the event, 
      * false otherwise.
      */
     boolean onTouch(View v, MotionEvent event);
 }

onTouchEvent

在线查看onTouchEvent(event)方法的源码

dispatchTouchEvent

在线查看dispatchTouchEvent(event)的源码

onInterceptTouchEvent

在线查看onInterceptTouchEvent(event)的源码

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值