1. 程式人生 > >android 事件分發機制詳解

android 事件分發機制詳解

摘要:
整個事件分發就類似於分發任務是一樣的
老大分配任務給老二 、老二分配任務給老三
如果老三完成了,這個任務就結束了,如果老三沒有完成則會將任務返回給老二,老二如果解決了,任務也就結束了,如果老二也沒有完成則會將任務返回給老大。
這裡寫圖片描述

通過程式碼觀察:
佈局檔案:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin"> <net.fredericosilva
.showtipsviewsample.MyRelativeLayout android:id="@+id/my_relative" android:layout_width="500dp" android:layout_height="500dp" android:background="#000000" > <net.fredericosilva.showtipsviewsample.MyButton android:id="@+id/button1" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:layout_marginLeft="58dp" android:layout_marginTop="36dp" android:background="#FF0000" android:text="Button1" /> <net.fredericosilva.showtipsviewsample.MyButton android:id="@+id/button2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/button1" android:layout_marginLeft="58dp" android:layout_marginTop="36dp" android:background="#FF0000" android:text="Button2" /> </net.fredericosilva.showtipsviewsample.MyRelativeLayout> </RelativeLayout>

MainActivity.java:

package net.fredericosilva.showtipsviewsample;

import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;

import android.support.v7.app.ActionBarActivity;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Button;

import net.frederico.showtipsview.ShowTipsBuilder;
import net.frederico.showtipsview.ShowTipsView;

/**
 * 注意事件分發只在具有佈局包含關係才具有事件傳遞的機制。
 * */
public class MainActivity extends Activity {

    private Button btn1;
    private MyRelativeLayout rel1;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        btn1 = (Button) this.findViewById(R.id.button1);
        rel1 = (MyRelativeLayout) this.findViewById(R.id.my_relative);
        btn1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.i("test","btn1 click");
            }
        });
        rel1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                Log.i("test","rel1 click");
            }
        });


    }



    /**
     * activity的dispatchTouchEvent
     *
     * */
    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        Log.i("test","MainActivity dispatchTouchEvent      "+ev);
        return super.dispatchTouchEvent(ev);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        Log.i("test","MainActivity onTouchEvent          "+event);
        return super.onTouchEvent(event);
    }





}

MyRelativeLayout.java:

package net.fredericosilva.showtipsviewsample;

import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.widget.RelativeLayout;

/**
 * Created by weizhi on 2016/8/23.
 */
public class MyRelativeLayout extends RelativeLayout {
    public MyRelativeLayout(Context context) {
        super(context);
    }

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

    public MyRelativeLayout(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        Log.i("test","MyRelativeLayout dispatchTouchEvent      "+ev);

        return super.dispatchTouchEvent(ev);
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        Log.i("test","MyRelativeLayout onInterceptTouchEvent         "+ev);
        return true;
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        Log.i("test","MyRelativeLayout onTouchEvent         "+event);
        return false;
    }
}

MyButton.java:

package net.fredericosilva.showtipsviewsample;

import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.widget.Button;

/**
 * Created by weizhi on 2016/8/24.
 */
public class MyButton extends Button {
    public MyButton(Context context) {
        super(context);
    }

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

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

    @Override
    public boolean dispatchTouchEvent(MotionEvent event) {

        Log.i("test","MyButton dispatchTouchEvent         "+event);
        return super.dispatchTouchEvent(event);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {

        Log.i("test","MyButton onTouchEvent         "+event);
        return true;
    }
}

注意:
1、事件分發只是針對佈局之間具有包含關係的。
2、重寫控制元件之後,控制元件的點選事件是否存在了?
解答:如果這個控制元件的事件沒有被上層攔截掉,另外沒有對onTouchEvent方法進行重寫,則他的點選事件是有效的,否則點選事件無效。
3、其實事件分發就像一個U形一樣,從activity開始一直往下分發,然後從最底層往上分發。當然這個任何一個節點事件都有可能被攔截的。具體攔截後流程怎麼走看上面的圖。(這裡的程式碼中就是activity->MyRelativeLayout->MyButton->MyRelativeLayout->activity).
4、若在向下傳遞的過程中被攔截了,即onInterceptTouchEvent方法返回true,則事件將停止向下傳遞,直接由當前的onTouchEvent方法來處理,若處理成功則OK,若處理不成功,則事件會向上傳遞。

相關推薦

Android事件分發機制

概述   眾所周知,Android事件分發機制是Android知識體系中的重點也是難點。說白了,要學好Android,事件分發機制是無論如何也繞不過去的。   也許你會問,Android事件分發機制那麼重要,我怎麼沒用過呢?   當你被不同item的側滑刪除衝突

View的事件體系之三 android事件分發機制(下)

