---恢复内容开始---

一、MotionEvent : ACTION_DOWN(下按事件)、ACTION_UP(松开事件)、ACTION_MOVE(移动事件)

二、三大函数

1.dispatchTouchEvent(Event event) == > 分发函数,由系统自动调用(返回值为true时,viewGroup可以向其子控件分发事件,view则分发给自身)

public boolean dispatchTouchEvent(MotionEvent ev) {
        int action = ev.getAction();
        switch(action){
            case MotionEvent.ACTION_DOWN:
                Log.e("MyLinearLayout2", "dispatchTouchEvent-->ACTION_DOWN");
                break;
            case MotionEvent.ACTION_MOVE:
                Log.e("MyLinearLayout2","dispatchTouchEvent-->ACTION_MOVE");
                break;
            case MotionEvent.ACTION_UP:
                Log.e("MyLinearLayout2","dispatchTouchEvent-->ACTION_UP");
                break;
        }
        return super.dispatchTouchEvent(ev);

}

2.onInterceptTouchEvent(Event event) ==> 拦截函数(viewGroup有,view没有)

a.返回值为true时,viewGroup对象会将事件拦截,使得之后的UP和MOVE不会被任何控件相应;

b.返回值为false时,viewGroup不拦截事件,事件可以正常分发。

public boolean onInterceptTouchEvent(MotionEvent ev) {

        int action = ev.getAction();
        switch(action){
            case MotionEvent.ACTION_DOWN:
                Log.e("MyLInearLayout","onInterceptTouchEvent-->ACTION_DOWN");
                break;
            case MotionEvent.ACTION_MOVE:
                Log.e("MyLInearLayout","onInterceptTouchEvent-->ACTION_MOVE");
                break;
            case MotionEvent.ACTION_UP:
                Log.e("MyLInearLayout","onInterceptTouchEvent-->ACTION_UP");
                break;
        }
        return false;
    }

3.onTouchEvent(Event event) == >触摸相应函数

a.事件逐级向下传递,直到某个view或viewGroup执行onTouchEvent,若返回值为false,则会通知其父viewGroup执行onTouchEvent,若返回值为true,则不通知其父viewGroup执行onTouchEvent;

b.当某个view或viewGroup的onTouchEvent()相应,并且返回值为true时,之后的MOVE和UP的响应事件都会直接传递给该空间,并由该控件的onTouchEvent()响应;

直接上代码:

MainActivity:

 1 package com.example.qjm3662.myapplication;
 2 
 3 import android.app.Activity;
 4 import android.content.Context;
 5 import android.os.Bundle;
 6 import android.support.design.widget.FloatingActionButton;
 7 import android.support.design.widget.Snackbar;
 8 import android.support.v7.app.AppCompatActivity;
 9 import android.support.v7.widget.Toolbar;
 import android.util.AttributeSet;
 import android.util.Log;
 import android.view.MotionEvent;
 import android.view.View;
 import android.view.Menu;
 import android.view.MenuItem;
 import android.widget.LinearLayout;
 
 public class MainActivity extends Activity{
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_main);
     }

25 }

