手机屏幕事件的处理方法onTouchEvent。该方法在View类中的定义,并且所有的View子类全部重写了该方法,应用程序可以通过该方法处理手机屏幕的触摸事件。该方法的签名如下所示。

  1. public boolean onTouchEvent(MotionEvent event)

参数event:参数event为手机屏幕触摸事件封装类的对象,其中封装了该事件的所有信息,例如触摸的位置、触摸的类型以及触摸的时间等。该对象会在用户触摸手机屏幕时被创建。

返回值:该方法的返回值机理与键盘响应事件的相同,同样是当已经完整地处理了该事件且不希望其他回调方法再次处理时返回true,否则返回false。

该方法并不像之前介绍过的方法只处理一种事件,一般情况下以下三种情况的事件全部由onTouchEvent方法处理,只是三种情况中的动作值不同。

屏幕被按下:当屏幕被按下时,会自动调用该方法来处理事件,此时MotionEvent.getAction()的值为MotionEvent.ACTION_DOWN,如果在应用程序中需要处理屏幕被按下的事件,只需重新该回调方法,然后在方法中进行动作的判断即可。

屏幕被抬起:当触控笔离开屏幕时触发的事件,该事件同样需要onTouchEvent方法来捕捉,然后在方法中进行动作判断。当MotionEvent.getAction()的值为MotionEvent.ACTION_UP时,表示是屏幕被抬起的事件。

在屏幕中拖动:该方法还负责处理触控笔在屏幕上滑动的事件,同样是调用MotionEvent.getAction()方法来判断动作值是否为MotionEvent.ACTION_MOVE再进行处理。

Android Touch Screen 与传统Click Touch Screen不同,会有一些手势(Gesture),例如Fling,Scroll等等。这些Gesture会使用户体验大大提升。
Android中的Gesture识别(detector)是通过GestureDetector.OnGestureListener接口实现的。
首先,Android事件处理机制是基于Listener实现的,比如触摸屏相关的事件,就是通过onTouchListener实现;
其次,所有View的子类都可以通过setOnTouchListener()、setOnKeyListener()等方法来添加对某一类事件的Listener;
第三,Listener一般会以Interface的方式来提供,其中包含一个或多个abstract方法,我们需要实现这些方法来完成 onTouch()、onKey()等操作。这样,程序便可以在特定的事件被dispatch到该view的时候,通过callback函数给予适当的响 应。

1. Touch Screen Click举例

  1. public class MyGesture extends Activity implements OnTouchListener
  2. {
  3. public void onCreate(Bundle savedInstanceState)
  4. {
  5. super.onCreate(savedInstanceState);
  6. setContentView(R.layout.main);
  7. TextView tv = (TextView) findViewById(R.id.tv);
  8. tv.setOnTouchListener(this);
  9. }
  10. public boolean onTouch(View v, MotionEvent event)
  11. {
  12. Toast.makeText(this, "Touch Touch", Toast.LENGTH_SHORT).show();
  13. return false;
  14. }
  15. }

