最近在研究robotium的方法,在Scroller.java中有一个drag方法,如下:
/*** Simulate touching a specific location and dragging to a new location.** This method was copied from {@code TouchUtils.java} in the Android Open Source Project, and modified here.** @param fromX X coordinate of the initial touch, in screen coordinates* @param toX Xcoordinate of the drag destination, in screen coordinates* @param fromY X coordinate of the initial touch, in screen coordinates* @param toY Y coordinate of the drag destination, in screen coordinates* @param stepCount How many move steps to include in the drag*/public void drag(float fromX, float toX, float fromY, float toY,int stepCount) {long downTime = SystemClock.uptimeMillis();long eventTime = SystemClock.uptimeMillis();float y = fromY;float x = fromX;float yStep = (toY - fromY) / stepCount;float xStep = (toX - fromX) / stepCount;MotionEvent event = MotionEvent.obtain(downTime, eventTime,MotionEvent.ACTION_DOWN, fromX, fromY, 0);try {inst.sendPointerSync(event);} catch (SecurityException ignored) {}for (int i = 0; i < stepCount; ++i) {y += yStep;x += xStep;eventTime = SystemClock.uptimeMillis();event = MotionEvent.obtain(downTime, eventTime,MotionEvent.ACTION_MOVE, x, y, 0);try {inst.sendPointerSync(event);} catch (SecurityException ignored) {}}eventTime = SystemClock.uptimeMillis();event = MotionEvent.obtain(downTime, eventTime, MotionEvent.ACTION_UP,toX, toY, 0);try {inst.sendPointerSync(event);} catch (SecurityException ignored) {}}

里面有个MotionEvent的类,下面摘自网上的一篇博客,写的很好;

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------

android中的事件类型分为按键事件和屏幕触摸事件,Touch事件是屏幕触摸事件的基础事件,有必要对它进行深入的了解。
一个最简单的屏幕触摸动作触发了一系列Touch事件:ACTION_DOWN->ACTION_MOVE->ACTION_MOVE->ACTION_MOVE...->ACTION_MOVE->ACTION_UP
当屏幕中包含一个ViewGroup,而这个ViewGroup又包含一个子view,这个时候android系统如何处理Touch事件呢?到底是ViewGroup来处理Touch事件,还是子view来处理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
当TouchEvent发生时,首先Activity将TouchEvent传递给最顶层的View, TouchEvent最先到达最顶层 view 的 dispatchTouchEvent ,然后由  dispatchTouchEvent 方法进行分发,如果dispatchTouchEvent返回true ,则交给这个view的onTouchEvent处理,如果dispatchTouchEvent返回 false ,则交给这个 view 的 interceptTouchEvent 方法来决定是否要拦截这个事件,如果 interceptTouchEvent 返回 true ,也就是拦截掉了,则交给它的 onTouchEvent 来处理,如果 interceptTouchEvent 返回 false ,那么就传递给子 view ,由子 view 的 dispatchTouchEvent 再来开始这个事件的分发。如果事件传递到某一层的子 view 的 onTouchEvent 上了,这个方法返回了 false ,那么这个事件会从这个 view 往上传递,都是 onTouchEvent 来接收。而如果传递到最上面的 onTouchEvent 也返回 false 的话,这个事件就会“消失”,而且接收不到下一次事件。
通过语言描述这个处理逻辑很抽象,下面我就用代码来具体说明一下。
layout配置文件 main.xml
<?xml version="1.0" encoding="utf-8"?>
<test.lzqdiy.MyLinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="fill_parent"android:layout_height="fill_parent"android:gravity="center"android:orientation="vertical" ><test.lzqdiy.MyTextViewandroid:id="@+id/tv"android:layout_width="200px"android:layout_height="200px"android:background="#FFFFFF"android:text="lzqdiy"android:textColor="#0000FF"android:textSize="40sp"android:textStyle="bold" /></test.lzqdiy.MyLinearLayout>

三个java文件:

