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. Windows下怎么搭建Python+Selenium的自动化环境

    http://jingyan.baidu.com/article/47a29f244aec6bc014239985.html 注意点:配置了环境变量后需要重启电脑

  2. Ubuntu下安装composer及配置

    1.下载最新composer wget -c https://getcomposer.org/composer.phar 2.可执行权限 chmod u+x composer.phar 3.放置到安装 ...

  3. activity 嵌套一级fragment,一级fragment嵌套二级fragment,在一级fragment中刷新二级fragment中的UI

    今天遇到挺纠结的问题,由于产品设计的问题,技术上涉及到activity 嵌套一级fragment,一级fragment嵌套二级fragment,在一级fragment中刷新二级fragment中的UI ...

  4. .net core 12

  5. Java jvm 原理

    1.Java语言运行的过程 Java语言写的源程序通过Java编译器,编译成与平台无关的‘字节码程序’(.class文件,也就是0,1二进制程序),然后在OS之上的Java解释器中解释执行. 也相当与 ...

  6. 第九十三节,html5+css3移动手机端流体布局,基础CSS,头部设计,轮播设计,底部设计

    html5+css3移动手机端流体布局,基础CSS,头部设计,轮播设计,底部设计 基础CSS 首先将通用css属性写好 @charset "utf-8"; /*通用样式*/ /*去 ...

  7. 安卓---下拉刷新---上拉加载---解决导入library等自生成库文件失败的问题

    本文的下拉刷新以及上拉加载都是用PullToRefresh实现的,关于PullToRefresh的介绍以及源码,网上可以找到很多,本人在此不再赘述. PullToRefresh是一套实现非常好的下拉刷 ...

  8. 用makecert.exe生成一个自签名的证书

    makecert.exe不用去找,安装VS2008后,在开始菜单相应的路径找到该命令提示符:Microsoft Visual Studio 2008/Visual Studio Tools/Visua ...

  9. golang的linux安装

    1.wget https://storage.googleapis.com/golang/go1.6.2.linux-amd64.tar.gz tar -zxvf go1.6.2.linux-amd6 ...

  10. SQL_where条件的优化

    原则,多数数据库都是从 左到右的顺序处理条件,把能过滤更多数据的条件放在前面,过滤少的条件放后面 SQL1: select * from employee             where sala ...