2011-01-21 31 views
16

¿Cómo se puede girar un Drawable desde un recurso cuando se dibuja? Por ejemplo, me gustaría dibujar una flecha y poder rotarla para mirar en diferentes direcciones cuando se dibuja?Girar un dibujo en Android

+0

posible duplicado de [¿Cómo se dibuja una flecha que indica la dirección de conducción en MapView?] (Http://stackoverflow.com/questions/4331794/how-can-i-draw-an-arrow-showing -the-driving-direction-in-mapview) – Jonas

+0

La pregunta es bastante diferente, pero creo que la respuesta puede estar relacionada. – Computerish

Respuesta

20

Es necesario utilizar las funciones de mapa de bits y la clase Canvas para preparar dibujable:

Bitmap bmpOriginal = BitmapFactory.decodeResource(this.getResources(), R.drawable.image2); 
Bitmap bmResult = Bitmap.createBitmap(bmpOriginal.getWidth(), bmpOriginal.getHeight(), Bitmap.Config.ARGB_8888); 
Canvas tempCanvas = new Canvas(bmResult); 
tempCanvas.rotate(90, bmpOriginal.getWidth()/2, bmpOriginal.getHeight()/2); 
tempCanvas.drawBitmap(bmpOriginal, 0, 0, null); 

mImageView.setImageBitmap(bmResult); 

En este ejemplo de código se produce una rotación de 90 grados sobre el centro de la imagen.

+0

OK, si necesita hacer una imagen semitransparente o necesita una función de zoom, también puede consultar este http://stackoverflow.com/questions/4688306/how-can-i-make-image-opaque-to-some- nivel/4689624 # 4689624 – Zelimir

+2

Funciona bien si el mapa de bits original es cuadrado:) .... ¿y si no lo es? – Jay

+0

Funciona bien para mí también. ¿Cuál es el problema que encuentras? – Zelimir

0

esencialmente este: enlace

ImageView spaceshipImage = (ImageView) findViewById(R.id.spaceshipImage); 
Animation hyperspaceJumpAnimation = AnimationUtils.loadAnimation(this, R.anim.hyperspace_jump); 
spaceshipImage.startAnimation(hyperspaceJumpAnimation); 

fuente:

http://developer.android.com/guide/topics/graphics/2d-graphics.html#tween-animation

+1

¡No es lo que quería el asker, esto gira entre una serie de imágenes, lo que se quería era una rotación plana de una sola imagen! – fredley

+0

En realidad, puede realizar rotaciones (en un único Drawable) con una animación interpolada. http://developer.android.com/guide/topics/resources/animation-resource.html#Tween – edthethird

+0

Ed, gracias por el apoyo. –

9

esencialmente que se puede reducir a: hacer un (n inversa) la transformación de lona en lugar de transformar dibujable

private BitmapDrawable drawable; // or Drawable 

protected void onDraw(Canvas canvas) { // inherited from View 
    //... 
    canvas.save(); 
    canvas.rotate(degrees, pivotX, pivotY); 
    drawable.draw(canvas); 
    canvas.restore(); 
    //... 
} 

si tiene BitmapDrawable puede ser deseable para aumentar la calidad de la producción mediante el establecimiento de antialiasing

drawable.setAntialias(true); 
+0

creo que esta es la solución más eficiente por ahora –

+0

En realidad, canvas.rotate() se debe hacer _antes de dibujar el dibujable. – Ridcully

+0

¿No te pierdes la implementación de la función onMeasure? –

2

La respuesta aceptada no funciona para mí. No tengo una imagen cuadrada, así que cambié su código un poco.

private Bitmap rotateDrawable(@DrawableRes int resId) { 
    Bitmap bmpOriginal = BitmapFactory.decodeResource(getResources(), resId); 
    Bitmap bmpResult = Bitmap.createBitmap(bmpOriginal.getHeight(), bmpOriginal.getWidth(), Bitmap.Config.ARGB_8888); 
    Canvas tempCanvas = new Canvas(bmpResult); 
    int pivot = bmpOriginal.getHeight()/2; 
    tempCanvas.rotate(90, pivot, pivot); 
    tempCanvas.drawBitmap(bmpOriginal, 0, 0, null); 
    return bmpResult; 
} 

mImageView.setImageBitmap(rotateDrawable(R.drawable.some_image));