package test.lzqdiy;import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;public class MainActivity extends Activity
{@Overrideprotected void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}@Overridepublic boolean onCreateOptionsMenu(Menu menu){// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;}}
package test.lzqdiy;import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.widget.LinearLayout;public class MyLinearLayout extends LinearLayout {private final String TAG = "MyLinearLayout";public MyLinearLayout(Context context, AttributeSet attrs) {super(context, attrs);Log.d(TAG, TAG);}@Overridepublic boolean dispatchTouchEvent(MotionEvent ev) {int action = ev.getAction();switch (action) {case MotionEvent.ACTION_DOWN:Log.d(TAG, "dispatchTouchEvent action:ACTION_DOWN");break;case MotionEvent.ACTION_MOVE:Log.d(TAG, "dispatchTouchEvent action:ACTION_MOVE");break;case MotionEvent.ACTION_UP:Log.d(TAG, "dispatchTouchEvent action:ACTION_UP");break;case MotionEvent.ACTION_CANCEL:Log.d(TAG, "dispatchTouchEvent action:ACTION_CANCEL");break;}return super.dispatchTouchEvent(ev);}@Overridepublic boolean onInterceptTouchEvent(MotionEvent ev) {int action = ev.getAction();switch (action) {case MotionEvent.ACTION_DOWN:Log.d(TAG, "onInterceptTouchEvent action:ACTION_DOWN");break;case MotionEvent.ACTION_MOVE:Log.d(TAG, "onInterceptTouchEvent action:ACTION_MOVE");break;case MotionEvent.ACTION_UP:Log.d(TAG, "onInterceptTouchEvent action:ACTION_UP");break;case MotionEvent.ACTION_CANCEL:Log.d(TAG, "onInterceptTouchEvent action:ACTION_CANCEL");break;}return false;}@Overridepublic boolean onTouchEvent(MotionEvent ev) {int action = ev.getAction();switch (action) {case MotionEvent.ACTION_DOWN:Log.d(TAG, "---onTouchEvent action:ACTION_DOWN");break;case MotionEvent.ACTION_MOVE:Log.d(TAG, "---onTouchEvent action:ACTION_MOVE");break;case MotionEvent.ACTION_UP:Log.d(TAG, "---onTouchEvent action:ACTION_UP");break;case MotionEvent.ACTION_CANCEL:Log.d(TAG, "---onTouchEvent action:ACTION_CANCEL");break;}return true;}}
package test.lzqdiy;import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.widget.TextView;public class MyTextView extends TextView
{private final String TAG = "MyTextView";public MyTextView(Context context, AttributeSet attrs){super(context, attrs);}@Overridepublic boolean dispatchTouchEvent(MotionEvent ev){int action = ev.getAction();switch (action){case MotionEvent.ACTION_DOWN:Log.d(TAG, "dispatchTouchEvent action:ACTION_DOWN");break;case MotionEvent.ACTION_MOVE:Log.d(TAG, "dispatchTouchEvent action:ACTION_MOVE");break;case MotionEvent.ACTION_UP:Log.d(TAG, "dispatchTouchEvent action:ACTION_UP");break;case MotionEvent.ACTION_CANCEL:Log.d(TAG, "onTouchEvent action:ACTION_CANCEL");break;}return super.dispatchTouchEvent(ev);}@Overridepublic boolean onTouchEvent(MotionEvent ev){int action = ev.getAction();switch (action){case MotionEvent.ACTION_DOWN:Log.d(TAG, "---onTouchEvent action:ACTION_DOWN");break;case MotionEvent.ACTION_MOVE:Log.d(TAG, "---onTouchEvent action:ACTION_MOVE");break;case MotionEvent.ACTION_UP:Log.d(TAG, "---onTouchEvent action:ACTION_UP");break;case MotionEvent.ACTION_CANCEL:Log.d(TAG, "---onTouchEvent action:ACTION_CANCEL");break;}return true;}}
为了指代方便,下面将MyLinearLayout简称为L,将MyTextView简称为T,L.onInterceptTouchEvent=true 表示的含义为MyLinearLayout中的onInterceptTouchEvent方法返回值为true,通过程序运行时输出的Log来说明调用时序。
第1种情况 L.onInterceptTouchEvent=false&& L.onTouchEvent=true &&T.onTouchEvent=true 输出下面的Log:
D/MyLinearLayout(11865): dispatchTouchEvent action:ACTION_DOWN
D/MyLinearLayout(11865): onInterceptTouchEvent action:ACTION_DOWN
D/MyTextView(11865): dispatchTouchEvent action:ACTION_DOWN
D/MyTextView(11865): ---onTouchEvent action:ACTION_DOWN
D/MyLinearLayout(11865): dispatchTouchEvent action:ACTION_MOVE
D/MyLinearLayout(11865): onInterceptTouchEvent action:ACTION_MOVE
D/MyTextView(11865): dispatchTouchEvent action:ACTION_MOVE
D/MyTextView(11865): ---onTouchEvent action:ACTION_MOVE
...........省略其他的ACTION_MOVE事件Log
D/MyLinearLayout(11865): dispatchTouchEvent action:ACTION_UP
D/MyLinearLayout(11865): onInterceptTouchEvent action:ACTION_UP
D/MyTextView(11865): dispatchTouchEvent action:ACTION_UP
D/MyTextView(11865): ---onTouchEvent action:ACTION_UP
结论:TouchEvent完全由TextView处理。
第2种情况  L.onInterceptTouchEvent=false&& L.onTouchEvent=true &&T.onTouchEvent=false 输出下面的Log:
D/MyLinearLayout(13101): dispatchTouchEvent action:ACTION_DOWN
D/MyLinearLayout(13101): onInterceptTouchEvent action:ACTION_DOWN
D/MyTextView(13101): dispatchTouchEvent action:ACTION_DOWN
D/MyTextView(13101): ---onTouchEvent action:ACTION_DOWN
D/MyLinearLayout(13101): ---onTouchEvent action:ACTION_DOWN
D/MyLinearLayout(13101): dispatchTouchEvent action:ACTION_MOVE
D/MyLinearLayout(13101): ---onTouchEvent action:ACTION_MOVE
...........省略其他的ACTION_MOVE事件Log
D/MyLinearLayout(13101): dispatchTouchEvent action:ACTION_UP
D/MyLinearLayout(13101): ---onTouchEvent action:ACTION_UP
结论:TextView只处理了ACTION_DOWN事件,LinearLayout处理了所有的TouchEvent。
第3种情况  L.onInterceptTouchEvent=true&& L.onTouchEvent=true 输出下面的Log:
D/MyLinearLayout(13334): dispatchTouchEvent action:ACTION_DOWN
D/MyLinearLayout(13334): onInterceptTouchEvent action:ACTION_DOWN
D/MyLinearLayout(13334): ---onTouchEvent action:ACTION_DOWN
D/MyLinearLayout(13334): dispatchTouchEvent action:ACTION_MOVE
D/MyLinearLayout(13334): ---onTouchEvent action:ACTION_MOVE
...........省略其他的ACTION_MOVE事件Log
D/MyLinearLayout(13334): dispatchTouchEvent action:ACTION_UP
D/MyLinearLayout(13334): ---onTouchEvent action:ACTION_UP
结论:LinearLayout处理了所有的TouchEvent。
第4种情况  L.onInterceptTouchEvent=true&& L.onTouchEvent=false 输出下面的Log:
D/MyLinearLayout(13452): dispatchTouchEvent action:ACTION_DOWN
D/MyLinearLayout(13452): onInterceptTouchEvent action:ACTION_DOWN
D/MyLinearLayout(13452): ---onTouchEvent action:ACTION_DOWN
结论:LinearLayout只处理了ACTION_DOWN事件,那么其他的TouchEvent被谁处理了呢?答案是LinearLayout最外层的Activity处理了TouchEvent。

关于motionevent的使用相关推荐

  1. MotionEvent的getX(),getY()与getRawX(),getRawY()区别

    getX()是表示Widget相对于自身左上角的x坐标,而getRawX()是表示相对于屏幕左上角的x坐标值(注意:这个屏幕左上角是手机屏幕左上角,不管activity是否有titleBar或是否全屏 ...

  2. Android 多点触控 MotionEvent详解

    相关API 介绍 MotionEvent.getY() 和 MotionEvent.getRawY() 的区别 getY 表示触摸事件在当前的View内的Y 坐标, getRawY表示触摸事件在整个屏 ...

  3. android MotionEvent

    getAction() 获取事件的类型,这是一个组合值,由pointer的index值和事件类型值组合而成的 getActionMasked() 获取事件的类型,不具有其他信息 参考: http:// ...

  4. iOS开展——全球应对MotionEvent

    遇到这样的要求:无论在哪个应用程序view controller,摇动手机,我们可以启动的方法. 你可以认为这个想法是使用包装的苹果"MotionEvent".但是,假如简单地把代 ...

  5. android MotionEvent中getX()和getRawX()的区别

    今天,讲讲触摸时间里  getX()和getRawX()的区别. 如上图所示: getRowX:触摸点相对于屏幕的坐标 getX: 触摸点相对于按钮的坐标 getTop: 按钮左上角相对于父vie ...

  6. Android MotionEvent中getX()、getRawX()和getTop()的区别

    为了展示getX().getRawX()和getTop()方法的区别,我们写了一个简单的测试Demo,我们写了一个自定义控件(继承ImageView). package com.demo.ui;imp ...

  7. MotionEvent事件在onInterceptTouchEvent()、onTouchEvent()中的传递顺序

    onInterceptTouchEvent()用于处理事件并改变事件的传递方向.处理事件这个不用说了,你在函数内部编写代码处理就可以了.而决定传递方向的是返回值,返回为false时事件会传递给子控件的 ...

  8. 触控事件MotionEvent

    MotionEvent中封装的一些常用的事件常量: //单点触摸按下动作 public static final int ACTION_DOWN = 0; //单点触摸抬起动作 public stat ...

  9. GridView(网格视图)+MotionEvent(触控事件)实现可以拖动排序的网格图

    1.一触碰,就回调onInterceptTouchEvent(MotionEvent ev)事件,每次的触碰都只回调一次,接着只要还没有放手,就一直回调onTouchEvent(MotionEvent ...

  10. 【Android 事件分发】MotionEvent.ACTION_DOWN 按下事件分发流程( Activity | ViewGroup | View )

    Android 事件分发 系列文章目录 [Android 事件分发]事件分发源码分析 ( 驱动层通过中断传递事件 | WindowManagerService 向 View 层传递事件 ) [Andr ...

最新文章

  1. 最新计算机技能需求排名出炉:Python仅排第三,第一你猜得到吗?(附链接)...
  2. MicroPython实例之TPYBoardv102自动浇花系统
  3. c# 访问hbase_C#教程之通过Thrift实现C#与Hbase交流
  4. linux下使用VS CODE + CMAKE 调试C++程序
  5. NOIP 2007 普及组初赛试题(C++)(含答案)
  6. oracle 查看动态性能视图,oracle常用动态性能视图
  7. GCD之barrier
  8. python项目结构图_python 项目目录结构设置
  9. 当了几年面试官看了无数简历,你们可以认真写简历吗?
  10. Linux搭建邮件服务器postfix
  11. 遗传算法求解TSP问题及MTATLAB代码
  12. Java项目:ssm电影院购票系统
  13. c语言贪吃蛇程序设计报告蚂蚁文库,贪吃蛇游戏C程序设计报告
  14. 分享几个Ubuntu必装的软件
  15. 塑胶模具设计-双色注塑模具设计36条经典经验分享
  16. php 编码转换 乱码解决
  17. oracle grant
  18. 游戏贴图打包工具——TexturePacker详解
  19. 表单提交成功后重置表单
  20. sata3.0 linux内核,编译Linux内核3.0系统出现的警告信息

热门文章

  1. MacOS使用conan
  2. html 如何完美的显示图片,不拉伸图片,完整显示等等。
  3. 2022 百度面试题
  4. 美国云主机如何保证数据安全?
  5. php中的ol标签,html ol标签的使用与定义详解
  6. html导出pdf及word,保留完成样式以及格式调研
  7. Introduction to Graph Neural Network(图神经网络概论)翻译:Chapter2:Basic of Math and Graph
  8. 计算机网络互连基础技术及实战
  9. 网站项目计划书的写法如何写网站设计策划书
  10. 【无标题】https://e-cloudstore.com/ec/api/applist/index.html#/