MyLInearLayout:

 1 package com.example.qjm3662.myapplication;
 2 
 3 import android.content.Context;
 4 import android.util.AttributeSet;
 5 import android.util.Log;
 6 import android.view.MotionEvent;
 7 import android.widget.LinearLayout;
 8 
 9 /**
  * Created by qjm3662 on 2016/4/10 0010.
  */
 public class MyLInearLayout extends LinearLayout {
     public MyLInearLayout(Context context, AttributeSet attrs) {
         super(context, attrs);
     }
 
     @Override
     public boolean dispatchTouchEvent(MotionEvent ev) {
         int action = ev.getAction();
         switch(action){
             case MotionEvent.ACTION_DOWN:
                 Log.e("MyLInearLayout","dispatchTouchEvent-->ACTION_DOWN");
                 break;
             case MotionEvent.ACTION_MOVE:
                 Log.e("MyLInearLayout","dispatchTouchEvent-->ACTION_MOVE");
                 break;
             case MotionEvent.ACTION_UP:
                 Log.e("MyLInearLayout","dispatchTouchEvent-->ACTION_UP");
                 break;
         }
         return super.dispatchTouchEvent(ev);
     }
 
     @Override
     public boolean onTouchEvent(MotionEvent event) {
         int action = event.getAction();
         switch(action){
             case MotionEvent.ACTION_DOWN:
                 Log.e("MyLInearLayout","onTouchEvent-->ACTION_DOWN");
                 break;
             case MotionEvent.ACTION_MOVE:
                 Log.e("MyLInearLayout","onTouchEvent-->ACTION_MOVE");
                 break;
             case MotionEvent.ACTION_UP:
                 Log.e("MyLInearLayout","onTouchEvent-->ACTION_UP");
                 break;
         }
         return false;
     }
 
     @Override
     public boolean onInterceptTouchEvent(MotionEvent ev) {
 
         int action = ev.getAction();
         switch(action){
             case MotionEvent.ACTION_DOWN:
                 Log.e("MyLInearLayout","onInterceptTouchEvent-->ACTION_DOWN");
                 break;
             case MotionEvent.ACTION_MOVE:
                 Log.e("MyLInearLayout","onInterceptTouchEvent-->ACTION_MOVE");
                 break;
             case MotionEvent.ACTION_UP:
                 Log.e("MyLInearLayout","onInterceptTouchEvent-->ACTION_UP");
                 break;
         }
         return false;
     }
 

69 }

MyLinearLayout2:

 1 package com.example.qjm3662.myapplication;
 2 
 3 import android.content.Context;
 4 import android.util.AttributeSet;
 5 import android.util.Log;
 6 import android.view.MotionEvent;
 7 import android.widget.LinearLayout;
 8 
 9 /**
  * Created by qjm3662 on 2016/4/10 0010.
  */
 public class MyLinearLayout2 extends LinearLayout{
     public MyLinearLayout2(Context context) {
         super(context);
     }
 
     public MyLinearLayout2(Context context, AttributeSet attrs) {
         super(context, attrs);
     }
 
     public MyLinearLayout2(Context context, AttributeSet attrs, int defStyleAttr) {
         super(context, attrs, defStyleAttr);
     }
 
     @Override
     public boolean dispatchTouchEvent(MotionEvent ev) {
         int action = ev.getAction();
         switch(action){
             case MotionEvent.ACTION_DOWN:
                 Log.e("MyLinearLayout2", "dispatchTouchEvent-->ACTION_DOWN");
                 break;
             case MotionEvent.ACTION_MOVE:
                 Log.e("MyLinearLayout2","dispatchTouchEvent-->ACTION_MOVE");
                 break;
             case MotionEvent.ACTION_UP:
                 Log.e("MyLinearLayout2","dispatchTouchEvent-->ACTION_UP");
                 break;
         }
         return super.dispatchTouchEvent(ev);
     }
 
     @Override
     public boolean onTouchEvent(MotionEvent event) {
         int action = event.getAction();
         switch(action){
             case MotionEvent.ACTION_DOWN:
                 Log.e("MyLinearLayout2","onTouchEvent-->ACTION_DOWN");
                 break;
             case MotionEvent.ACTION_MOVE:
                 Log.e("MyLinearLayout2","onTouchEvent-->ACTION_MOVE");
                 break;
             case MotionEvent.ACTION_UP:
                 Log.e("MyLinearLayout2","onTouchEvent-->ACTION_UP");
                 break;
         }
         return false;
     }
 
     @Override
     public boolean onInterceptTouchEvent(MotionEvent ev) {
 
         int action = ev.getAction();
         switch(action){
             case MotionEvent.ACTION_DOWN:
                 Log.e("MyLinearLayout2","onInterceptTouchEvent-->ACTION_DOWN");
                 break;
             case MotionEvent.ACTION_MOVE:
                 Log.e("MyLinearLayout2","onInterceptTouchEvent-->ACTION_MOVE");
                 break;
             case MotionEvent.ACTION_UP:
                 Log.e("MyLinearLayout2","onInterceptTouchEvent-->ACTION_UP");
                 break;
         }
         return true;
     }

76 }