我们可以通过MotionEvent的getAction()方法来获取Touch事件的类型,包括 ACTION_DOWN(按下触摸屏), ACTION_MOVE(按下触摸屏后移动受力点), ACTION_UP(松开触摸屏)和ACTION_CANCEL(不会由用户直接触发)。借助对于用户不同操作的判断,结合getRawX()、 getRawY()、getX()和getY()等方法来获取坐标后,我们可以实现诸如拖动某一个按钮,拖动滚动条等功能。2. 当我们捕捉到Touch操作的时候,如何识别出用户的Gesture?这里我们需要GestureDetector.OnGestureListener接口的帮助,代码如下:

  1. public class MyGesture extends Activity implements OnTouchListener,
  2. OnGestureListener
  3. {
  4. private GestureDetector mGestureDetector;
  5. public MyGesture()
  6. {
  7. mGestureDetector = new GestureDetector(this);
  8. }
  9. public void onCreate(Bundle savedInstanceState)
  10. {
  11. super.onCreate(savedInstanceState);
  12. setContentView(R.layout.main);
  13. TextView tv = (TextView) findViewById(R.id.tv);
  14. tv.setOnTouchListener(this);
  15. tv.setFocusable(true);
  16. tv.setClickable(true);
  17. tv.setLongClickable(true);
  18. mGestureDetector.setIsLongpressEnabled(true);
  19. }
  20. /*
  21. * *在onTouch()方法中,我们调用GestureDetector的onTouchEvent()方法,
  22. * 将捕捉到的MotionEvent交给GestureDetector * 来分析是否有合适的callback函数来处理用户的手势
  23. */
  24. public boolean onTouch(View v, MotionEvent event)
  25. {
  26. return mGestureDetector.onTouchEvent(event);
  27. }
  28. // 用户轻触触摸屏,由1个MotionEvent ACTION_DOWN触发
  29. public boolean onDown(MotionEvent arg0)
  30. {
  31. Log.i("MyGesture", "onDown");
  32. Toast.makeText(this, "onDown", Toast.LENGTH_SHORT).show();
  33. return true;
  34. }
  35. /*
  36. * * 用户轻触触摸屏,尚未松开或拖动,由一个1个MotionEvent ACTION_DOWN触发 *
  37. * 注意和onDown()的区别,强调的是没有松开或者拖动的状态
  38. */
  39. public void onShowPress(MotionEvent e)
  40. {
  41. Log.i("MyGesture", "onShowPress");
  42. Toast.makeText(this, "onShowPress", Toast.LENGTH_SHORT).show();
  43. }
  44. // 用户(轻触触摸屏后)松开,由一个1个MotionEvent ACTION_UP触发
  45. public boolean onSingleTapUp(MotionEvent e)
  46. {
  47. Log.i("MyGesture", "onSingleTapUp");
  48. Toast.makeText(this, "onSingleTapUp", Toast.LENGTH_SHORT).show();
  49. return true;
  50. }
  51. // 用户按下触摸屏、快速移动后松开,由1个MotionEvent ACTION_DOWN, 多个ACTION_MOVE, 1个ACTION_UP触发
  52. public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
  53. float velocityY)
  54. {
  55. Log.i("MyGesture", "onFling");
  56. Toast.makeText(this, "onFling", Toast.LENGTH_LONG).show();
  57. return true;
  58. }
  59. // 用户按下触摸屏,并拖动,由1个MotionEvent ACTION_DOWN, 多个ACTION_MOVE触发
  60. public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
  61. float distanceY)
  62. {
  63. Log.i("MyGesture", "onScroll");
  64. Toast.makeText(this, "onScroll", Toast.LENGTH_LONG).show();
  65. return true;
  66. }
  67. // 用户长按触摸屏,由多个MotionEvent ACTION_DOWN触发
  68. public void onLongPress(MotionEvent e)
  69. {
  70. Log.i("MyGesture", "onLongPress");
  71. Toast.makeText(this, "onLongPress", Toast.LENGTH_LONG).show();
  72. }
  73. }

3. Fling事件的处理代码:除了第一个触发Fling的ACTION_DOWN和最后一个ACTION_MOVE中包含的坐标等信息外,我们还可以根据用 户在X轴或者Y轴上的移动速度作为条件。比如下面的代码中我们就在用户移动超过100个像素,且X轴上每秒的移动速度大于200像素时才进行处理。

  1. public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
  2. float velocityY)
  3. {
  4. // 参数解释:
  5. // e1:第1个ACTION_DOWN MotionEvent
  6. // e2:最后一个ACTION_MOVE MotionEvent
  7. // velocityX:X轴上的移动速度,像素/秒
  8. // velocityY:Y轴上的移动速度,像素/秒
  9. // 触发条件 :
  10. // X轴的坐标位移大于FLING_MIN_DISTANCE,且移动速度大于FLING_MIN_VELOCITY个像素/秒
  11. final int FLING_MIN_DISTANCE = 100, FLING_MIN_VELOCITY = 200;
  12. if (e1.getX() - e2.getX() > FLING_MIN_DISTANCE
  13. && Math.abs(velocityX) > FLING_MIN_VELOCITY)
  14. {
  15. // Fling left
  16. Log.i("MyGesture", "Fling left");
  17. Toast.makeText(this, "Fling Left", Toast.LENGTH_SHORT).show();
  18. }
  19. else if (e2.getX() - e1.getX() > FLING_MIN_DISTANCE
  20. && Math.abs(velocityX) > FLING_MIN_VELOCITY)
  21. {
  22. // Fling right
  23. Log.i("MyGesture", "Fling right");
  24. Toast.makeText(this, "Fling Right", Toast.LENGTH_SHORT).show();
  25. }
  26. return false;
  27. }

这个例子中,tv.setLongClickable(true)是必须的,因为 只有这样,view才能够处理不同于Tap(轻触)的hold(即ACTION_MOVE,或者多个ACTION_DOWN),我们同样可以通过layout定义中的android:longClickable来做到这一点.

