私はゲームに取り組んでいて、少し問題が発生しました。Android のグラフィック面は初めてなので、これを正しく行っていない可能性があります。
を拡張する独自のオブジェクトSurfaceView
のArrayList
とがあります。オブジェクトのメソッドをオーバーライドしてから、すべてを描画します。描画部分は正常に動作します。Card
View
onDraw
Card
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);
}
とオンタッチ
@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 がその rect に含まれているかどうかを確認することでこれを行っていますが、各カードを繰り返し処理するのは高価な方法のようです (最大52) そしてそれをチェック..
ありがとう