首页 / 操作系统 / Linux / Android游戏开发之单点触摸与多点触摸的响应方式
游戏开发中的触摸事件 在游戏开发中监听屏幕触摸事件须要在View中重写父类onTouchEvent方法,在重写的方法中拦截用户触摸屏幕的一些信息,比如触摸屏幕的X 、 Y坐标 触摸屏幕发生的事件 触摸按下 触摸抬起 触摸移动,触摸屏幕发生的时间 等等, 我们先看看onTouchEvent的函数原型。
函数中的Event 参数的意思为当前触摸事件的对象,这个对象中包含着当前触摸事件的一切信息。比如ecent.getAction()可以拿到当前触摸事件的名称,根据触摸事件的名称可以判断当前是触摸按下 还是 触摸移动 还是 触摸抬起。 event.getX()与 event.getY()可以拿到当前触摸屏幕的X Y坐标。event.getEventTime(); 可以拿到当前触发触摸事件的时间,等等所有的信息。 - @Override
- public boolean onTouchEvent(MotionEvent event) {
- int action = event.getAction();
- mPosX = (int) event.getX();
- mPosY = (int) event.getY();
- switch (action) {
- // 触摸按下的事件
- case MotionEvent.ACTION_DOWN:
- Log.v("test", "ACTION_DOWN");
- break;
- // 触摸移动的事件
- case MotionEvent.ACTION_MOVE:
- Log.v("test", "ACTION_MOVE");
- break;
- // 触摸抬起的事件
- case MotionEvent.ACTION_UP:
- Log.v("test", "ACTION_UP");
- break;
- }
- / return super.onTouchEvent(event);
- return true;
- }
这个函数是具有有返回值的,须要返回一个布尔值。大家发现我将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的区别
- import android.app.Activity;
- import android.content.Context;
- import android.graphics.Bitmap;
- import android.graphics.BitmapFactory;
- import android.graphics.Canvas;
- import android.graphics.Color;
- import android.graphics.Paint;
- import android.os.Bundle;
- import android.util.Log;
- import android.view.MotionEvent;
- import android.view.View;
-
- public class ViewActivity extends Activity {
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(new MyView(this));
- }
-
- public class MyView extends View {
-
- /** 触摸后绘制的图片 **/
- Bitmap mBitmap = null;
-
- /** 游戏画笔 **/
- Paint mPaint = null;
-
- /** 触摸后在屏幕中显示的位置 **/
- int mPosX = 0;
- int mPosY = 0;
-
- /**事件触发时间**/
- Long mActionTime = 0L;
-
- public MyView(Context context) {
- super(context);
- /** 设置当前View拥有控制焦点 **/
- this.setFocusable(true);
- /** 设置当前View拥有触摸事件 **/
- this.setFocusableInTouchMode(true);
- /** 加载图片 **/
- mBitmap = BitmapFactory.decodeResource(getResources(),
- R.drawable.item);
- mPaint = new Paint();
- mPaint.setColor(Color.WHITE);
- }
-
- @Override
- protected void onDraw(Canvas canvas) {
- /** 绘制图片 **/
- canvas.drawBitmap(mBitmap, mPosX, mPosY, mPaint);
- canvas.drawText("当前X坐标:"+mPosX, 0, 20, mPaint);
- canvas.drawText("当前Y坐标:"+mPosY, 0, 40, mPaint);
- canvas.drawText("事件触发时间:"+mActionTime, 0, 60, mPaint);
- super.onDraw(canvas);
- }
-
- @Override
- public boolean onTouchEvent(MotionEvent event) {
-
- int action = event.getAction();
- mPosX = (int) event.getX();
- mPosY = (int) event.getY();
- switch (action) {
- // 触摸按下的事件
- case MotionEvent.ACTION_DOWN:
- Log.v("test", "ACTION_DOWN");
- break;
- // 触摸移动的事件
- case MotionEvent.ACTION_MOVE:
- Log.v("test", "ACTION_MOVE");
- break;
- // 触摸抬起的事件
- case MotionEvent.ACTION_UP:
- Log.v("test", "ACTION_UP");
- break;
- }
- /**得到事件触发时间**/
- mActionTime = event.getEventTime();
- /** 通知UI线程刷新屏幕 **/
- postInvalidate();
- // return super.onTouchEvent(event);
- return true;
- }
- }
- }