易网时代-编程资源站
Welcome
微信登录
编程资源
图片资源库
蚂蚁家优选
PDF转换器
软件资源
软件开发
、
小程序制作
、
系统集成与运维
、
空间租用
、
硬件开发
、
视频监控
、
技术咨询与支持
——联系电话:0311-88999002/88999003
首页
/
操作系统
/
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
;
}
}
}
收藏该网址
版权所有©石家庄振强科技有限公司2024
冀ICP备08103738号-5
网站地图