- 浏览: 131468 次
- 性别:
- 来自: 成都
最新评论
-
yi_chao_jiang:
你好,多谢分享,问个问题,在上传数据的时候判断文件是否有上传记 ...
断点续传和下载原理分析 -
a41606709:
为什么我的tabhost显示不出来? 怎么设置在全部页面中让他 ...
TabActivity中的Tab标签详细设置 -
Zero颴:
大神篇,思路,配图都很清晰,perfect!
Android事件模型之interceptTouchEvnet ,onTouchEvent关系正解 -
QAZ503602501:
牛死人了!!!
B-树 -
mengsina:
很牛的文档。数学功底好啊
Android Matrix理论与应用详解
Android事件模型之interceptTouchEvnet ,onTouchEvent关系正解
- 博客分类:
- Android开发
参考文档:
http://blog.csdn.net/liutao5757124/article/details/6097125
首先,看Android的官方文档正解
onInterceptTouchEvent()与onTouchEvent()的机制:
1. down事件首先会传递到onInterceptTouchEvent()方法
2. 如果该ViewGroup的onInterceptTouchEvent()在接收到down事件处理完成之后return false,
那么后续的move, up等事件将继续会先传递给该ViewGroup,之后才和down事件一样传递给最
终的目标view的onTouchEvent()处理
3. 如果该ViewGroup的onInterceptTouchEvent()在接收到down事件处理完成之后return true,
那么后续的move, up等事件将不再传递给onInterceptTouchEvent(),而是和down事件一样
传递给该ViewGroup的onTouchEvent()处理,注意,目标view将接收不到任何事件。
4. 如果最终需要处理事件的view的onTouchEvent()返回了false,那么该事件将被传递至其上一
层次的view的onTouchEvent()处理
5. 如果最终需要处理事件的view 的onTouchEvent()返回了true,那么后续事件将可以继续传递
给该view的onTouchEvent()处理
这是官方文档的说法,要是自己没亲自去写个程序观察哈,基本上没法理解,所以上程序先,然后分析:
布局文件main.xml
<?xml version="1.0" encoding="utf-8"?>
<com.hao.LayoutView1 xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent">
<com.hao.LayoutView2
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent" android:gravity="center">
<com.hao.MyTextView
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:id="@+id/tv" android:text="AB" android:textSize="40sp"
android:textStyle="bold" android:background="#FFFFFF"
android:textColor="#0000FF" />
</com.hao.LayoutView2>
</com.hao.LayoutView1>
第一层自定义布局LayoutView1.java
package com.hao;
import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.widget.LinearLayout;
public class LayoutView1 extends LinearLayout {
private final String TAG = "LayoutView1";
public LayoutView1(Context context, AttributeSet attrs) {
super(context, attrs);
Log.e(TAG,TAG);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
int action = ev.getAction();
switch(action){
case MotionEvent.ACTION_DOWN:
Log.e(TAG,"onInterceptTouchEvent action:ACTION_DOWN");
// return true; 在这就拦截了,后面的就不会得到事件
break;
case MotionEvent.ACTION_MOVE:
Log.e(TAG,"onInterceptTouchEvent action:ACTION_MOVE");
break;
case MotionEvent.ACTION_UP:
Log.e(TAG,"onInterceptTouchEvent action:ACTION_UP");
break;
case MotionEvent.ACTION_CANCEL:
Log.e(TAG,"onInterceptTouchEvent action:ACTION_CANCEL");
break;
}
return false;
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
int action = ev.getAction();
switch(action){
case MotionEvent.ACTION_DOWN:
Log.e(TAG,"onTouchEvent action:ACTION_DOWN");
break;
case MotionEvent.ACTION_MOVE:
Log.e(TAG,"onTouchEvent action:ACTION_MOVE");
break;
case MotionEvent.ACTION_UP:
Log.e(TAG,"onTouchEvent action:ACTION_UP");
break;
case MotionEvent.ACTION_CANCEL:
Log.e(TAG,"onTouchEvent action:ACTION_CANCEL");
break;
}
return true;
// return false;
}
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
// TODO Auto-generated method stub
super.onLayout(changed, l, t, r, b);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
// TODO Auto-generated method stub
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
}
第二层布局LayoutView2.java
package com.hao;
import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.widget.LinearLayout;
public class LayoutView2 extends LinearLayout {
private final String TAG = "LayoutView2";
public LayoutView2(Context context, AttributeSet attrs) {
super(context, attrs);
Log.e(TAG,TAG);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
int action = ev.getAction();
switch(action){
case MotionEvent.ACTION_DOWN:
Log.e(TAG,"onInterceptTouchEvent action:ACTION_DOWN");
// return true;
break;
case MotionEvent.ACTION_MOVE:
Log.e(TAG,"onInterceptTouchEvent action:ACTION_MOVE");
break;
case MotionEvent.ACTION_UP:
Log.e(TAG,"onInterceptTouchEvent action:ACTION_UP");
break;
case MotionEvent.ACTION_CANCEL:
Log.e(TAG,"onInterceptTouchEvent action:ACTION_CANCEL");
break;
}
return false;
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
int action = ev.getAction();
switch(action){
case MotionEvent.ACTION_DOWN:
Log.e(TAG,"onTouchEvent action:ACTION_DOWN");
break;
case MotionEvent.ACTION_MOVE:
Log.e(TAG,"onTouchEvent action:ACTION_MOVE");
break;
case MotionEvent.ACTION_UP:
Log.e(TAG,"onTouchEvent action:ACTION_UP");
break;
case MotionEvent.ACTION_CANCEL:
Log.e(TAG,"onTouchEvent action:ACTION_CANCEL");
break;
}
// return true;
return false;
}
}
自定义MyTextView.java
package com.hao;
import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.widget.TextView;
public class MyTextView extends TextView {
private final String TAG = "MyTextView";
public MyTextView(Context context, AttributeSet attrs) {
super(context, attrs);
Log.e(TAG,TAG);
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
int action = ev.getAction();
switch(action){
case MotionEvent.ACTION_DOWN:
Log.e(TAG,"onTouchEvent action:ACTION_DOWN");
break;
case MotionEvent.ACTION_MOVE:
Log.e(TAG,"onTouchEvent action:ACTION_MOVE");
break;
case MotionEvent.ACTION_UP:
Log.e(TAG,"onTouchEvent action:ACTION_UP");
break;
case MotionEvent.ACTION_CANCEL:
Log.e(TAG,"onTouchEvent action:ACTION_CANCEL");
break;
}
return false;
// return true;
}
public void onClick(View v) {
Log.e(TAG, "onClick");
}
public boolean onLongClick(View v) {
Log.e(TAG, "onLongClick");
return false;
}
}
其实代码很简单,就是自定义了View,在View里面都重写了interceptTouchEvnet (),和onTouchEvent(),然后测试其返回值,对监听的影响,关键是自己动手,逐个测试,并预测结果,等你能预测结果的时候,也就懂了,需要修改的地方就是interceptTouchEvnet 和onTouchEvent的返回值,他们决定了事件监听的流程,下面我画了一张图,如有不足之处欢迎指正,谢谢!
下面是我的正解:
下附源代码:
发表评论
-
手机游戏的优化
2012-05-14 15:46 1067手机游戏设计中由于设备性能限制,可能出现资源不足的情况 ... -
带进度和时间的播放器
2011-12-19 21:15 2919最近由于需要,做了一个音乐播放控制view,在上面需要能 * ... -
断点续传和下载原理分析
2011-12-07 15:22 14661最近做一个文件上传和下载的应用对文件上传和下载进行了一个完整的 ... -
Android Matrix理论与应用详解
2011-11-21 10:58 17634本文转自http://blog.csdn.net/kuku20 ... -
Android图片处理(Matrix,ColorMatrix)
2011-11-20 22:47 3261在编程中有时候需要对图片做特殊的处理,比如将图片做出黑 ... -
Android下基于XML的 Graphics(转载)
2011-04-23 15:39 1302Android下基于XML的 Graphi ... -
Android之父深入解析Android
2011-04-22 16:10 1038Android之父深入解析Android By: 海 ... -
实现ListView的条目下自动隐藏显示Button的方法
2011-04-17 09:42 6610这个想法是我在看了sina ... -
TabActivity中的Tab标签详细设置
2011-03-24 17:19 7284参考链接: http://www.iteye.com/ ...
相关推荐
在Android开发中,理解和掌握`onInterceptTouchEvent`与`onTouchEvent`的调用时序至关重要,因为它们是实现触摸事件处理的关键。这两个方法都属于Android的触摸事件处理机制,涉及到了ViewGroup与子View之间的事件...
这篇文章将深入探讨这两个方法的调用关系及其在Android事件分发机制中的作用。 首先,我们要理解Android的事件分发链。当用户在屏幕上触摸时,系统会产生一个MotionEvent对象,这个对象包含了触摸事件的详细信息,...
在Android开发中,触摸事件是用户与应用交互的重要方式,特别是在移动设备上。`onTouchEvent`是处理触摸事件的主要方法,它可以捕捉用户的点击、滑动等手势。本篇将详细讲解如何通过重写`onTouchEvent`来实现上下...
在Android开发中,事件处理是UI交互的核心部分。事件派发机制确保了用户与界面的交互能够正确地被处理和响应。本示例"android事件派发验证demo"旨在帮助开发者深入理解并验证这一机制。下面我们将详细探讨Android...
本教程将深入探讨如何在Android环境中实现自定义的触控事件,即“发送模型基于安卓点触事件”。 一、Android触摸事件基础 Android的触摸事件主要由MotionEvent类表示,它包含了触摸屏幕的各种动作,如ACTION_DOWN...
在Android系统中,事件分发流程是用户与应用程序交互的核心机制。它决定了用户在屏幕上点击、滑动等操作如何被各个UI元素正确处理。本文将深入解析Android事件分发的详细过程,帮助开发者理解这一关键机制。 事件...
在Android开发中,事件传递是应用界面交互的关键部分,尤其是触摸事件(Touch Event)的处理。本示例“android事件传递demo”旨在演示如何在Android应用程序中管理触摸事件的分发流程,帮助开发者理解并有效地处理用户...
在Android开发中,事件分发、拦截和处理是UI交互中的关键部分,它涉及到Activity、ViewGroup和View之间的协作。事件通常指的是用户与屏幕上的控件进行交互时产生的触摸事件,如点击、滑动等。下面我们将深入探讨这一...
Android事件处理机制是Android...总之,Android事件处理机制是开发者必须掌握的核心技能之一,它涉及到用户交互、事件分发和事件消费等多个环节。通过深入学习和实践,我们可以创建更加响应灵敏、用户友好的应用程序。
在Android开发中,事件分发机制是理解和优化用户交互界面不可或缺的部分。事件主要指的是用户的触摸操作,例如点击、滑动等。当用户在屏幕上进行操作时,这些事件会经过一系列的处理和分发,最终到达相应的View进行...
在Android开发中,事件分发机制是理解和优化用户交互界面不可或缺的部分。本文将深入探讨“Android事件分发机制总结Demo”,结合代码实例MyTouchEventDemo,帮助开发者清晰理解这一核心概念。 事件分发机制主要涉及...
在Android开发中,`View`的触摸事件处理是至关重要的,特别是当我们需要同时处理点击、长按以及滑动事件时。`OnTouchEvent`是`View`接收触摸输入的主要方法,而`onClick`、`onLongClick`和左右移动事件则是在用户与...
Android事件分发机制主要涉及三个方法:`onTouchEvent()`、`dispatchTouchEvent()`和`onInterceptTouchEvent()`。它们在ViewGroup(包含多个子View的容器)和View之间协同工作,决定了事件的流向。 1. **事件传递**...
在Android开发中,事件分发机制是至关重要的一个部分,它决定了用户与界面交互时,事件如何在不同的组件之间传递和处理。本文将基于“Android事件分发机制全解析Demo”进行深入探讨,并通过实际的代码示例来帮助你更...
在Android系统中,事件分发机制是用户与应用程序交互的核心环节。它决定了用户在屏幕上点击、滑动等操作如何被正确地处理和响应。本文将深入探讨Android事件分发机制,帮助开发者理解这一关键概念。 首先,我们从...
Android 事件传递机制是Android应用开发中的重要组成部分,它决定了用户与界面交互时事件如何在View和ViewGroup之间流动和处理。在这个机制中,我们主要关注三个关键概念:事件的分发(dispatchTouchEvent)、事件的...
Android事件分发涉及三个阶段:`dispatchTouchEvent()`、`onInterceptTouchEvent()`和`onTouchEvent()`。事件首先由父View处理,然后可能被拦截并交给子View,或者按照正常的事件传递顺序向下传递。整个过程形成了...
在Android中,事件分发机制涉及到三个核心方法:`dispatchTouchEvent()`、`onInterceptTouchEvent()` 和 `onTouchEvent()`。这三个方法协同工作,共同决定了事件的流向。 - **dispatchTouchEvent()**:此方法负责将...
在Android开发中,事件分发机制是至关重要的一个部分,它决定了用户与应用程序交互时,事件如何在View、 ViewGroup及Activity之间传递。本篇将基于"android事件分发机制学习代码二"的示例,深入解析Android事件分发...