android touchEvent事件学习

学习网址:http://www.apkbus.com/forum.php?mod=viewthread&tid=44296

1:Android Touch事件传递机制解析

android系统中的每个View的子类都具有下面三个和TouchEvent处理密切相关的方法:

1)public boolean dispatchTouchEvent(MotionEvent ev)   分发TouchEvent

2)public boolean onInterceptTouchEvent(MotionEvent ev)  拦截TouchEvent

3)public boolean onTouchEvent(MotionEvent ev) 处理TouchEvent

2、传递流程

(1) 事件从Activity.dispatchTouchEvent()开始传递,只要没有被停止或拦截,从最上层的View(ViewGroup)开始一直往下(子View)传递。子View可以通过onTouchEvent()对事件进行处理。

(2) 事件由父View(ViewGroup)传递给子View,ViewGroup可以通过onInterceptTouchEvent()对事件做拦截,停止其往下传递。

(3) 如果事件从上往下传递过程中一直没有被停止,且最底层子View没有消费事件,事件会反向往上传递,这时父View(ViewGroup)可以进行消费,如果还是没有被消费的话,最后会到Activity的onTouchEvent()函数。

(4) 如果View没有对ACTION_DOWN进行消费,之后的其他事件不会传递过来。

(5) OnTouchListener优先于onTouchEvent()对事件进行消费。

上面的消费即表示相应函数返回值为true。

下面看个实例:定义了2种状态

状态1:由center处理Touch事件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >
    <dk.touch.MyLayout
        android:id="@+id/out"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:gravity="center"
            android:background="#ff345600"
         >
        <dk.touch.MyLayout
            android:id="@+id/middle"
            android:layout_width="200dp"
            android:layout_height="200dp"
            android:gravity="center"
            android:background="#ff885678"
            >
            <dk.touch.MyLayout
                android:id="@+id/center"
                android:layout_width="50dp"
                android:layout_height="50dp"
                android:background="#ff345678"
                android:focusable="true"
                android:focusableInTouchMode="true"
                android:clickable="true"
                 >
            </dk.touch.MyLayout>
        </dk.touch.MyLayout>
    </dk.touch.MyLayout>
</LinearLayout>

处理机制效果图:

状态2:都不处理事件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >
    <dk.touch.MyLayout
        android:id="@+id/out"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:gravity="center"
            android:background="#ff345600"
         >
        <dk.touch.MyLayout
            android:id="@+id/middle"
            android:layout_width="200dp"
            android:layout_height="200dp"
            android:gravity="center"
            android:background="#ff885678"
            >
            <dk.touch.MyLayout
                android:id="@+id/center"
                android:layout_width="50dp"
                android:layout_height="50dp"
                android:background="#ff345678"
                 >
            </dk.touch.MyLayout>
        </dk.touch.MyLayout>
    </dk.touch.MyLayout>
</LinearLayout>

处理机制效果图:

继续学习中

时间: 2024-10-15 18:03:16

android touchEvent事件学习的相关文章

【转】Android TouchEvent事件传递机制

Android TouchEvent事件传递机制 跟touch事件相关的3个方法: public boolean dispatchTouchEvent(MotionEvent ev);    //用来分派event public boolean onInterceptTouchEvent(MotionEvent ev); //用来拦截event public boolean onTouchEvent(MotionEvent ev);          //用来处理event 拥有这三个方法的类:

Android TouchEvent事件传递机制

跟touch事件相关的3个方法: public boolean dispatchTouchEvent(MotionEvent ev);    //用来分派event public boolean onInterceptTouchEvent(MotionEvent ev); //用来拦截event public boolean onTouchEvent(MotionEvent ev);          //用来处理event 拥有这三个方法的类: Activity类: Activity disp

【转载+整理】Android中TouchEvent事件分析

原文地址:http://mobile.51cto.com/abased-374715.htm 一.知识回顾 一个最简单的屏幕触摸动作触发了一系列Touch事件:ACTION_DOWN->ACTION_MOVE->ACTION_MOVE->ACTION_MOVE...->ACTION_MOVE->ACTION_UP 二.问题提出 当屏幕中包含一个ViewGroup,而这个ViewGroup又包含一个子view,这个时候android系统如何处理Touch事件呢?到底是 View

Android Touch事件传递机制详解 上

尊重原创:http://blog.csdn.net/yuanzeyao/article/details/37961997 最近总是遇到关于Android Touch事件的问题,如:滑动冲突的问题,以前也花时间学习过Android Touch事件的传递机制,可以每次用起来的时候总是忘记了,索性自己总结一下写篇文章避免以后忘记了,其实网上关于Touch事件的传递的文章真的很多,但是很少有系统性的,都是写了一个简单的demo运行了一下,对于我们了解Android Touch事件基本上没有任何帮助. 今

Android touch 事件传递机制

前言: (1)在自定义view的时候经常会遇到事件拦截处理,比如在侧滑菜单的时候,我们希望在侧滑菜单里面有listview控件,但是我们希望既能左右滑动又能上下滑动,这个时候就需要对触摸的touch事件进行拦截.这个时候我们就需要明白android touch 事件传递机制, (2)以前很多时候比较模糊,也许是网上看到也有很多事件传递的相关文章,但我看着头晕,解释不彻底,有的说得一半,总算不满足不满意,于是据我自己的理解来彻底的来整理下具体的是怎么个传递方式,分享给大家,希望大家看到有什么不对的

Android -- TouchEvent的分发和截获方式

Android系统中的每个ViewGroup的子类都具有下面三个和TouchEvent处理密切相关的方法: public boolean dispatchTouchEvent(MotionEvent ev) // 这个方法用来分发TouchEvent public boolean onInterceptTouchEvent(MotionEvent ev) //这个方法用来拦截TouchEvent public boolean onTouchEvent(MotionEvent ev) //这个方法

[Android游戏开发学习笔记]View和SurfaceView

本文为阅读http://blog.csdn.net/xiaominghimi/article/details/6089594的笔记. 在Android游戏中充当主要角色的,除了控制类就是显示类.而在Android中涉及到显示的是View类,及继承自它的SurfaceView类和SurfaceView的其他子类等. 这里先只说View和SurfaceView.SurfaceView的直接子类有GLSurfaceView和VideoView,可以看出GL和视频播放以及CAmera摄像头一般均使用Su

Android Afinal框架学习(二) FinalActivity 一个IOC框架

框架地址:https://github.com/yangfuhai/afinal 对应的源码: net.tsz.afinal.annotation.view.* FinalActivity FinalActivity是一个基础类,结合注解实现了,依赖注入(view的资源id,常用的监听器), 利用set方式注入 完全注解方式就可以进行UI绑定和事件绑定,无需findViewById和set event Listener 这个过程:initInjectedView>findViewById.set

android Touch事件传递小结

这次还是先贴上测试代码吧.. 主布局文件是个三层结构,最外层和中间层都是LinearLayout的子类,里层是个TextView: <com.example.touchevent.OutterLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/o