2016-08-03 39 views
0

Ich mache eine Schach-App und wenn ich die Kacheln des Boards zeichne, werden sie im (transparenten) Hintergrund nicht gefärbt. Was ich eigentlich möchte, ist ähnlich wie in einem ImageView, das ein Bild (mit einem transparenten Hintergrund) mit einem farbigen Hintergrund zeigt.Zeichne ein Bitmap (aus einem Zeichensatz) auf ein Canvas mit einem farbigen Hintergrund

Dies ist der Code

private final Paint squareColor; 
private Rect tileRect; 
private Drawable pieceDrawable; 

public Tile(final int col, final int row) { 
    this.col = col; 
    this.row = row; 

    this.squareColor = new Paint(); 
    squareColor.setColor(isDark() ? Color.RED : Color.WHITE); 


} 

public void draw(final Canvas canvas) { 
    if(pieceDrawable != null) { 

     Bitmap image = ((BitmapDrawable) pieceDrawable).getBitmap(); 
     ColorFilter filter = new LightingColorFilter(squareColor.getColor(), Color.TRANSPARENT); 
     squareColor.setColorFilter(filter); 
     canvas.drawBitmap(image, null, tileRect, squareColor); 
    } else { 
     canvas.drawRect(tileRect, squareColor); 
    } 
} 

Und das ist, wie das Schachbrett wie (linkes Bild) sieht

1 2

Wenn ich vor drawBitmap call diese 2 Zeilen auf Kommentar, ich das Brett als das richtige Bild.

ColorFilter filter = new LightingColorFilter(squareColor.getColor(), Color.TRANSPARENT); 
squareColor.setColorFilter(filter); 

Meine Stücke sind normale Bilder mit einem transparenten Hintergrund, wo das Stück nicht im Quadrat gezeichnet wird. Wie kann ich die rote Farbe hinter das Stück haben? (So ​​wie es bei einem ImageView mit denselben Bildern mit einer Hintergrundfarbe oder einer farbigen Ansicht geschehen würde)

Antwort

1

Sie zeichnen nur den Hintergrund, wenn pieceDrawable null ist. Ändern Sie Ihren Code in:

public void draw(final Canvas canvas) { 
    canvas.drawRect(tileRect, squareColor); // Draws background no matter if place is empty. 
    if(pieceDrawable != null) { 
     Bitmap image = ((BitmapDrawable) pieceDrawable).getBitmap(); 
     ColorFilter filter = new LightingColorFilter(squareColor.getColor(), Color.TRANSPARENT); 
     squareColor.setColorFilter(filter); 
     canvas.drawBitmap(image, null, tileRect, squareColor); 
    } 
} 
+0

Funktioniert! Danke vielmals. Weißt du auch, was ich tun sollte, wenn ich in Zukunft die Kachelfarbe durch ein Zeichen/Bitmap ersetzen wollte? (wie ein Holzbild/eine Maske oder dergleichen) – BlackBox

+1

Ersetzen Sie einfach den Aufruf 'drawRect()' durch 'drawBitmap()' one. Auf einem 'Canvas' werden Draw-Aufrufe übereinander gezeichnet. –