onTouchEvent方法简介

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

  • 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再进行处理。

接下来通过一个简单的案例介绍该方法的使用方法。在该案例中,会在用户点击的位置绘制一个矩形,然后监测用户触控笔的状态,当用户在屏幕上移动触控笔时,使矩形随之移动,而当用户触控笔离开手机屏幕时,停止绘制矩形。该案例的开发步骤如下。

Java代码:

  1. package eoe.demo;
  2. //声明所在包
  3. import android.app.Activity;
  4. //引入Activity类
  5. import android.content.Context;
  6. //引入Context类
  7. import android.graphics.Canvas;
  8. //引入Canvas类
  9. import android.graphics.Color;
  10. //引入Color类
  11. import android.graphics.Paint;
  12. //引入Paint类
  13. import android.os.Bundle;
  14. //引入Bundle类
  15. import android.view.MotionEvent;
  16. //引入MotionEvent类
  17. import android.view.View;
  18. //引入View类
  19. public class Sample_7_2 extends Activity {
  20. MyView myView;
  21. //自定义View的引用
  22. public void onCreate(Bundle savedInstanceState) {
  23. //重写的onCreate方法
  24. super.onCreate(savedInstanceState);
  25. myView = new MyView(this);
  26. //初始化自定义的View
  27. setContentView(myView);
  28. //设置当前显示的用户界面
  29. }
  30. @Override
  31. public boolean onTouchEvent(MotionEvent event){
  32. //重写的onTouchEvent回调方法
  33. switch(event.getAction()){
  34. case MotionEvent.ACTION_DOWN:
  35. //按下
  36. myView.x = (int) event.getX();
  37. //改变x坐标
  38. myView.y = (int) event.getY()-52;
  39. //改变y坐标
  40. myView.postInvalidate();
  41. //重绘
  42. break;
  43. case MotionEvent.ACTION_MOVE:
  44. //移动
  45. myView.x = (int) event.getX();
  46. //改变x坐标
  47. myView.y = (int) event.getY()-52;
  48. //改变y坐标
  49. myView.postInvalidate();
  50. //重绘
  51. break;
  52. case MotionEvent.ACTION_UP:
  53. //抬起
  54. myView.x = -100;
  55. //改变x坐标
  56. myView.y = -100;
  57. //改变y坐标
  58. myView.postInvalidate();
  59. //重绘
  60. break;
  61. }
  62. return super.onTouchEvent(event);
  63. }
  64. class MyView extends View{
  65. //自定义的View
  66. Paint paint;
  67. //画笔
  68. int x = 50;
  69. //x坐标
  70. int y = 50;
  71. //y坐标
  72. int w = 50;
  73. //矩形的宽度
  74. public MyView(Context context) {
  75. //构造器
  76. super(context);
  77. paint = new Paint();
  78. //初始化画笔
  79. }
  80. @Override
  81. protected void onDraw(Canvas canvas) {
  82. //绘制方法
  83. canvas.drawColor(Color.GRAY);
  84. //绘制背景色
  85. canvas.drawRect(x, y, x+w, y+w, paint);
  86. //绘制矩形
  87. super.onDraw(canvas);
  88. }
  89. }
  90. }

复制代码

第11行声明自定义View的引用,第12~16行重写Activity的onCreate方法,该方法会在此Activity创建时被系统调用,在方法中先初始化自定义的View,然后将当前的用户界面设置成该View。

第18~37行为重写的屏幕监听方法,在该方法中,根据事件动作的不同执行不同的操作。

第20~24行表示当前事件为屏幕被按下的事件,通过调用MotionEvent的getX()和getY()方法得到事件发生的坐标,然后设置给自定义View的x与y成员变量。

第25~29行表示在屏幕上滑动时的事件,同样是得到事件发生的位置并设置给View的x、y。需要注意的是,因为此时手机屏幕并不是全屏模式,所以需要对坐标进行调整。

第30~34行处理的是屏幕被抬起的事件,此时将View的x、y成员变量设成-100。表示并不需要在屏幕中绘制矩形。

第38~53行为自定义的View类,并重写了绘制方法onDraw。在第43~45行的构造器中初始化绘制时需要的画笔,然后在第48~52行的方法中根据成员变量x、y的值绘制绘制矩形。