view:

 1 package com.example.qjm3662.myapplication;
 2 
 3 import android.content.Context;
 4 import android.util.AttributeSet;
 5 import android.util.Log;
 6 import android.view.MotionEvent;
 7 import android.widget.TextView;
 8 
 9 /**
  * Created by qjm3662 on 2016/4/10 0010.
  */
 public class view extends TextView{
 
 
     public view(Context context) {
         super(context);
     }
 
     public view(Context context, AttributeSet attrs) {
         super(context, attrs);
     }
 
     public view(Context context, AttributeSet attrs, int defStyleAttr) {
         super(context, attrs, defStyleAttr);
     }
 
 
     @Override
     public boolean dispatchTouchEvent(MotionEvent ev) {
         int action = ev.getAction();
         switch(action){
             case MotionEvent.ACTION_DOWN:
                 Log.e("view","dispatchTouchEvent-->ACTION_DOWN");
                 break;
             case MotionEvent.ACTION_MOVE:
                 Log.e("view","dispatchTouchEvent-->ACTION_MOVE");
                 break;
             case MotionEvent.ACTION_UP:
                 Log.e("view","dispatchTouchEvent-->ACTION_UP");
                 break;
         }
         return super.dispatchTouchEvent(ev);
     }
 
     @Override
     public boolean onTouchEvent(MotionEvent event) {
         int action = event.getAction();
         switch(action){
             case MotionEvent.ACTION_DOWN:
                 Log.e("view","onTouchEvent-->ACTION_DOWN");
                 break;
             case MotionEvent.ACTION_MOVE:
                 Log.e("view","onTouchEvent-->ACTION_MOVE");
                 break;
             case MotionEvent.ACTION_UP:
                 Log.e("view","onTouchEvent-->ACTION_UP");
                 break;
         }
         return true;
     }
 
 
 }

view2:

 1 package com.example.qjm3662.myapplication;
 2 
 3 import android.content.Context;
 4 import android.util.AttributeSet;
 5 import android.util.Log;
 6 import android.view.MotionEvent;
 7 import android.widget.ImageView;
 8 
 9 /**
  * Created by qjm3662 on 2016/4/10 0010.
  */
 public class view2 extends ImageView{
     public view2(Context context) {
         super(context);
     }
 
     public view2(Context context, AttributeSet attrs) {
         super(context, attrs);
     }
 
     public view2(Context context, AttributeSet attrs, int defStyleAttr) {
         super(context, attrs, defStyleAttr);
     }
 
     @Override
     public boolean dispatchTouchEvent(MotionEvent event) {
         int action = event.getAction();
         switch(action){
             case MotionEvent.ACTION_DOWN:
                 Log.e("view2", "dispatchTouchEvent-->ACTION_DOWN");
                 break;
             case MotionEvent.ACTION_MOVE:
                 Log.e("view2","dispatchTouchEvent-->ACTION_MOVE");
                 break;
             case MotionEvent.ACTION_UP:
                 Log.e("view2","dispatchTouchEvent-->ACTION_UP");
                 break;
         }
         return super.dispatchTouchEvent(event);
     }
 
     @Override
     public boolean onTouchEvent(MotionEvent event) {
         int action = event.getAction();
         switch(action){
             case MotionEvent.ACTION_DOWN:
                 Log.e("view2","onTouchEvent-->ACTION_DOWN");
                 break;
             case MotionEvent.ACTION_MOVE:
                 Log.e("view2","onTouchEvent-->ACTION_MOVE");
                 break;
             case MotionEvent.ACTION_UP:
                 Log.e("view2","onTouchEvent-->ACTION_UP");
                 break;
         }
         return false;
     }

58 }

布局:

