2012-06-25 25 views
5

Non riesco a disegnare una bitmap rotante attorno al suo centro e a fare la rotazione senza ridimensionare la bitmap. Sto disegnando tutti i miei folletti sullo schermo tramite un thread di gioco, quindi sto cercando una soluzione che incorpori la bitmap originale e non la tela.Android ruota la bitmap attorno al centro senza ridimensionare

Grazie in anticipo.

Questo è il mio codice finora, trasforma una bitmap attorno al suo centro, ma lo ridimensiona.

i = i + 2; 
      transform.postRotate(i, Assets.scoresScreen_LevelStar.getWidth()/2, Assets.scoresScreen_LevelStar.getHeight()/2); 
      Bitmap resizedBitmap = Bitmap.createBitmap(Assets.scoresScreen_LevelStar, 0, 0, Assets.scoresScreen_LevelStar.getWidth(), Assets.scoresScreen_LevelStar.getHeight(), transform, true); 

      game.getGraphics().getCanvasGameScreen().drawBitmap(resizedBitmap, null, this.levelStar.getHolderPolygons().get(0), null); 

Aggiornamento:

ho notato questo non è così facile come sembra. Il mio codice rotante non è il problema. La bitmap ruota, tuttavia il dst rect dovrà anche aumentare/diminuire in base all'angolo di rotazione, altrimenti il ​​bimap apparirà più piccolo, poiché viene disegnato in un fisso dst rect. Quindi immagino che dovrò sviluppare un metodo che restituirà un dst rect. Così i metodi necessari per ruotare una bitmap senza apparso ridimensionamento:

public static Bitmap rotateBitmap(Bitmap bitmap, int rotation) // I've got this method working 

e

public static Rect rotateRect(Rect currentDst, int rotation) // Don't got this 

Capisco che questo richiederà un po 'di matematica (trig), chiunque pronto per la sfida? : P

+0

Che cosa hai provato fino ad ora? Puoi pubblicare alcuni esempi di ciò che non ha funzionato per te? –

+0

Diritto Android o Cocos2d-x? – Fallenreaper

+0

Domanda aggiornata con codice, @Fallenreaper, sto usando il mio GE, Android così dritto. –

risposta

0

Questo ha funzionato per me!

Ho creato un metodo che restituisce una matrice. La matrice può essere utilizzata nel seguente metodo di disegno:

public void drawBitmap (Bitmap bitmap, Matrix matrix, Paint paint) 

Ecco qui! (La forma parametro può essere sostituita con facilità, se si desidera che, basta lasciare un commento):

public static Matrix rotateMatrix(Bitmap bitmap, Shape shape, int rotation) { 

     float scaleWidth = ((float) shape.getWidth())/bitmap.getWidth(); 
     float scaleHeight = ((float) shape.getHeight())/bitmap.getHeight(); 

     Matrix rotateMatrix = new Matrix(); 
     rotateMatrix.postScale(scaleWidth, scaleHeight); 
     rotateMatrix.postRotate(rotation, shape.getWidth()/2, shape.getHeight()/2); 
     rotateMatrix.postTranslate(shape.getX(), shape.getY()); 


     return rotateMatrix; 

    } 

NB: Se si desidera una rotazione animata, il parametro di rotazione dovrà essere aggiornato con nuovi valori ogni cornice es. 1 poi 2 poi 3 ...

7

È necessario disegnare la bitmap utilizzando la classe Matrix. Di seguito è riportata una idea di base, assumendo che si desideri ruotare un'immagine all'interno di una classe "Ship". Si aggiorna la posizione corrente Matrice all'interno del metodo di aggiornamento. In onDraw() si disegna la bitmap usando la matrice di posizione appena aggiornata. Questo disegnerà la bitmap ruotata senza ridimensionarla.

public class Ship extends View { 

    private float x, y; 
    private int rotation; 
    private Matrix position;  
    private Bitmap bitmap; 

    ... 

    @Override 
    public void onDraw(Canvas canvas) { 
     // Draw the Bitmap using the current position 
     canvas.drawBitmap(bitmap, position, null); 
    } 

    public void update() { 
     // Generate a new matrix based off of the current rotation and x and y coordinates. 
     Matrix m = new Matrix(); 
     m.postRotate(rotation, bitmap.getWidth()/2, bitmap.getHeight()/2); 
     m.postTranslate(x, y); 

     // Set the current position to the updated rotation 
     position.set(m); 

     rotation += 2; 
    } 

    .... 

} 

Spero che questo aiuti!

Ricorda inoltre che la generazione di un nuovo oggetto Bitmap all'interno del tuo ciclo di gioco richiede molte risorse.

+0

Potresti riscrivere, che posso chiamare un metodo statico chiamato rotateBitmap (Bitmap bitmap, rotazione int), che restituirà un oggetto Bimap ruotato in Bitmap? –

+0

il metodo cambia la bitmap che si passa, quindi la variabile privata "bitmap Bitmap privata"; non è ruotato.Basta "restituire bitmap"; e cambia la firma del metodo. – Aziz

+0

Siamo spiacenti, questo non funziona per me. –

Problemi correlati