0

カスタムビューのクラスがあります。方法の1つは

    @Override
public void onDraw(Canvas  canvas) {     
        Paint  paint = new Paint (); 
        Bitmap wrench = BitmapFactory.decodeResource(getResources(), R.drawable.wrench);
        canvas.drawColor(Color .BLACK);
        for(int i = 0; i < 4; i++) {
            for(int j = 0; j < 4; j++) {
                int left = canvas.getWidth()/2 - wrench.getWidth()*2 + j*wrench.getWidth();
                int top = 0  + i*wrench.getHeight();
                canvas.drawBitmap(wrench, left, top, null);

                regions = new ArrayList<Region>();
                Region reg = new Region(left, top, left + wrench.getWidth(), top + wrench.getHeight());
                regions.add(reg);
       //                    int right = left + wrench.getWidth();
       //                    int bottom  = top + wrench.getHeight();
       //                    Log.d("REGION", left + "," + top + "," + right  + "," + bottom);
            }
        }
}

私の形には8つの領域があります。だから、アクティビティクラスで

 playField = (PlayGameView) findViewById(R.id.play_field_surface_view);
    playField.setOnTouchListener(new View.OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {
  //                if(playField.getRegions().contains(210, 10))  {
            ArrayList<Region> regions = playField.getRegions();
            for(Region region: regions ) {
                boolean condition = region.contains( (int)event.getX(), (int)event.getY());
                if(condition) {
                    Toast.makeText(PlayGameActivity.this, (int)event.getX() + " " + (int)event.getY(), 2000).show();
                }

            }

            return true;
        }
    });

しかし、それは機能しません!最後の形をクリックするとトーストが2回呼び出されます!しかし、他の形ではそれは時々呼ばれます....私を助けてください^ _ ^

したがって、このコードは正常に機能します)

   @Override
public void onDraw(Canvas  canvas) {     
        Paint  paint = new Paint (); 
        Bitmap wrench = BitmapFactory.decodeResource(getResources(), R.drawable.wrench);
        canvas.drawColor(Color .BLACK);

        shapeWidth = wrench.getWidth();
        shapeHeight = wrench.getHeight();

        for(int i = 0; i < 4; i++) {
            for(int j = 0; j < 4; j++) {
                int left = canvas.getWidth()/2 - wrench.getWidth()*2 + j*wrench.getWidth();
                int top =  i*wrench.getHeight();
                canvas.drawBitmap(wrench, left, top, null);
                shapeLeft[j] = left;
                shapeTop[i] = top;
            }
        }

}


public ArrayList<Region>  getRegions() {
    regions = new ArrayList<Region>();

    for(int i = 0; i < 4; i++) {
        for(int j = 0; j < 4; j++) {
            Region reg = new Region(shapeLeft[j], shapeTop[i], shapeLeft[j] + shapeWidth, shapeTop[i] + shapeHeight);
            regions.add(reg);
//              int right = left + wrench.getWidth();
//              int bottom  = top + wrench.getHeight();
//              Log.d("REGION", left + "," + top + "," + right  + "," + bottom);
        }
    }

    return regions;
}

 playField = (PlayGameView) findViewById(R.id.play_field_surface_view);
    playField.setOnTouchListener(new View.OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {
//              if(playField.getRegions().contains(210, 10))  {
            ArrayList<Region> regions = playField.getRegions();
            for(Region region: regions ) {
                if(event.getAction() == MotionEvent.ACTION_DOWN) {
                    boolean condition = region.contains( (int)event.getX(), (int)event.getY());
                    if(condition) {
                        Toast.makeText(PlayGameActivity.this, (int)event.getX() + " " + (int)event.getY(), 2000).show();
                    }
                }
            }

            return true;
        }
    });
4

1 に答える 1

2

1つのアクションにのみ反応します。ACTION_DOWNまたはACTION_UPをメソッドで使用しますonTouch()。そうしないと、リージョンにヒットした場合に少なくとも2回呼び出されます。

on other shapes it called some timesまた、正確に何を意味するのか具体的に教えてください。

編集:

onDrawメソッド内にない領域を作成する必要があります。それをどこか別の場所で行います(コンストラクター?)。

ちょっとしたヒント:リージョンが正しいかどうかを確認したい場合は、最後に画面上に四角形/リージョンを描画して、遊び場に重なるようにする必要があります。リージョンが適切な場所にあり、適切なサイズである場合、視覚的なフィードバックが得られるはずです。また、いくつかの問題を確認するのに役立つ可能性があるため、描画している領域の色を変更します。

それを行った場合、スクリーンショットを提供していただけますか?

于 2012-04-04T08:37:41.023 に答える