Android: ¿Cómo mover un BitmapDrawable?

Estoy tratando de mover un BitmapDrawable en una vista personalizada. Funciona bien con un ShapeDrawable siguiente manera:

 public class MyView extends View { private Drawable image; public MyView() { image = new ShapeDrawable(new RectShape()); image.setBounds(0, 0, 100, 100); ((ShapeDrawable) image).getPaint().setColor(Color.BLACK); } @Override protected void onDraw(Canvas canvas) { image.draw(canvas); } public void move(int x, int y) { Rect bounds = image.getBounds(); bounds.left += x; bounds.right += x; bounds.top += y; bounds.bottom += y; invalidate(); } } 

Sin embargo, si utilizo un BitmapDrawable , los límites del onDraw cambian, el método onDraw se llama, pero la imagen permanece donde está en la pantalla.

El constructor siguiente reproducirá el problema creando un BitmapDrawable en su lugar:

 public MyView() { image = getResources().getDrawable(R.drawable.image); image.setBounds(0, 0, 100, 100); } 

¿Cómo puedo mover un BitmapDrawable ?

La documentación para Drawable.getBounds () dice lo siguiente:

Nota: para la eficiencia, el objeto devuelto puede ser el mismo objeto almacenado en el dibujable (aunque esto no está garantizado), por lo que si se necesita una copia persistente de los límites, llame a copyBounds (rect) en su lugar. Tampoco debe cambiar el objeto devuelto por este método ya que puede ser el mismo objeto almacenado en el dibujable.

Esto no es cristal claro, pero parece que no debemos cambiar el valor devuelto por getBounds () , dispara algunos efectos secundarios desagradables.

Mediante el uso de copyBounds () y setBounds () funciona como un encanto.

 public void move(int x, int y) { Rect bounds = image.copyBounds(); bounds.left += x; bounds.right += x; bounds.top += y; bounds.bottom += y; image.setBounds(bounds); invalidate(); } 

Otra forma de mover un Drawable podría ser mover el Canvas en el que está dibujando:

 @Override protected void onDraw(Canvas canvas) { canvas.translate(x, y); image.draw(canvas); } 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.