Android触摸事件的分发机制
---恢复内容开始---
一、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触摸事件的分发机制的更多相关文章
- Android触摸事件的应用
前言 上一篇讲了Android触摸事件的传递机制,具体可以看这里 初识Android触摸事件传递机制.既然知道Android中触摸事件的传递分发,那么它能解决什么样的问题,在我们实际开发中如何应用,这 ...
- android自定义控件(9)-Android触摸事件分发机制
触摸事件的传递机制: 首先是最外层的viewgroup接收到事件,然后调用会调用自己的dispatchTouchEvent方法.如果在ACTION_DOWN的时候dispatchTouchEven ...
- 初识Android触摸事件传递机制
前言 今天总结的一个知识点是Andorid中View事件传递机制,也是核心知识点,相信很多开发者在面对这个问题时候会觉得困惑,另外,View的另外一个难题滑动冲突,比如在ScrollView中嵌套Li ...
- 一个demo让你彻底理解Android中触摸事件的分发
注:本文涉及的demo的地址:https://github.com/absfree/TouchDispatch 1. 触摸动作及事件序列 (1)触摸事件的动作 触摸动作一共有三种:ACTION_DOW ...
- Android触摸事件传递机制
简单梳理一下Android触摸事件传递机制的知识点. 一.View与ViewGroup的关系 View和ViewGroup二者的继承关系如下图所示: View是Android中最基本的一种UI组件,它 ...
- 【知识梳理1】Android触摸事件机制
前言 随着科学技术的发展,智能手机早已成为我们当代人身边不可缺少的"伙伴"之中的一个,堪比对象女友.每天我们对着手机反复的做着点击.滑动操作,而手机则随着我们的操作给我们展示她的精 ...
- 一个demo让你彻底理解Android触摸事件的并发
注:本文涉及的demo的地址:https://github.com/absfree/TouchDispatch 1. 触摸动作及事件序列 (1)触摸事件的动作 触摸动作一共有三种:ACTION_DOW ...
- View,ViewGroup的Touch事件的分发机制
原帖地址:http://blog.csdn.net/xiaanming/article/details/21696315 ViewGroup的事件分发机制 我们用手指去触摸Android手机屏幕,就会 ...
- Andriod 从源码的角度详解View,ViewGroup的Touch事件的分发机制
转自:xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/21696315) 今天这篇文章主要分析的是Android的事件分发机制, ...
随机推荐
- 如何将github上的微信客户端类库能够通过composer工具下载
我将自己开发的微信客户端类库放到了github上面去了. 然后我在我的项目里面添加了一个composer.json文件 内容如下 { "require": { "weix ...
- What qualities characterize a great PhD student
省理工计算机教授David Karger接触了许多世界上最杰出的博士生,近日总结出了优秀博士通常具备的五点品质:0 过人的智力 1 好奇心 2 创造力 3 纪律性与生产力 4 与观众沟通 5 与伙伴沟 ...
- 解决xp下无法通过windows installer服务安装此安装程序包。您必须安装带有更新版本Wi
今天装 tortoisegit 的时候发现安装包不能使用.报错无法通过windows installer服务安装此安装程序包.您必须安装带有更新版本Windows Installer服务的Window ...
- poj Building a Space Station
http://poj.org/problem?id=2031 #include<cstdio> #include<cstring> #include<cmath> ...
- CENTOS纯手工安装LAMP+PHPMYADMIN
现在,安装这些确实越来越方便了. Installing Apache2 With PHP5 And MySQL Support On CentOS 6.4 (LAMP) 参考URL: http://w ...
- [EXCEL] 在单元格中自动输入时间和日期
选中需输入的单元格,直接按下“Ctrl+:”组合键可输入当前日期:如果直接按下“Ctrl+Shift+:”组合键即可输入当前时间:当然也可以在单元格中先输入其他文字然后再按以上组合键,如先输入“当前时 ...
- 如何通过HOOK改变windows的API函数(找到函数的相对偏移)
我们知道,系统函数都是以DLL封装起来的,应用程序应用到系统函数时,应首先把该DLL加载到当前的进程空间中,调用的系统函数的入口地址,可以通过GetProcAddress函数进行获取.当系统函数进行调 ...
- COJN 0575 800601滑雪
800601滑雪 难度级别:B: 运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激.可是 ...
- Delphi TNativeXML Node节点乱码的一种解决方法
Node1.WriteString(HomologousFieldItem.cXMLNodeCode, AnsiToUtf8(FieldByName(HomologousFieldItem.cMapp ...
- windows下的类似grep命令findstr
windows下的类似grep命令findstr findstr后面跟的字符串不能加引号 C:\Users\Administrator>netstat -an|findstr 10.1.151 ...