Próbuję wyświetlić obraz, który można powiększać i przesuwać, a który obraca się z odczytem kompasu. Z poniższym kodem wszystkie trzy rodzaje działań działają, ale wpływają na siebie nawzajem.Jednoczesne obracanie, tłumaczenie i skalowanie bitmapy w obszarze roboczym z Androidem
Oto co chcę osiągnąć:
1. Obrót wokół środka ekranu
2. Skala pozostawiając taką samą część obrazu w centrum
3. Pan do żądanego miejsca w obrazie
Oto, co faktycznie dzieje się z poniższym kodzie:
1. Rotacja działa zgodnie z przeznaczeniem, po środku ekranu
2. prace skalowanie, ale waga to po środku obrazu
3. Tłumaczenie działa tylko zgodnie z przeznaczeniem, jeśli angle
wynosi zero, w przeciwnym razie to zmierza w złym kierunku
// 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);
Gdybym przetłumaczyć pierwszy, a później obrócić, tłumaczenie działa zgodnie z przeznaczeniem, ale rotacja nie jest wokół środka port widoku.
Jak zastosować wszystkie trzy transformacje, bez wzajemnego oddziaływania?
Obracanie tłumaczenia wydaje się tylko zrównoważyć rotację, ale mam także wrażenie, że to właśnie to mnie podoba re. Macierze Android to 3x3, więc domyślam się, że już są transformacjami afinicznymi? – modemuser
Może więc spróbuj ustawić macierz bezpośrednio, zamiast korzystać z metod preRotate, preScale? Tak więc twoja macierz powinna być czymś podobnym do edycji w poście powyżej – Dan
Ta macierz działa, przesuwanie działa, ale skalowanie również obraca obraz, obrót także skaluje obraz, a obrót odbywa się wokół rogu obrazu. To jak whac-a-mole, ale dzięki za twój wkład. – modemuser