onTouchEvent方法的使用的更多相关文章

  1. onTouch事件试验(覆写onTouchEvent方法,同时设置onTouchListener)

    xml布局文件 <</span>RelativeLayout xmlns:android="http://schemas.android.com/apk/res/andro ...

  2. (转)onTouchEvent方法的使用

      (转)onTouchEvent方法的使用 手机屏幕事件的处理方法onTouchEvent.该方法在View类中的定义,并且所有的View子类全部重写了该方法,应用程序可以通过该方法处理手机屏幕的触 ...

  3. OnScroll与OnTouchEvent方法的区别与联系

    onScroll()方法和onTouchEvent()方法的执行过程应该是,先onTouchEvent()的ACTION_DOWN,然后是ACTION_MOVE和onScroll()方法同时进行,最后 ...

  4. Android onTouchEvent方法

    onTouchEvent方法简介 前面已经介绍了手机键盘事件的处理方法,接下来将介绍手机屏幕事件的处理方法onTouchEvent.该方法在View类中的定义,并且所有的View子类全部重写了该方法, ...

  5. 对TextVIew中特定字符串设定onTouchEvent方法

    上面是Iphone备忘录的图,笔者之前接到一个需求是实现点击文本框里的数字,弹出一个类似上图的按钮,显示出复制,要求是这个按钮的位置必须是根据你点击的位置进行定位(为什么这么说,是因为我们不可能把按钮 ...

  6. 基于回调的事件处理——重写onTouchEvent方法响应触摸屏事件

    对于Android提供的事件处理模型,不难发现基于监听的事件处理模型具有更大的优势: 基于监听的事件模型分工更加明确,事件源.事件监听有两个类分开实现,因此具有更好的维护性. Android的事件处理 ...

  7. View中的onTouchEvent()与setOnTouchListener()中的ontouch()方法的事件处理先后顺序

    Touch事件的两种情况 1.覆写View.class中定义的onTouchEvent-->基于事件回调监听方式 @Override public boolean onTouchEvent(Mo ...

  8. TouchEvent: dispatchTouchEvent(), onTouch() , onTouchEvent(), requestDisallowInterceptTouchEvent() 方法中的一些细节

    Q: onTouchListener与onClickListener谁先执行?A: onTouchListener中的内容先执行.若其中的onTouch方法返回true,代表该事件已被onTouch消 ...

  9. Android View的onTouchEvent和OnTouch区别

    还是以自定义的TestButton为例. 我们可以通过重写onTouchEvent方法来处理诸如down move up的消息: public class TestButton extends But ...

随机推荐

  1. 行业干货-如何逆向解决QT程序汉化中乱码问题

    前言 “一款QT开发的国外软件,大概率是没有做中文支持的,所以你汉化中,不论怎么设置编码都一定是乱码.面对这个问题,你去互联网上找答案,答案却大多是复制粘贴的开发中解决乱码的文章,可是我们是要逆向中解 ...

  2. A. A Prank

    题意 有数列从小到大排列,都是不同范围1~ 1000,问你最多去掉多少个数字还能复原 由于wrong很多发所以写一下 链接 [http://codeforces.com/contest/1062/pr ...

  3. 《吃了么》Alpha版本发布说明

    1.功能描述  功能一  查询周边餐厅 选中一条后,会跳转到相应餐厅的网址,获取具体的信息: 功能二 查询指定地点地餐厅 功能三 查询菜谱 具体的菜谱: 还有收藏夹的功能,点击标题栏的心形图标可以将菜 ...

  4. 学习github心得

    Git 是 Linux 的创始人 Linus Torvalds 开发的开源和免费的版本管理系统,利用底层文件系统原理进行版本控制的工具.Git是目前为止最著名运用最好最受欢迎的分布式的配置管理工具. ...

  5. Linux入门笔记

    1.Linux常用快捷键 按键 作用 Ctrl+d 键盘输入结束或退出终端 Ctrl+s  暂停当前程序,暂停后按下任意键恢复运行 Ctrl+z 将当前程序放到后台运行,恢复到前台为命令fg Ctrl ...

  6. 软件工程(GZSD2015) 第三次作业提交进度

    第三次作业题目请查看这里:软件工程(GZSD2015)第三次作业 开始进入第三次作业提交进度记录中,童鞋们,虚位以待哈... 2015年4月19号 徐镇.尚清丽,C语言 2015年4月21号 毛涛.徐 ...

  7. PAT 1066 图像过滤

    https://pintia.cn/problem-sets/994805260223102976/problems/994805266514558976 图像过滤是把图像中不重要的像素都染成背景色, ...

  8. 查看Linux机器名

    uname -a hostname vim /etc/sysconfig/network

  9. idHTTP 向网站发送json格式数据

    idHTTP 向网站发送json格式数据 var rbody:tstringstream; begin rbody:=tstringstream.Create('{"name":& ...

  10. [书摘]Windows内存管理术语

    1. Virtual Address space 虚拟地址空间 一个应用程序能够访问的最大的内存地址空间, 32位的机器上面最大的就是4GB 但是 并不是所有的内存都放到主存里面, 可能放到pagef ...