- 浏览: 128679 次
- 性别:
- 来自: 成都
最新评论
-
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 1032手机游戏设计中由于设备性能限制,可能出现资源不足的情况 ... -
带进度和时间的播放器
2011-12-19 21:15 2852最近由于需要,做了一个音乐播放控制view,在上面需要能 * ... -
断点续传和下载原理分析
2011-12-07 15:22 14598最近做一个文件上传和下载的应用对文件上传和下载进行了一个完整的 ... -
Android Matrix理论与应用详解
2011-11-21 10:58 17559本文转自http://blog.csdn.net/kuku20 ... -
Android图片处理(Matrix,ColorMatrix)
2011-11-20 22:47 3217在编程中有时候需要对图片做特殊的处理,比如将图片做出黑 ... -
Android下基于XML的 Graphics(转载)
2011-04-23 15:39 1264Android下基于XML的 Graphi ... -
Android之父深入解析Android
2011-04-22 16:10 1007Android之父深入解析Android By: 海 ... -
实现ListView的条目下自动隐藏显示Button的方法
2011-04-17 09:42 6567这个想法是我在看了sina ... -
TabActivity中的Tab标签详细设置
2011-03-24 17:19 7207参考链接: http://www.iteye.com/ ...
相关推荐
重写onTouchEvent事件,实现上下左右滑动的小例子。
onInterceptTouchEvent和onTouchEvent调用关系详解
NULL 博文链接:https://2528.iteye.com/blog/1056731
分析Android中OnTouch事件的分发处理,以及当两个组件重叠时,如果处理触摸事件的分发,解决触摸事件冲突问题。
项目中总会用到一些触摸事件,每次使用都是百度各种资料,看各种大神的分析笔记。...3.对于不能添加子控件的view,不能对事件进行分发和拦截,它只有onTouchEvent事件。 二、三个方法 1.public bool
我们也许会遇到,自定义控件的触屏事件处理,先来了解一下View类中的,onTouch事件和onTouchEvent事件。 1、boolean onTouch(View v, MotionVent event) 触摸事件发送到视图时调用(v:视图,event:触摸事件) 返回...
轻松弄懂android事件分发机制解析 android 中的事件处理一直以来困扰不少刚刚从事android开发的同学,网上也有不少讲解android事件分发的文章,然而讲解的都不够简洁!现在我将用另一种简洁的方式来讲解android事件...
大家都知道,我们的activity中有onTouchEvent方法,可以用来实现触摸事件的监听。 activity的触摸事件 @Override public boolean onTouchEvent(MotionEvent event) { return super.onTouchEvent(event); } ...
但是源码的复杂往往会让新手产生畏惧难以理解,于是笔者最终还是打算使用实例log来让读者理解android事件分发。 #重要函数 笔者此次主要提及最常用的几个函数: (其间区别看源码很容易理解,此处直接给上结果) **...
安卓事件分发机制测试代码,事件传递从Activity-->ViewGroup-->View。dispatchTouchEvent,onInterceptTouchEvent,onTouchEvent这三个函数的返回值不同,代表的事件传递的不同。
本篇文章小编为大家介绍,Android onTouchEvent 与 onInterceptTouchEvent的区别详解。需要的朋友参考下
继承View类,实现触摸事件OnTouchEvent,使用菜单选项。
安卓Android事件分发处理 scrollview套scrollview+scrollview.其中viewpager下套listview 带悬浮框效果 viewpager可以左右切换。整体可上下滑动,当滑动到悬浮框的位置,嵌套的listview 可以滑到,悬浮停留在顶部。...
事件传递方法包括dispatchTouchEvent、onTouchEvent、onInterceptTouchEvent,其中前两个是View和ViewGroup都有的,最后一个是只有ViewGroup才有的方法。这三个方法的作用分别是负责事件分发、事件处理、事件拦截。 ...
NULL 博文链接:https://forlan.iteye.com/blog/2261417
下面小编就为大家带来一篇Android onTouchEvent事件中onTouch方法返回值(介绍)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