2012-05-04 14 views
5

Sto tentando di mostrare un'immagine, che può essere ingrandita e ridotta e che ruota con una lettura della bussola. Con il codice qui sotto, tutte e tre le azioni funzionano, ma si influenzano a vicenda.Rotazione, conversione e ridimensionamento simultaneo di bitmap su tela Android

Ecco quello che voglio raggiungere:
1. Ruotare intorno al centro dello schermo
2. Scala lasciando la stessa parte del quadro nel centro
3. Pan nel punto desiderato nella foto

Ecco ciò che sta realmente accadendo con il codice qui sotto:
1. la rotazione funziona come previsto, intorno al centro dello schermo
2. opere Scaling, ma scale intorno al centro dell'immagine
3. Traduzione funziona solo come previsto se angle è zero, altrimenti si muove in una direzione sbagliata

// the center of the view port 
float centerX = screen.right/2; 
float centerY = screen.bottom/2; 

Matrix m = new Matrix(); 
m.preRotate(angle, centerX, centerY); 
m.preScale(mScaleFactor, mScaleFactor, centerX, centerY); 

// scaling the amount of translation, 
// rotating the translation here gave crazy results 
float x = mPosX/mScaleFactor; 
float y = mPosY/mScaleFactor; 
m.preTranslate(x, y); 

canvas.drawBitmap(pic, m, null); 

Se traduco prima, e poi ruotare, la traduzione funziona come previsto, ma la rotazione non è attorno al centro di la porta di visualizzazione più.

Come posso applicare tutte e tre le trasformazioni, senza che si influenzino a vicenda?

risposta

1

Non sono sicuro del ridimensionamento attorno al centro dell'immagine, ma poiché la traduzione è nella direzione sbagliata, non è una conseguenza della rotazione dell'immagine ma non delle traduzioni? Forse provare qualcosa di simile:

float x = (mPosX*(cos(angle) + sin(angle))/mScaleFactor; 
float y = (mPosY*(cos(angle) - sin(angle))/mScaleFactor; 
m.preTranslate(x, y); 

, inoltre, non l'oggetto matrice di avere un metodo per applicare una affine transformation direttamente? Perché allora non dovrai pensare all'ordine delle operazioni.

La trasformazione affine potrebbe essere simile a questo:

M = |mScaleFactor*cos(angle)  sin(angle)   x| 
    |  -sin(angle)   mScaleFactor*cos(angle) y| 
    |   0       0    1| 

Ma questo ruoterà dietro l'angolo dell'immagine, quindi è necessario utilizzare la funzione preTranslate() prima in questo modo:

Mt.preTranslate(-centerX,-centerY); 

E APPLICARE Mt a pic prima di applicare M e poi dopo aver bisogno di applicare -Mt

+0

Ruotare la traduzione sembra solo compensare la rotazione, ma ho anche la sensazione che questo è ciò che io d. Le matrici Android sono 3x3, quindi immagino che siano già trasformazioni affini? – modemuser

+0

Quindi magari provare ad impostare direttamente la matrice invece di usare quei metodi pre-rotazione, pre-scala? Quindi la tua matrice dovrebbe essere qualcosa come la modifica nel post sopra – Dan

+0

Con questa matrice, il panning funziona, ma il ridimensionamento ruota anche l'immagine, la rotazione ridimensiona anche l'immagine e la rotazione avviene attorno a un angolo dell'immagine. È come whac-a-mole, ma grazie per il tuo contributo. – modemuser

Problemi correlati