1. 程式人生 > >Android觸控事件的分發、攔截、處理

Android觸控事件的分發、攔截、處理

 在Android觸控式螢幕的過程中,有三個重要的方法,dispatchTouchEvent(事件分發)、onInterceptTouchEvent(事件攔截)、onTouchEvent(事件處理、消費)。

 View、ViewGroup、Activity中都有dispatchTouchEvent,onTouchEvent方法;但是onInterceptTouchEvent只有ViewGroup中有。

我在此只是記錄下,用程式碼進行的驗證過程以及一些要點。

程式碼如下:

public class MyRelativeLayout extends RelativeLayout {
    public 
MyRelativeLayout(Context context) { super(context); } public MyRelativeLayout(Context context, AttributeSet attrs) { super(context, attrs); } @Override public boolean onTouchEvent(MotionEvent event) { Log.e("Demo", "RelativeLayout --> onTouchEvent"+event.getAction());
return super.onTouchEvent(event); } @Override public boolean dispatchTouchEvent(MotionEvent ev) { Log.e("Demo", "RelativeLayout --> dispatchTouchEvent"+ev.getAction()); return super.dispatchTouchEvent(ev); } @Override public boolean onInterceptTouchEvent(MotionEvent ev) { return super
.onInterceptTouchEvent(ev); } }
public class MyButton extends Button {
    public MyButton(Context context) {
        super(context);
}

    public MyButton(Context context, AttributeSet attrs) {
        super(context, attrs);
}

    @Override
public boolean onTouchEvent(MotionEvent event) {
        //觸控
Log.e("Demo", "Button --> onTouchEvent" + event.getAction() + "");
        return super.onTouchEvent(event);
}

    @Override
public boolean dispatchTouchEvent(MotionEvent event) {
        //事件分發
Log.e("Demo", "Button --> dispatchTouchEvent" + event.getAction() + "");
        return super.dispatchTouchEvent(event);
}
}
public class MainActivity extends AppCompatActivity implements View.OnClickListener, View.OnTouchListener {
    private RelativeLayout m_rlayout;
    private MyButton m_button;
@Override
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
setContentView(R.layout.content_main);
m_rlayout = (RelativeLayout) findViewById(R.id.relative_layout);
m_button = (MyButton) findViewById(R.id.button);
m_rlayout.setOnTouchListener(this);
m_button.setOnTouchListener(this);
m_button.setOnClickListener(this);
m_rlayout.setOnClickListener(this);
}

    @Override
public boolean dispatchTouchEvent(MotionEvent ev) {
        return super.dispatchTouchEvent(ev);
}

    @Override
public void onClick(View v) {
        Log.e("Demo", "點選事件" + "onClick"+v);
}

    @Override
public boolean onTouch(View v, MotionEvent event) {
        Log.e("Demo", "觸控事件" + "onTouch"+v);
        return false;
}
}
<?xml version="1.0" encoding="utf-8"?>
<com.example.myinflatedemo.MyRelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/relative_layout"
android:layout_width="match_parent"
android:layout_height="match_parent">
    <com.example.myinflatedemo.MyButton
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"android:text="按鈕" />
</com.example.myinflatedemo.MyRelativeLayout>
這些程式碼很簡單,入門了的人都看得懂。

下面是我驗證的幾個要點:

1、onTouchEvent 返回ture代表消費了此事件,不再傳遞給上層的GroupView(預設返回false)。

2、dispatchTouchEvent 返回true(Action_Down),後續事件(Action_move、up)都不會傳遞過來(預設是返回false)。

3、onInterceptTouchEvent 返回true(Action_Down),攔截事件,此事件不會分發到childView中(預設返回false)。

將MyRelativeLayout的dispatchTouchEvent方法的返回值設為true。

@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
    super.onInterceptTouchEvent(ev);
    return true;
}
執行結果:


Logcat中沒有出現Button相關的日誌,整個流程是ACTION_DOWN dispatchTouchEvent --> ACTION_DOWN onTouchEvent --> ACTION_UP dispatchTouchEvent --> ACTION_UP onTouchEvent。

4、如果所有的view、或者viewgroup都沒有消費onTouchEvent事件(Action_Down),後續的事件都不會再被傳遞(Action_move、up)。

  將MyButton和MyRelativeLayout中的onTouchEvent方法的返回值都改成false

@Override
public boolean onTouchEvent(MotionEvent event) {
    //觸控
Log.e("Demo", "Button --> onTouchEvent" + event.getAction() + "");
    super.onTouchEvent(event);
    return false;
}
執行結果如下:


RelativeLayout和Button都執行了onTouchEvent,處理的事件只有0(Action_down)。

相關推薦

Android 觸控事件分發攔截機制

Android 開發中,很多情況下,我們需要對觸控事件進行處理,但是當面對錯綜複雜的 Android 佈局時,我們如何準確的將一個使用者的觸控事件傳遞到對應的控制元件中並讓它進行處理呢? 首先,我們先假設這裡有這樣一個佈局: 我們可以很清楚的看到,一個很