<?xml version="1.0" encoding="utf-8"?>
<com.example.qjm3662.myapplication.MyLInearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    xmlns:android="http://schemas.android.com/apk/res/android">     <com.example.qjm3662.myapplication.view
        android:text="dsvsdvsvsdv"
        android:textSize="24sp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    <com.example.qjm3662.myapplication.MyLinearLayout2
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:orientation="vertical"
        >
        <com.example.qjm3662.myapplication.view2
            android:src="@drawable/ic_launcher"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    </com.example.qjm3662.myapplication.MyLinearLayout2>

</com.example.qjm3662.myapplication.MyLInearLayout>

运行结果:

点击上面的TextView后松开:

04-10 06:42:32.234 2414-2414/com.example.qjm3662.myapplication E/MyLInearLayout: dispatchTouchEvent-->ACTION_DOWN
04-10 06:42:32.234 2414-2414/com.example.qjm3662.myapplication E/MyLInearLayout: onInterceptTouchEvent-->ACTION_DOWN
04-10 06:42:32.234 2414-2414/com.example.qjm3662.myapplication E/view: dispatchTouchEvent-->ACTION_DOWN
04-10 06:42:32.234 2414-2414/com.example.qjm3662.myapplication E/view: onTouchEvent-->ACTION_DOWN
04-10 06:42:32.474 2414-2414/com.example.qjm3662.myapplication E/MyLInearLayout: dispatchTouchEvent-->ACTION_UP
04-10 06:42:32.474 2414-2414/com.example.qjm3662.myapplication E/MyLInearLayout: onInterceptTouchEvent-->ACTION_UP
04-10 06:42:32.474 2414-2414/com.example.qjm3662.myapplication E/view: dispatchTouchEvent-->ACTION_UP
04-10 06:42:32.474 2414-2414/com.example.qjm3662.myapplication E/view: onTouchEvent-->ACTION_UP

点击下面的ImagView后松开:

04-10 06:43:58.322 2414-2414/com.example.qjm3662.myapplication E/MyLInearLayout: dispatchTouchEvent-->ACTION_DOWN
04-10 06:43:58.322 2414-2414/com.example.qjm3662.myapplication E/MyLInearLayout: onInterceptTouchEvent-->ACTION_DOWN
04-10 06:43:58.322 2414-2414/com.example.qjm3662.myapplication E/MyLinearLayout2: dispatchTouchEvent-->ACTION_DOWN
04-10 06:43:58.322 2414-2414/com.example.qjm3662.myapplication E/MyLinearLayout2: onInterceptTouchEvent-->ACTION_DOWN
04-10 06:43:58.322 2414-2414/com.example.qjm3662.myapplication E/MyLinearLayout2: onTouchEvent-->ACTION_DOWN

04-10 06:43:58.322 2414-2414/com.example.qjm3662.myapplication E/MyLInearLayout: onTouchEvent-->ACTION_DOWN

