2014-11-30 4 views
0

Привет, я разрабатываю игру в android, для этого у меня есть 8 * 8 прямоугольников с использованием метода canvas.drawRect(), теперь мне нужно, когда пользователь касается любого из прямых, его цвет должен измениться. Для этого я сделал следующее.Обновление Canvas Preserving Old Canvas Details

public boolean onTouchEvent(final MotionEvent event) { 

     handleTouches(event.getX(), event.getY()); 

     return false; 
    } 

public void handleTouches(float x, float y) { 
     xLocTouch = (int) x; 
     yLocTouched = (int) y; 
     outerLoop: for (int i = 0; i < 8; i++) { 
      for (int j = 0; j < 8; j++) { 
       if (GameView.tiles[i][j].rect.contains(xLocTouch, yLocTouched)) { 
        touched = true; 
        xTouched = i; 
        yTouched = j; 
        break outerLoop; 
       } 

      } 
     } 

    } 

protected void onDraw(Canvas canvas) { 

for (int i = 0; i < ROWS; i++) { 
      for (int j = 0; j < COLS; j++) { 
       canvas.drawRect(tiles[i][j].rect, paint); 
       canvas.drawRect(tiles[i][j].rect, p); 
       if(touched && i==xTouched && j == yTouched) { 
        Paint touchedColor = new Paint(); 
        touchedColor.setColor(Color.BLUE); 
        canvas.drawRect(tiles[i][j].rect, touchedColor); 
       } 
      } 
} 

Этот код работает правильно, но проблема в том, когда я касаюсь в первый раз, что изменения цвета Rect, но для второго прикосновения он стирает старые позиции прикасаются. Мне нужно, чтобы все коснувшиеся прямые были разными. Есть ли способ для этого?

ответ

1

Булевский массив, который отслеживает состояние касания каждого прямоугольника, сделал бы трюк. Я не вижу внешний код, но это может быть дополнительным полем в вашем классе GameView и соответствующим образом обновляться в методе handleTouches.

Возможно, менее эффективное, менее элегантное решение заключается в том, чтобы просто не устанавливать цвет прямоугольника в onDraw, если он уже имеет Color.BLUE (соответствующим образом измените ваш оператор if). Вы можете получить цвет затронутого пикселя, используя this SE answer, но, чтобы быть предупрежденным, вы должны сначала превратить холст в растровое изображение, чтобы пробовать цвет (следовательно, неэффективность).

+0

thanx.this работает – programr