android的onTouchEvent事件

7.1.3  onTouchEvent方法简介java

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

 
  1. public boolean onTouchEvent (MotionEvent event) 

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

返回值:该方法的返回值机理与键盘响应事件的相同,一样是当已经完整地处理了该事件且不但愿其余回调方法再次处理时返回true,不然返回false。app

该方法并不像以前介绍过的方法只处理一种事件,通常状况下如下三种状况的事件所有由onTouchEvent方法处理,只是三种状况中的动做值不一样。ide

屏幕被按下:当屏幕被按下时,会自动调用该方法来处理事件,此时MotionEvent.getAction()的值为MotionEvent.ACTION_DOWN,若是在应用程序中须要处理屏幕被按下的事件,只需从新该回调方法,而后在方法中进行动做的判断便可。post

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

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

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

建立一个名为Sample_7_2的Android项目。对象

打开Sample_7_2.java文件,输入以下所示的代码。

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

代码位置:见随书光盘中源代码/第7章/ Sample_7_2/src/wyf/ytl目录下的Sample_7_2.java。

第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的使用方法,将会在后面的章节中进行详细介绍,此处只是简单地使用。

运行该案例,将看到如图7-3所示的效果。

点击屏幕时,会在点击的位置绘制一个矩形,当触控笔在屏幕中滑动时,该矩形会随之移动,而当触控笔离开屏幕时,便会取消绘制矩形。

相关文章
相关标签/搜索