2012-05-19 16 views
5

Pracuję z obrazami o dużych rozmiarach, a gdy próbuję je obracać, pojawia się wiele sekund (applying matrix on the bitmap). Widziałem, że galeria systemu Android może wykonać to zadanie w bardzo szybki sposób. Jak to jest możliwe?Najszybszy sposób obracania wielkoformatowej bitmapy

Myślałem, aby wykonać obrót na asyncTask, stosując tylko obrót ImageView (który nie zajmuje dużo czasu) na głównym wątku, ale jeśli aplikacja zostanie zabita, zanim asyncTask dotrze do końca, aplikacja spada w niespójnym stanie.

To mój bitmapy kod obrót, który trwa długi czas realizacji dużych bitmap:

Matrix mat = new Matrix(); 
mat.setRotate(90); 
bMap = Bitmap.createBitmap(bMap, 0, 0, bMap.getWidth(), bMap.getHeight(), mat, true); 

Odpowiedz

3

Podczas modyfikacji dużego obrazu, należy utworzyć małą kopię jakość bitmapy nim i używać go do pokazywania natychmiastowy obrót lub inne efekty edycji. Po zatrzymaniu ruchu użytkownika (lub pozostawieniu suwaka) zastąp bitmapę niskiej jakości obrazem oryginalnym z zastosowanymi do niej efektami. To znacznie poprawi komfort użytkowania. Spróbuj i daj mi znać.

Może to brzmieć jak odchylenie od pierwotnego wymogu - można narysować prostokąt zamiast obracać cały obraz w czasie rzeczywistym. Ostatecznie to, czego potrzebuje użytkownik, wskazuje na to, jak bardzo obraz się obrócił. Będzie to szybsze i można je łatwo wykonać w wątku UI bez opóźnień.

Jest to najprostszy obrót na kodzie płótnie

canvas.save(); //save the position of the canvas 
canvas.rotate(angle, X + (imageW/2), Y + (imageH/2)); //rotate the canvas 
canvas.drawBitmap(imageBmp, X, Y, null); //draw the image on the rotated canvas 
canvas.restore(); // restore the canvas position. 
+0

To jest dobry pomysł, aby poprawić doświadczenia użytkownika, oczywiście. Ale głównym problemem jest to, że gdy pracuję nad oryginalnym obrazem na końcu, zadanie może wymagać dużo czasu i mam te komplikacje: - jeśli wykonuję operację na głównym wątku, użytkownik musi czekać - jeśli wykonam operację na asyncTask, aplikacja powinna zostać zabita przed jej zakończeniem, a zmiany zostaną utracone –

+0

Może to brzmieć jak odchylenie od pierwotnego wymogu - możesz narysować prostokąt zamiast obracać cały obraz w czasie rzeczywistym . w końcu to, czego potrzebuje użytkownik, wskazuje na to, jak bardzo obraz się obrócił. Będzie to szybsze i łatwiejsze do wykonania w wątku UI bez opóźnień. – Ronnie

+0

Przepraszam za nieporozumienie, moje pytanie brzmi: "Jak wykonać rotację mapy bitowej w szybki sposób, jak to robi galeria systemu". W każdym razie jestem bardzo zdezorientowany twoimi wskazówkami. Na końcu potrzebuję wykonać obrót na dużej bitmapie, nie dać użytkownikowi wskazania o rotacji, tak jak powiedziałeś. Ponadto zezwalam tylko na obrót o 90, 180, 270, 360 stopni, tak jak pozwala na to galeria. Dziękuję za cierpliwość :) –

Powiązane problemy