Android触摸事件的分发机制的更多相关文章

  1. Android触摸事件的应用

    前言 上一篇讲了Android触摸事件的传递机制,具体可以看这里 初识Android触摸事件传递机制.既然知道Android中触摸事件的传递分发,那么它能解决什么样的问题,在我们实际开发中如何应用,这 ...

  2. android自定义控件(9)-Android触摸事件分发机制

    触摸事件的传递机制:   首先是最外层的viewgroup接收到事件,然后调用会调用自己的dispatchTouchEvent方法.如果在ACTION_DOWN的时候dispatchTouchEven ...

  3. 初识Android触摸事件传递机制

    前言 今天总结的一个知识点是Andorid中View事件传递机制,也是核心知识点,相信很多开发者在面对这个问题时候会觉得困惑,另外,View的另外一个难题滑动冲突,比如在ScrollView中嵌套Li ...

  4. 一个demo让你彻底理解Android中触摸事件的分发

    注:本文涉及的demo的地址:https://github.com/absfree/TouchDispatch 1. 触摸动作及事件序列 (1)触摸事件的动作 触摸动作一共有三种:ACTION_DOW ...

  5. Android触摸事件传递机制

    简单梳理一下Android触摸事件传递机制的知识点. 一.View与ViewGroup的关系 View和ViewGroup二者的继承关系如下图所示: View是Android中最基本的一种UI组件,它 ...

  6. 【知识梳理1】Android触摸事件机制

    前言 随着科学技术的发展,智能手机早已成为我们当代人身边不可缺少的"伙伴"之中的一个,堪比对象女友.每天我们对着手机反复的做着点击.滑动操作,而手机则随着我们的操作给我们展示她的精 ...

  7. 一个demo让你彻底理解Android触摸事件的并发

    注:本文涉及的demo的地址:https://github.com/absfree/TouchDispatch 1. 触摸动作及事件序列 (1)触摸事件的动作 触摸动作一共有三种:ACTION_DOW ...

  8. View,ViewGroup的Touch事件的分发机制

    原帖地址:http://blog.csdn.net/xiaanming/article/details/21696315 ViewGroup的事件分发机制 我们用手指去触摸Android手机屏幕,就会 ...

  9. Andriod 从源码的角度详解View,ViewGroup的Touch事件的分发机制

    转自:xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/21696315) 今天这篇文章主要分析的是Android的事件分发机制, ...

随机推荐

  1. MATLAB文件操作及读txt文件

    转自:http://blog.csdn.net/vblittleboy/article/details/8049748 文件操作是一种重要的输入输出方式,即从数据文件读取数据或将结果写入数据文件.MA ...

  2. 朗科U903 低级格式化后,量产错误:read onlypage (控制器芯片群联2251-03)的解决方案

    1. 下载群联量产工作 MPALL v3.63.0D for Netac 2. 在Setting页面,选择如下(红色矩形选中): 3. 然后执行量产,量产完成后,重新插拔就能看到U盘.

  3. Jzzhu and Cities

    CF #257 div2D:http://codeforces.com/contest/450/problem/D 题意:给你n个城市,m条无向有权边.另外还有k条边,每条边从起到到i.求可以删除这k ...

  4. UOJ 217 奇怪的线段树

    http://uoj.ac/problem/217 题意就不X了,思路在这: 居然一开始把sap里面的mn设置为inf了,我是傻逼.. #include<cstdio> #include& ...

  5. 【HDOJ】1271 整数对

    枚举,假设这个数x=a*10^(i+1)+b*10^i+c,去掉b后y=a*10^i+c,x+y=n,则x+y=n(mod10^i),求出c,注意c<10^i,但2*c有可能大于10^i,因此分 ...

  6. Matlab:回归分析(2)

    方法一:直接用多元二项式回归 %数据输入 x1 = [ ]; x2 = [ ]; %多元二项式回归函数 y = [ ]; X = [x1' x2']; Y = y'; rstool(X, Y, 'pu ...

  7. N - Marriage Match II - HDU 3081(最大流)

    题目大意:有一些男孩和女孩玩一个游戏,每个女孩都可以挑一个男孩来进行这个游戏(所有人都要参加),女孩只会挑选她喜欢的男孩,并且她们认为她们朋友喜欢的男孩她们也是喜欢的(朋友的男朋友也是我的男朋友??? ...

  8. DAY TRADER

    日内交易是一种交易模式,英文名字是daytrade,主要是指持仓时间短,不留过夜持仓的交易方式.日内交易捕捉入市后能够马上脱离入市成本的交易机会,入市之后如果不能马上获利,就准备迅速离场.因为这种交易 ...

  9. 港股street和nominee区别

    股票的street和nominee区别主要用在公司行动的过户费方面,street股票需要收取过户费,nominee不收过户费. street股票通过做公司行动收取过户费后会变成nominee股票,下次 ...

  10. Tiny语言执行环境TM机源码

    TM机就是TINY语言编译器编译之后的汇编代码的执行环境.TM机的主要功能是将TM的汇编代码读入和执行,它具有一般计算机类似的精简指令级RISC.TM汇编语言和一般的Intel汇编语言差点儿相同,包含 ...