7.1.3 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再进行处理。
接下来通过一个简单的案例介绍该方法的使用方法。在该案例中,会在用户点击的位置绘制一个矩形,然后监测用户触控笔的状态,当用户在屏幕上移动触控笔时,使矩形随之移动,而当用户触控笔离开手机屏幕时,停止绘制矩形。该案例的开发步骤如下。
创建一个名为Sample_7_2的Android项目。
打开Sample_7_2.java文件,输入如下所示的代码。
- 1 package wyf.ytl; //声明所在包
- 2 import android.app.Activity; //引入Activity类
- 3 import android.content.Context; //引入Context类
- 4 import android.graphics.Canvas; //引入Canvas类
- 5 import android.graphics.Color; //引入Color类
- 6 import android.graphics.Paint; //引入Paint类
- 7 import android.os.Bundle; //引入Bundle类
- 8 import android.view.MotionEvent; //引入MotionEvent类
- 9 import android.view.View; //引入View类
- 10 public class Sample_7_2 extends Activity {
- 11 MyView myView; //自定义View的引用
- 12 public void onCreate(Bundle savedInstanceState) { //重写的onCreate方法
- 13 super.onCreate(savedInstanceState);
- 14 myView = new MyView(this); //初始化自定义的View
- 15 setContentView(myView); //设置当前显示的用户界面
- 16 }
- 17 @Override
- 18 public boolean onTouchEvent(MotionEvent event) { //重写的onTouchEvent回调方法
- 19 switch(event.getAction()){
- 20 case MotionEvent.ACTION_DOWN: //按下
- 21 myView.x = (int) event.getX(); //改变x坐标
- 22 myView.y = (int) event.getY()-52; //改变y坐标
- 23 myView.postInvalidate(); //重绘
- 24 break;
- 25 case MotionEvent.ACTION_MOVE: //移动
- 26 myView.x = (int) event.getX(); //改变x坐标
- 27 myView.y = (int) event.getY()-52; //改变y坐标
- 28 myView.postInvalidate(); //重绘
- 29 break;
- 30 case MotionEvent.ACTION_UP: //抬起
- 31 myView.x = -100; //改变x坐标
- 32 myView.y = -100; //改变y坐标
- 33 myView.postInvalidate(); //重绘
- 34 break;
- 35 }
- 36 return super.onTouchEvent(event);
- 37 }
- 38 class MyView extends View{ //自定义的View
- 39 Paint paint; //画笔
- 40 int x = 50; //x坐标
- 41 int y = 50; //y坐标
- 42 int w = 50; //矩形的宽度
- 43 public MyView(Context context) { //构造器
- 44 super(context);
- 45 paint = new Paint(); //初始化画笔
- 46 }
- 47 @Override
- 48 protected void onDraw(Canvas canvas) { //绘制方法
- 49 canvas.drawColor(Color.GRAY); //绘制背景色
- 50 canvas.drawRect(x, y, x+w, y+w, paint); //绘制矩形
- 51 super.onDraw(canvas);
- 52 }
- 53 }
- 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所示的效果。
点击屏幕时,会在点击的位置绘制一个矩形,当触控笔在屏幕中滑动时,该矩形会随之移动,而当触控笔离开屏幕时,便会取消绘制矩形。