Android游戏开发之单点触摸与多点触摸的响应方式


游戏开发中的触摸事件   在游戏开发中监听屏幕触摸事件须要在View中重写父类onTouchEvent方法,在重写的方法中拦截用户触摸屏幕的一些信息,比如触摸屏幕的X 、 Y坐标 触摸屏幕发生的事件 触摸按下  触摸抬起  触摸移动,触摸屏幕发生的时间 等等, 我们先看看onTouchEvent的函数原型。
   
函数中的Event 参数的意思为当前触摸事件的对象,这个对象中包含着当前触摸事件的一切信息。比如ecent.getAction()可以拿到当前触摸事件的名称,根据触摸事件的名称可以判断当前是触摸按下 还是 触摸移动 还是 触摸抬起。 event.getX()与 event.getY()可以拿到当前触摸屏幕的X Y坐标。event.getEventTime(); 可以拿到当前触发触摸事件的时间,等等所有的信息。

 
  1. @Override  
  2. public boolean onTouchEvent(MotionEvent event) {  
  3.     int action = event.getAction();  
  4.     mPosX = (int) event.getX();  
  5.     mPosY = (int) event.getY();  
  6.     switch (action) {  
  7.     // 触摸按下的事件   
  8.     case MotionEvent.ACTION_DOWN:  
  9.     Log.v("test""ACTION_DOWN");  
  10.     break;  
  11.     // 触摸移动的事件   
  12.     case MotionEvent.ACTION_MOVE:  
  13.     Log.v("test""ACTION_MOVE");  
  14.     break;  
  15.     // 触摸抬起的事件   
  16.     case MotionEvent.ACTION_UP:  
  17.     Log.v("test""ACTION_UP");  
  18.     break;  
  19.     }  
  20. /       return super.onTouchEvent(event);  
  21.     return true;  
  22. }  
这个函数是具有有返回值的,须要返回一个布尔值。大家发现我将return super.onTouchEvent(event)注释掉了而是直接return ture。 我给同学们解释一下为什么要着么操作。onTouchEvent方法不是我们手动调用的而是系统调用的 它的返回值会直接通知系统是否回调方法。如果说在这里return false  onTouchEvent方法永远不会在被回调也就是说它只能响应触摸按下操作,触摸移动事件 和触摸抬起事件永远都不会在被响应 ,log只会打印出"ACTION_DOWN"。 如果这里return super.onTouchEvent(event); 调用父类的方法来得到返回值返回 ,这样也是有问题的因为调用父类的onTouchEvent方法可能也会返回false 这样一来依然会无法响应触摸移动事件和触摸抬起事件。所以为了正确的处理触摸事件在这里我们直接return ture 这样一来就万无一失了,Log中会将所有信息都打印出来。


1.单点触摸


在下面这个DEMO中 用手触摸 移动 屏幕后 下面的icon图片会跟随这我的手势移动。 代码实现主要是在onTouchEvent方法中时时去计算手触摸屏幕各个状态的坐标 然后调用 postInvalidate(); 方法去通知UI刷新屏幕重新显示图片 文字的位置以及内容。 具体相关内容见Android游戏开发之构建游戏框架View与SurFaceView的区别






 
  1. import android.app.Activity;  
  2. import android.content.Context;  
  3. import android.graphics.Bitmap;  
  4. import android.graphics.BitmapFactory;  
  5. import android.graphics.Canvas;  
  6. import android.graphics.Color;  
  7. import android.graphics.Paint;  
  8. import android.os.Bundle;  
  9. import android.util.Log;  
  10. import android.view.MotionEvent;  
  11. import android.view.View;  
  12.   
  13. public class ViewActivity extends Activity {  
  14.     @Override  
  15.     public void onCreate(Bundle savedInstanceState) {  
  16.     super.onCreate(savedInstanceState);  
  17.     setContentView(new MyView(this));  
  18.     }  
  19.   
  20.     public class MyView extends View {  
  21.   
  22.     /** 触摸后绘制的图片 **/  
  23.     Bitmap mBitmap = null;  
  24.   
  25.     /** 游戏画笔 **/  
  26.     Paint mPaint = null;  
  27.   
  28.     /** 触摸后在屏幕中显示的位置 **/  
  29.     int mPosX = 0;  
  30.     int mPosY = 0;  
  31.       
  32.     /**事件触发时间**/  
  33.     Long mActionTime = 0L;  
  34.       
  35.     public MyView(Context context) {  
  36.         super(context);  
  37.         /** 设置当前View拥有控制焦点 **/  
  38.         this.setFocusable(true);  
  39.         /** 设置当前View拥有触摸事件 **/  
  40.         this.setFocusableInTouchMode(true);  
  41.         /** 加载图片 **/  
  42.         mBitmap = BitmapFactory.decodeResource(getResources(),  
  43.             R.drawable.item);  
  44.         mPaint = new Paint();  
  45.         mPaint.setColor(Color.WHITE);  
  46.     }  
  47.   
  48.     @Override  
  49.     protected void onDraw(Canvas canvas) {  
  50.         /** 绘制图片 **/  
  51.         canvas.drawBitmap(mBitmap, mPosX, mPosY, mPaint);  
  52.         canvas.drawText("当前X坐标:"+mPosX, 020, mPaint);  
  53.         canvas.drawText("当前Y坐标:"+mPosY, 040, mPaint);  
  54.         canvas.drawText("事件触发时间:"+mActionTime, 060, mPaint);  
  55.         super.onDraw(canvas);  
  56.     }  
  57.   
  58.     @Override  
  59.     public boolean onTouchEvent(MotionEvent event) {  
  60.   
  61.         int action = event.getAction();  
  62.         mPosX = (int) event.getX();  
  63.         mPosY = (int) event.getY();  
  64.         switch (action) {  
  65.         // 触摸按下的事件   
  66.         case MotionEvent.ACTION_DOWN:  
  67.         Log.v("test""ACTION_DOWN");  
  68.         break;  
  69.         // 触摸移动的事件   
  70.         case MotionEvent.ACTION_MOVE:  
  71.         Log.v("test""ACTION_MOVE");  
  72.         break;  
  73.         // 触摸抬起的事件   
  74.         case MotionEvent.ACTION_UP:  
  75.         Log.v("test""ACTION_UP");  
  76.         break;  
  77.         }  
  78.         /**得到事件触发时间**/  
  79.         mActionTime = event.getEventTime();  
  80.         /** 通知UI线程刷新屏幕 **/  
  81.         postInvalidate();  
  82.         // return super.onTouchEvent(event);   
  83.         return true;  
  84.     }  
  85.     }  
  86. }  
  • 1
  • 2
  • 下一页

相关内容