Jak blit () w Androidzie?
Jestem przyzwyczajony do obsługi grafiki w starych bibliotekach (allegro, GD, pygame), gdzie jeśli chcę skopiować część bitmapy do innej... Ja tylko używam blit.
Próbuję wymyślić, jak to zrobić w Androidzie, i bardzo się pogubiłem. Więc... mamy te płótna, które są tylko do zapisu, i bitmapy, które są tylko do odczytu? To wydaje się zbyt głupie, żeby było prawdziwe, musi być coś, co mi umyka, ale naprawdę nie mogę tego rozgryźć.
edit : aby być bardziej precyzyjnym... jeśli bitmapy są tylko do odczytu, a canvas są tylko do zapisu, nie mogę przebić A do B, a następnie B do C?
2 answers
Kod do skopiowania jednej bitmapy do drugiej wygląda następująco:
Rect src = new Rect(0, 0, 50, 50);
Rect dst = new Rect(50, 50, 200, 200);
canvas.drawBitmap(originalBitmap, src, dst, null);
To określa, że chcesz skopiować lewy górny róg (50x50) bitmapy, a następnie rozciągnąć ją na bitmapę 150x150 i zapisać ją przesuniętą o 50px od lewego górnego rogu obszaru roboczego.
Możesz wywołać rysowanie za pomocą invalidate (), ale zalecam użycie SurfaceView, jeśli robisz animację. Problem z invalidate polega na tym, że rysuje tylko wtedy, gdy wątek przestaje działać, więc nie można go używać w pętli - to narysuje tylko ostatnią klatkę. Oto kilka linków do innych pytań, na które odpowiedziałem na temat grafiki, mogą się przydać do wyjaśnienia, co mam na myśli.
- Jak narysować prostokąt (pusty lub wypełniony i kilka innych opcji)
- Jak utworzyć własny SurfaceView dla animacji
- [19]} linki do kodu dla aplikacji z losowo odbijającymi się kulkami na ekranie, w tym również sterowanie dotykowe
- trochę więcej informacji o SurfaceView versus Invalidate ()
- niektóre trudności z ręcznym obracaniem rzeczy
W odpowiedzi na komentarze, oto więcej informacji: Jeśli uzyskasz płótno z otworu powierzchniowego.lockCanvas() w takim razie nie wydaje mi się, aby można było skopiować pozostałe dane, które były w niej na bitmapę. Ale nie do tego służy ta kontrola - używasz tylko wtedy, gdy już wszystko uporządkowałeś i jesteś gotowy do rysowania.
To, co chcesz zrobić, to stworzyć płótno, które rysuje w bitmapie za pomocą
Canvas canvas = new Canvas(yourBitmap)
Możesz wtedy robić dowolne przekształcenia i rysować operacje, które chcesz. yourBitmap będzie zawierał wszystkie najnowsze informacje. następnie używasz uchwytu powierzchni tak:
Canvas someOtherCanvas = surfaceHolder.lockCanvas()
someOtherCanvas.drawBitmap(yourBitmap, ....)
W ten sposób zawsze masz swoją bitmapę, która zawiera wszelkie informacje, które próbujesz zachować.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:55:19
W Androidzie rysujesz płótno, a gdy chcesz je zaktualizować, wywołujesz invalidate, które spowoduje ponowne narysowanie tego płótna na ekranie. Domyślam się, że nadpisałeś metodę onDraw swojego widoku, więc po prostu dodaj invalidate ();
@Override
public void onDraw(Canvas canvas) {
// Draw a bitmap to the canvas at 0,0
canvas.drawBitmap(mBitmap, 0, 0, null);
// Add in your drawing functions here
super.onDraw(canvas);
// Call invalidate to draw to screen
invalidate();
}
Powyższy kod po prostu stale przerysowuje bitmapę, oczywiście chcesz dodać dodatkową rzecz do rysowania i rozważyć użycie funkcji czasowej, która wywołuje unieważnienie, aby nie była stale uruchomiona. Radzę spojrzeć na lunarlandera źródła.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-21 13:27:20