歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Android事件分析

Android事件分析

日期:2017/3/1 11:16:14   编辑:Linux編程

分析這個這個拿筆在紙上畫圖是最好的方式,我是畫的圖。直接上圖吧。

就是俺的諾基亞6500s拍照實在是不給力。

防止以後忘記沒的復習,我用文字描述一下。

---------------------------------分割線---------------------------------

估計是描述不清楚的。參考了這一篇:http://www.linuxidc.com/Linux/2011-10/44501.htm

事先聲明這個大部分是原文,我是讀了這位大牛的文章,然後加上自己調試程序得到的理解,再總結出來的。描述成自己能明白的形式。

---------------------------------分割線---------------------------------

首先,這篇文章僅僅針對於由於觸摸(Touch)而觸發的事件。

Android的事件:onClick, onScroll, onFling等等,都是由許多個Touch組成的。其中Touch的第一個狀態肯定是ACTION_DOWN, 表示按下了屏幕。之後,touch將會有後續事件,可能是:

  • ACTION_MOVE //表示為移動手勢(這個MOVE事件可能會與onLongClick()沖突,這個在源碼中是利用速率來解決的)

  • ACTION_UP //表示為離開屏幕

  • ACTION_CANCEL //表示取消手勢,不會由用戶產生,而是由程序產生的

一個Action_DOWN, n個ACTION_MOVE, 1個ACTION_UP,就構成了Android中眾多的事件。

在Android中,有一類控件是中還可以包含其他的子控件,這類控件是繼承於ViewGroup類,例如:ListView, Gallery, GridView。

還有一類控件是不能再包含子控件,例如:TextView。

本文的主要討論對象就是ViewGroup類的控件嵌套時事件觸發情況。

Action_DOWN的傳遞過程,依次經過Activity—>實體視圖(TextView,ImageView等)—>ViewGroup

各個層次關鑒方法是:

Activity:

@Override
public boolean dispatchTouchEvent(MotionEvent ev) {}
@Override

public boolean onTouchEvent(MotionEvent event) {}

ViewGroup:
  1. @Override
  2. public boolean dispatchTouchEvent(MotionEvent ev) {}
  3. @Override
  4. public boolean onTouchEvent(MotionEvent event) {}
  1. boolean onTouchEvent(MotionEvent event) {}

(實體)View:

  1. public boolean dispatchTouchEvent(MotionEvent ev) {}
  2. setOnTouchListener(){}
  3. boolean onTouchEvent(MotionEvent event) {}
  1. onClick()
  1. onLongClick()

對於ViewGroup類的控件,有一個很重要的方法,就是onInterceptTouchEvent(),用於處理事件並改變事件的傳遞方向,它的返回值是一個布爾值,決定了Touch事件是否要向它包含的子View繼續傳遞,這個方法是從父View向子View傳遞。

而方法onTouchEvent(),用於接收事件並處理,它的返回值也是一個布爾值,決定了事件及後續事件是否繼續向上傳遞,這個方法是從子View向父View傳遞。

touch事件在 onInterceptTouchEvent()和onTouchEvent以及各個childView間的傳遞機制完全取決於onInterceptTouchEvent()和onTouchEvent()的返回值。返回值為true表示事件被正確接收和處理了(就是把這個事件給消費了,消費了就不再繼續傳遞了),返回值為false表示事件沒有被處理,將繼續傳遞下去。

ACTION_DOWN事件會傳到某個ViewGroup類的onInterceptTouchEvent,如果返回false,則DOWN事件繼續向子ViewGroup類的onInterceptTouchEvent傳遞,如果子View不是ViewGroup類的控件,則傳遞給它的onTouchEvent。

如果onInterceptTouchEvent返回了true,則DOWN事件傳遞給它的onTouchEvent,不再繼續傳遞,並且之後的後續事件也都傳遞給它的onTouchEvent。

如果某View的onTouchEvent返回了false,則DOWN事件繼續向其父ViewGroup類的onTouchEvent傳遞;如果返回了true,則後續事件會直接傳遞給其onTouchEvent繼續處理。(後續事件(ACTION_MOVE/ACTION_UP)只會傳遞給對於必要事件ACTION_DOWN返回了true的onTouchEvent)

總結一下就是:onInterceptTouchEvent可以接受到所有的Touch事件,而onTouchEvent則不一定。


其實這裡面最重要的就是return的是true還是false。

返回了true,後續事件(ACTION_MOVE/ACTION_UP)只會傳遞給對於必要事件ACTION_DOWN返回了true的onTouchEvent。並且DOWN事件不會再向下傳遞。

返回了false,即使是在onTouchEvent裡面處理了事件,這個DOWN事件還是會繼續向繼續像下傳遞。

下一頁會詳細解釋這個返回值的問題。因為這個返回值是最重要的,事件處理的巧妙就是在這個返回值上。不知道理解的對不對,呵呵。

Copyright © Linux教程網 All Rights Reserved