2013-07-12 18 views
7

Wiem, że SO jest pełne pytań Matrix, ale nie mogę znaleźć pytania, w którym jest ono w pełni wyjaśnione. Domyślam się, że każdy ImageView ma Matrix, który jest odpowiedzialny za skalowanie, obracanie i pozycję. Ale dlaczego nie mogę obrócić obraz przy użyciu macierzy tak:zrozumienie użycia ImageView Matrix

ImageView img = (ImageView)findViewById(R.id.some_imageview); 
img.setScaleType(ScaleType.Matrix); 
Rect bounds = img.getDrawable.getBounds(); 
img.getImageMatrix().postRotate(180f, bounds.width()/2, bounds.height()/2); 

kilka odpowiedzi sugerować, aby zrobić to w ten sposób:

ImageView img = (ImageView)findViewById(R.id.some_imageview); 
img.setScaleType(ScaleType.Matrix); 
Rect bounds = img.getDrawable.getBounds(); 
Matrix rotationMatrix = new Matrix(); 
rotationMatrix.postRotate(180f, bounds.width()/2, bounds.height()/2); 
img.setImageMatrix(rotationMatrix); 

dlatego muszę stworzyć nową matryca za każdym razem kiedy chcesz się obracać? Co więcej, jeśli ustawię macierz z drugiego przykładu, dlaczego ponownie się nie obróci (do pierwotnego poziomu), jeśli ustawię ponownie rotationMatrix? Jeśli chcę uzyskać oryginalny stopień, mogę ustawić gładką Matrix. ale Ponownie, NIE rozumiem, dlaczego nie będzie działać.

Uwaga: Próbowałem również metodę setRotate bez zachowania żadnej różnicy

EDIT: ze względu na komentarz

Poprosiłem Dlaczego muszę utworzyć nowe spędzaj Matrix, co implikuje pytanie, dlaczego Nie mogę używać Matrix w miejscu. Co Podejrzewam do pracy też był to (które faktycznie nie będzie, zbyt):

ImageView img = (ImageView)findViewById(R.id.some_imageview); 
img.setScaleType(ScaleType.Matrix); 
Rect bounds = img.getDrawable.getBounds(); 
Matrix rotationMatrix = new Matrix(); 
rotationMatrix.postRotate(180f, bounds.width()/2, bounds.height()/2); 
img.setImageMatrix(rotationMatrix); 
//works until here. 

//Then after that successful call 

//assumed to get my Matrix back, which is rotated by 180 degrees 

Matrix matrix = img.getImageMatrix(); 
Rext bounds = img.getDrawable().getBounds() 
//rotate again at 90 degree. It should be now rotated 270 degrees (180 from before, plus 90 now) 
matrix.postRotate(90f, bounds.width()/2, bounds.height()/2); 
//unfortunately NO effect! 
img.setImageMatrix(matrix); 
+0

Dokumentacja mówi, że nie powinieneś używać matrycy zwróconej przez getImageMatrix. Spójrz [tutaj] (http://developer.android.com/reference/android/widget/ImageView.html#getImageMatrix()) – Blackbelt

+0

@blackbelt Prosiłem o wyjaśnienie DLACZEGO nie powinienem używać tej matrycy w miejscu, przynajmniej jeśli nie jest zerowy ..., zwłaszcza jeśli ustawiłem go wcześniej ... –

+1

Właściwie zapytałeś: "DLACZEGO za każdym razem, gdy chcę obrócić, muszę utworzyć nową Matrix?" – Blackbelt

Odpowiedz

1

Patrząc na source to wygląda jak w metodzie setImageMatrix() obliczenie macierzy jest stosowana. Korzystanie z tej macierzy później (tj. Po uzyskaniu jej przez getter) nie będzie miało żadnego efektu, jeśli obliczenia wykonywane są w metodzie ustawiającej.