0

画面に触れたときに四角形の配列内の特定の四角形の色を変更しようとしましたが、機能していないようです。私のコードは次のとおりです。

public Paint blue = new Paint();
RandomColorGen rc;
ArrayList<Integer> colors = RandomColorGen.ColorList(5);
Random rand = new Random();
int columns = 50;
int rows = 50;
Rect square[][] = new Rect[rows][columns];

public boolean isTouched;
public Canvas canvas;

    @Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    this.canvas = canvas;

    for (int x = 0; x < rows; x++) {
        for (int y = 0; y < columns; y++) {

            square[x][y] = new Rect();

            blue.setColor(colors.get(rand.nextInt(colors.size())));
            blue.setStyle(Paint.Style.FILL);

            square[x][y].set(0, 0, (canvas.getWidth() - 10) / rows,
                    ((canvas.getHeight() - 100) / columns));
            square[x][y].offsetTo(x * ((canvas.getWidth() - 10) / rows), y
                    * ((canvas.getHeight() - 100) / columns));

            canvas.drawRect(square[x][y], blue);


        }
    }
    if(isTouched){
        blue.setColor(colors.get(rand.nextInt(colors.size())));
        blue.setStyle(Paint.Style.FILL);
        canvas.save();
        canvas.clipRect(square[1][1]);
        canvas.drawRect(square[1][1], blue);

        canvas.restore();

    }

}

@Override
public boolean onTouchEvent(MotionEvent event) {

    switch (event.getAction()) {
    case MotionEvent.ACTION_DOWN:
        isTouched = true;


        break;
    }

    return true;

}

colors.get() は色の配列リストです。私は間違ったアプローチを取っていますか?

4

2 に答える 2

0

onTouch アクションが実行された後にペイント関数を呼び出す方法...

OnTouch アクションは最初のアクションなので、どのように Paint() 関数を呼び出しますか??

于 2013-02-24T08:24:16.923 に答える
0

コードをテストしましたが、動作しますが、言及する価値のあるメモがいくつかあります。

  • 描画中にオブジェクトを割り当てるのは非常に悪い動作です (特に 50*50 を割り当てる場合)。onDraw()現在と同じ動作を実現したい場合は、割り当てコードをコンストラクターに移動し、メソッドで四角形の位置を変更することを検討してください。
  • の使用法onTouchEvent()は完全ではありません。ユーザーが手を挙げていない限り、isTouched を true にする必要があります。これは次のように行うことができます。

    @Override
    public boolean onTouchEvent(MotionEvent event) {
    
    switch (event.getAction()) {
    case MotionEvent.ACTION_DOWN:
        isTouched = true;
    
    
        break;
    case MotionEvent.ACTION_UP:
    case MotionEvent.ACTION_CANCEL:
        isTouched = false;
        break;
    
    }
    invalidate();
    return true;
    

    }

  • また、 TouchEventを受け取るたびにレイアウトをリクエストします。invalidate()

于 2013-02-24T09:15:58.713 に答える