  接著上一篇來分析事件分發機制,在看了各位大牛的關於事件分發機制的分析後茅塞頓開,之前看過好幾遍郭霖,弘揚以及玉剛大神關於事件體系的講解,一直看不懂,比較模糊,最近複習時,看到一篇博文,寫的相當精彩,看完後,再回看各位大神的博文,收穫頗豐,記錄一下自己的理解和

Android 事件分發機制(1)

Android事件分發機制詳解(一) 所謂Android事件分發機制,其實也就是View的事件分發機制,在介紹事件的傳遞規則之前,首先我們要明白這裡需要分析的物件MotionEvent。 MotionEvent類 在手指接觸屏幕後所產生的事件封裝成了Mo

android 事件分發機制

摘要: 整個事件分發就類似於分發任務是一樣的 老大分配任務給老二 、老二分配任務給老三 如果老三完成了,這個任務就結束了,如果老三沒有完成則會將任務

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

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

Android開發——事件分發機制

0. 前言深入學習事件分發機制,是為了解決在Android開發中遇到的滑動衝突問題做準備。事件分發機制描述了使用者的手勢一系列事件是如何被Android系統傳遞並消費的。首先對事件分發機制進行概述:如果

安卓自定義View進階-事件分發機制

Android 事件分發機制詳解,在上一篇文章 事件分發機制原理 中簡要分析了一下事件分發機制的原理,原理是十分簡單的,一句話就能總結:責任鏈模式,事件層層傳遞,直到被消費。 雖然原理簡單,但是隨著 Android 不斷的發展,實際運用場景也越來越複雜,所以想要徹底玩轉事件分發機制還

Android事件傳遞機制(巢狀自定義View示例)

一、概述   自定義View如果嵌套了自定義View,可能簡單寫一個onTouchEvent處理事件已經不能解決你的需要。簡單舉個例子: 你自定義了一個容器View,簡稱為父View,在這裡監聽點選事件,做事情A,監聽滑動做事情B 然後你又自定了一個View,放入該容器

Android事件分發機制流程(二)

前言:上一篇我們已經從事件分發執行流程入手,一起來了解並分析了事件分發的經過,大家應該從分析中能對事件分發的有個總體的認識,並且我相信應該也能自己分析出事件會如何執行,其實就那麼點東西,弄明白了就不難了,但是今天我們還是要來看看activity,viewg

Android觸控式螢幕事件派發機制與原始碼分析三(Activity篇)

PS一句:最終還是選擇CSDN來整理髮表這幾年的知識點,該文章平行遷移到CSDN。因為CSDN也支援MarkDown語法了,牛逼啊! 【工匠若水 http://blog.csdn.net/yanbober】 該篇承接上一篇《Android觸控式螢幕事件派發機制詳解與原始碼分析

Android觸控式螢幕事件派發機制與原始碼分析二(ViewGroup篇)

【工匠若水 http://blog.csdn.net/yanbober】 該篇承接上一篇《Android觸控式螢幕事件派發機制詳解與原始碼分析一(View篇)》,閱讀本篇之前建議先閱讀。當然,閱讀完這一篇之後可以閱讀繼續進階的下一篇《Android觸控式螢幕事件派發機制詳解與原始碼

Android觸控式螢幕事件派發機制與原始碼分析一(View篇)

【工匠若水 http://blog.csdn.net/yanbober】 Notice:閱讀完該篇之後如果想繼續深入閱讀Android觸控式螢幕事件派發機制詳解與原始碼分析下一篇請點選《Android觸控式螢幕事件派發機制詳解與原始碼分析二(ViewGroup篇)》檢視。 1

Android點選事件傳遞機制

在講正題之前我們講一段有關任務傳遞的小故事,拋磚迎玉下: 話說一家軟體公司,來一個任務,分派給了開發經理去完成: 開發經理拿到,看了一下,感覺好簡單,於是 開發經理:分派給了開發組長 開發組長:分派給了自己組員(程式設計師) 程式設計師:分派給了自己帶的實習生。

android 事件分發機制

cnblogs instance 1.0 必須 div called tool per 測試環境 我們通過代碼來分析 package im.weiyuan.com.viewutils; import android.content.Intent; import

Android 事件分發機制 圖解

ack 理解 cnblogs png ont tor 自己的 block ans 在Android 開發中事件分發是比較重要的,也是比較難理解的,之前看過這方面的東西,以為自己弄懂了,也就沒太註意,最近面試呢,想著肯定要問到這一塊的東西,回顧的時候發現

從小白角度探索Android事件分發機制

https 事件 很好 tar 上班 bsp 備份 http nbsp 今早來上班時看到郭神這邊文章超贊,劇情很好引人入勝,特此備份! https://mp.weixin.qq.com/s?__biz=MzA5MzI3NjE2MA==&mid=2650244386&

Android事件分發機制

前言 Android事件分發機制是Android開發者必須瞭解的基礎 網上有大量關於Android事件分發機制的文章,但存在一些問題:內容不全、思路不清晰、無原始碼分析、簡單問題複雜化等等 今天,我將全面總結Android的事件分

iOS事件傳遞機制

概述 當用戶觸控實際螢幕時,會生成一個Touch Event,將此事件新增到UIApplication管理的事件佇列之中。 UIApplication從事件佇列之中按順序取出事件分發到檢視去處理。 當事件被髮出以後,會從keyWindow開始,依次向上傳遞,包括

Android事件分發機制以及滑動衝突處理

轉載請註明出處:http://blog.csdn.net/u013038616/article/details/50733811 方便日後的檢視與交流,將學習與實踐總結如下。 一、Android事件傳遞分析 1、ViewGroup中事件分發機制相關的方法 a、dispatchTo

圖解 Android 事件分發機制 和 handler 機制

在Android開發中,事件分發機制是一塊Android比較重要的知識體系,瞭解並熟悉整套的分發機制有助於更好的分析各種點選滑動失效問題,更好去擴充套件控制元件的事件功能和開發自定義控制元件,同時事件分發機制也是Android面試必問考點之一,如果你能把下面的一些事件分發圖當場畫出來肯定加分不少。廢