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?

Author: o0'., 2010-04-11

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.


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ć.

 18
Author: Steve Haley,
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.

 -1
Author: stealthcopter,
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