提示:自定义的View并不会自动刷新,所以每次改变数据模型时都需要调用postInvalidate方法进行屏幕的刷新操作。关于自定义View的使用方法,将会在后面的章节中进行详细介绍,此处只是简单地使用。

Android onTouchEvent方法的更多相关文章

  1. Android onTouchEvent, onClick及onLongClick的调用机制

    针对屏幕上的一个View控件,Android如何区分应当触发onTouchEvent,还是onClick,亦或是onLongClick事件? 在Android中,一次用户操作可以被不同的View按次序 ...

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

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

  3. (转)onTouchEvent方法的使用

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

  4. onTouchEvent方法的使用

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

  5. Android onTouchEvent和setOnTouchListener中onTouch的区别

    OnTouchEvent()方法 是获取的对屏幕的各种操作,比如向左向右滑动,点击返回按钮等等. 属于一个宏观的屏幕触摸监控. OnTouchListener()方法 是获取某一个控件某一个View的 ...

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

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

  7. Android Stuido 方法参数 p0,p1

    Android Stuido 方法参数 p0,p1 参考文献 https://stackoverflow.com/questions/49219439/incorrect-variable-names ...

  8. android语音识别方法

    http://www.apkbus.com/forum.php?mod=viewthread&tid=3473 android语音识别方法一:使用intent调用语音识别程序 1. 说明 以下 ...

  9. 蓝牙ble数据转语音实现Android AudioRecord方法推荐

    蓝牙ble数据转语音实现Android AudioRecord方法推荐 教程  欢迎走进zozo的学习之旅. 概述 蓝牙BLE又称bluetooth smart,主打的是低功耗和快速链接,所以在支持的 ...

随机推荐

  1. 分布式版本控制系统Git-----4.Git 常用命令整理

    1. git init 初始化 git 目录 2. git add 添加文件 git add fileName       #添加指定文件 git add -i             #手工选择要添 ...

  2. hdu1022

    #include <stdio.h>#include <string.h> int main(void){ int n,i,j,k,l; char o1[10],o2[10], ...

  3. 2016年团体程序设计天梯赛-决赛 L1-1. 正整数A+B(15)

    本题的目标很简单,就是求两个正整数A和B的和,其中A和B都在区间[1,1000].稍微有点麻烦的是,输入并不保证是两个正整数. 输入格式: 输入在一行给出A和B,其间以空格分开.问题是A和B不一定是满 ...

  4. PAT 团体程序设计天梯赛-练习集 L1-023. 输出GPLT

    给定一个长度不超过10000的.仅由英文字母构成的字符串.请将字符重新调整顺序,按“GPLTGPLT....”这样的顺序输出,并忽略其它字符.当然,四种字符(不区分大小写)的个数不一定是一样多的,若某 ...

  5. oracle 11g dblink配置

    关于DBLINK的概念在本文中不再赘述,本文主要介绍DBLINK的创建. 1.创建环境描述 本文将在两台操作系统为红帽5.5版本.装有Oracle 11g的虚拟机中进行DBLINK的创建以及测试工作. ...

  6. Lua高级教程Metatables

    什么是Metatable metatable是Lua中的重要概念,每一个table都可以加上metatable,以改变相应的table的行为. Metatables举例 -- 声明一个正常的关系变量 ...

  7. Docker私有仓库2

    http://www.cnblogs.com/womars/p/5906410.html 接着上篇,上面为上篇地址. #通过docker tag将该镜像标志为要推送到私有仓库 [root@lh- ~] ...

  8. [ An Ac a Day ^_^ ] hdu 5835 Danganronpa 令人发指

    这道题告诉我两个道理: 1.记得写case 要不挂死你 2.数据很水的时候 只有样例的这一种情况…… 原来数据可以这么水…… #include<stdio.h> #include<i ...

  9. digitalocean vpn安装配置教程

    digitalocean是美国一家专业的vps提供商,优势是性价比高,最低配置512MB内存vps每月只要5美元,导致大陆用户疯狂涌入.关于digitalocean申请方法.digitalocean速 ...

  10. 创建 .gitignore 文件过滤规

    文件 .gitignore 的格式规范如下: 所有空行或者以注释符号 # 开头的行都会被 Git 忽略. 可以使用标准的 glob 模式匹配. 匹配模式最后跟反斜杠(/)说明要忽略的是目录. 要忽略指 ...