【发布时间】:2013-06-10 23:10:40
【问题描述】:
我正在开发一款游戏并遇到了一些麻烦,由于我是 Android 图形方面的新手,所以我可能做得不对。
我有一个SurfaceView 和一个我自己的Card 对象的ArrayList,它扩展了View。我覆盖Card 对象的onDraw 方法,然后在SurfaceView's onDraw 中绘制所有内容。绘图部分正常工作。
我现在尝试使用onTouchListener 检测单独的卡片何时被触摸,我为每张卡片设置了侦听器,但它检测到触摸就好像被触摸的视图是SurfaceView。可能我的整个想法都是错误的,所以我征求你的意见。
一些代码:
public GameSurfaceView(Context context) {
super(context);
GAME_STATE = GameState.LOADING;
this.context = context;
holder = getHolder();
holder.addCallback(new SurfaceHolder.Callback() {
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
Canvas c = holder.lockCanvas(null);
onDraw(c);
holder.unlockCanvasAndPost(c);
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
});
}
SurfaceView onDraw():
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawRGB(30, 180, 30);
for (Card card : user.getTableCards()) {
card.draw(canvas);
}
}
卡片的 onDraw():
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawBitmap(getBitmap(), x, y, null);
}
和onTouch
@Override
public boolean onTouch(View v, MotionEvent event) {
Log.d("TOUCH", "Class: " + v.getClass().toString());
if (v.getClass() == Card.class) {
Log.d("CARD", "Touched: " + ((Card) v).getValue());
}
return true;
}
我总是在记录 SurfaceView 类。
这甚至是做类似事情的正确方法吗?我需要检测对同一类的单个对象的触摸..
我目前通过向每张卡片添加Rect 类型的成员然后循环并检查触摸的 x 和 y 是否包含在该矩形中来做到这一点,但这似乎是一种昂贵的方式,迭代每个卡(即使最多 52 个)并检查它..
谢谢
【问题讨论】:
标签: java android graphics surfaceview