2011-01-21 12 views
16

Come è possibile ruotare un Drawable da una risorsa quando viene disegnato? Ad esempio, mi piacerebbe disegnare una freccia ed essere in grado di ruotarlo per affrontare in direzioni diverse quando viene disegnato?Rotazione di un elemento estraibile in Android

+0

possibile duplicato di [Come posso disegnare una freccia che indica la direzione di marcia in MapView?] (Http://stackoverflow.com/questions/4331794/how-can-i-draw-an-arrow-showing -the-driving-direction-in-mapview) – Jonas

+0

La domanda è abbastanza diversa, ma penso che la risposta potrebbe essere correlata. – Computerish

risposta

20

È necessario utilizzare le funzioni di Bitmap e classe Canvas per preparare drawable:

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); 

In questo esempio di codice si verifica una rotazione di 90 gradi rispetto al centro dell'immagine.

+0

OK, se hai bisogno di rendere l'immagine semitrasparente o di avere bisogno della funzione di zoom, puoi controllare anche questo http://stackoverflow.com/questions/4688306/how-can-i-make-image-opaque-to-some- level/4689624 # 4689624 – Zelimir

+2

Funziona bene se la bitmap originale è quadrata:) .... e se non lo fosse? – Jay

+0

Funziona bene anche per me. Qual è il problema che incontri? – Zelimir

0

essenzialmente questo: Link

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

fonte:

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

+1

Non è quello che voleva il richiedente, questo ruota tra una serie di immagini, quello che si voleva era una rotazione planare di una singola immagine! – fredley

+0

In realtà, è possibile eseguire rotazioni (su un singolo disegno) con un'animazione di interpolazione. http://developer.android.com/guide/topics/resources/animation-resource.html#Tween – edthethird

+0

Ed, grazie per il supporto. –

9

essenzialmente può essere riassunta in: fare un (n inversa) tela trasformazione invece di trasformare drawable

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(); 
    //... 
} 

se avete BitmapDrawable può essere desiderabile aumentare la qualità della produzione impostando antialiasing

drawable.setAntialias(true); 
+0

Penso che questa sia la soluzione più efficace ora –

+0

In realtà canvas.rotate() deve essere eseguito _prima_ disegnando il drawable. – Ridcully

+0

non ti manca l'implementazione della funzione onMeasure? –

2

La risposta accettata non funziona per me. Ho un'immagine non quadrata, quindi ho cambiato un po 'il suo codice.

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)); 
Problemi correlati