Android觸控事件分發攔截處理

 在Android觸控式螢幕的過程中,有三個重要的方法,dispatchTouchEvent(事件分發)、onInterceptTouchEvent(事件攔截)、onTouchEvent(事件處理、消

Android開發知識(七):Android事件處理機制:事件分發傳遞攔截處理機制的原理分析(上)

  在我們剛開始學習安卓的時候,總會一開始就接觸到Button,也就是對按鈕進行一個事件監聽的事件,當我們點選螢幕上的按鈕時就可以觸發一個點選事件。那麼,從我們點選螢幕到按鈕觸發事件這個過程,是什麼樣子的呢?本文我們就來談一下關於事件攔截處理機制的基本知識。

Android開發知識(八):Android事件處理機制:事件分發傳遞攔截處理機制的原理分析(中)

  在本章節中,我們重點談論一下onTouch、onClick、onLongClick三個方法被回撥的過程。   在上一篇文章中,我們談到關於為View新增一個點選事件SetOnClickListener後,就可以通過回撥onClick方法來實現事件的響應

一文讀懂 Android TouchEvent 事件分發攔截處理過程

什麼是事件?事件是使用者觸控手機螢幕,引起的一系列TouchEvent,包括ACTION_DOWN、ACTION_MOVE、ACTION_UP、ACTION_CANCEL等,這些action組合後變成點選事件、長按事件等。 在這篇文章中,用打Log測試的方法來了解Android TouchEvent 事件分發

Android事件分發(dispatchTouchEvent),攔截(onInterceptTouchEvent)與處理(onTouchEvent)

在Android中,View的結構是樹狀的,所以,當觸發觸控事件的時候,其事件傳遞也是從上之下一層層的傳遞。下面我們結合例子來一點點進行分析。 首先,我們需要了解事件處理中的幾個方法: 1、在ViewGroup中,事件分為dispatchTouchEvent(事件的分發)

android面試題之觸控事件分發處理簡述

android觸控事件分發與處理     android的分發機制:由父控制元件判斷是否攔截,如果不攔截事件,則繼續分發到子控制元件,然後一直分發下去。     處理:與分發相反,由子控制元件先處理事件,如果子控制元件不處理,則交給父控制元件處理,一直向上傳遞,直到那個控制

Android觸控事件傳遞機制實踐——可拖動大小切換的SizeSwitchView

前言   對於Android的觸控事件傳遞機制,網上有很多講解,有結合原始碼的,有圖文結合的,其中不乏一些講解清晰明瞭的文章,看完之後都能有所收穫。然而,理論終究是要應用在實踐上的,最近工作的時候,做出了一個可拖動,可以大小切換,大形態巢狀著ViewG

android 觸控事件點選事件的區別,執行流程

針對螢幕上的一個View控制元件,Android如何區分應當觸發onTouchEvent,還是onClick,亦或是onLongClick事件?  在Android中,一次使用者操作可以被不同的View按次序分別處理,並將完全響應了使用者一次UI操作稱之為消費了該事件(co

觸控事件/事件分發流程/滑動衝突處理

目錄          1.觸控事件MotionEvent: 1)主要對應3操作 2)MotionEvent內部主要方法:          2.事件傳遞 1)預設情況demo:

android觸控事件分發

本文根據原始碼來梳理流程一、觸控事件傳遞流程 使用者觸控式螢幕幕,Ativity是最先接觸到螢幕的,然後將觸控事件傳遞到DecorView,然後由DecorView處理具體的事件分發。 二.ViewGroup和View事件分發邏輯    ViewGroup的dispatchT

HTML5觸控事件(多點單點觸控

本文轉自:http://www.360us.net/article/9.html HTML5的觸控API支援處理單點和多點的觸控事件處理。 介面 1、TouchEvent:代表了一個觸控事件。 主要屬性: TouchEvent.chang

js移動客戶端--觸控事件 模擬點選滑屏事件

;(function(doc, win, undefined) { "use strict"; var start = { //記錄開始的觸點 x: 0, y: 0 }, d

Android原始碼解析(三十)-->觸控事件分發流程

前面一篇文章中我們分析了App返回按鍵的分發流程,從Native層到ViewRootImpl層到DocorView層到Activity層,以及在Activity中的dispatchKeyEvent方法中分發事件,最終呼叫了Activity的finish方法,

Android應用層View觸控事件分發機制

概述 前兩篇部落格從原始碼的角度對View繪製流程進行了分析,那麼當用戶需要跟View進行互動的時候,比如點選按鈕的時候,按鈕是如何得到點選事件的呢?當用戶在螢幕上進行點選或觸控的時候,事件是如何傳遞到各個View的呢?這個就是本篇部落格研究的點:View事件

談談我對Android View事件分發的理解

event 調用 ack 處理 group ans import ras 運行 寫這篇博客的緣由。近期因為項目中用到相似一個LinearLayout中水平布局中,有一個TextView和Button,然後對該LinearLayout布局設置點擊事件。點擊

一張圖片讓你了解android事件分發機制

text statistic trac avi oid csdn rac dsm tis 一張圖片讓你了解android的事件分發機制

Android開發——事件分發機制詳解---微信魚蝦蟹源碼搭建

lai reset 微信 影響 ren 事件分發機制 lis forum hlist 轉載請註明出處:http://h5.hxforum.com深入學習事件分發機制,是為了解決在Android開發中遇到的滑動沖突問題做準備。事件分發機制描述了用戶的手勢一系列事件是如何被An

Android 實現事件監聽器的五種處理方法

在Android 應用開發過程中,常用監聽事件如下: (1) ListView事件監聽 setOn ItemSelectedListener:滑鼠滾動時觸發 setOnItemClickListener: 點選時觸發 (2 )EditText 事件監聽 setOnKeyListe

android事件分發傳遞機制

      事件的分發與傳遞最重要的三個處理方法是              dispatchTouchEvent             &nb