2010-04-11 3 views
13

Ich bin gewohnt, Grafiken mit Old-School-Bibliotheken (Allegro, GD, Pygame) zu behandeln, wo, wenn ich einen Teil einer Bitmap in einen anderen kopieren möchte ... Ich benutze nur Blit.Wie blit() in Android?

Ich versuche herauszufinden, wie man das in Android, und ich wurde sehr verwirrt. Also ... haben wir diese Canvas, die schreibgeschützt sind, und Bitmaps, die schreibgeschützt sind? Es scheint zu dumm, um real zu sein, da muss etwas sein, das mir fehlt, aber ich kann es wirklich nicht herausfinden.

bearbeiten: um genau zu sein ... wenn Bitmaps nur gelesen werden, und Leinwand sind Schreib nur, ich kann nicht blitten A in B und dann in C B?

Antwort

17

Der Code ein Bitmap in eine andere ist wie folgt zu kopieren:

Rect src = new Rect(0, 0, 50, 50); 
Rect dst = new Rect(50, 50, 200, 200); 
canvas.drawBitmap(originalBitmap, src, dst, null); 

, der angibt, dass Sie die linke obere Ecke (50x50) einer Bitmap, und dann strecken, dass in ein 150x150 Bitmap kopieren möchten, und Schreibe es 50px Offset von der oberen linken Ecke der Leinwand.

Sie können das Zeichnen über invalidate() auslösen, aber ich empfehle die Verwendung eines SurfaceView, wenn Sie Animation machen. Das Problem mit invalidate ist, dass es nur zeichnet, wenn der Thread in den Leerlauf geht, so dass Sie ihn nicht in einer Schleife verwenden können - er würde nur den letzten Frame zeichnen. Hier sind einige Links zu anderen Fragen, die ich über Grafiken beantwortet habe. Sie könnten nützlich sein, um zu erklären, was ich meine.


Als Reaktion auf die Kommentare finden Sie hier weitere Informationen: Wenn Sie das Canvas von einem SurfaceHolder.lockCanvas() erhalten, dann glaube ich nicht, dass Sie die restlichen Daten in eine Bitmap kopieren können. Aber das ist nicht das, wofür diese Kontrolle ist - Sie benutzen es nur, wenn Sie alles aussortiert haben und bereit sind zu zeichnen.

Was Sie tun möchten, ist eine Leinwand erstellen, die in eine Bitmap zeichnet mit

Canvas canvas = new Canvas(yourBitmap) 

Sie können dann, was Transformationen und Zeichnung ops Sie wünschen. yourBitmap enthält alle neuesten Informationen.Dann Sie verwenden die Oberfläche Halter wie so:

Canvas someOtherCanvas = surfaceHolder.lockCanvas() 
someOtherCanvas.drawBitmap(yourBitmap, ....) 

diese Weise werden Sie immer yourBitmap haben, die in ihm, was Informationen hat Sie zu erhalten versuchen.

+0

Es tut mir leid, ich verstehe immer noch nicht eins: Sie zeichnen in eine Leinwand, nicht in eine Bitmap. Da Canvas, soweit ich es verstehe, schreibgeschützt ist, können Sie das Ziel nicht auf ein NEUES zeichnen. –

+1

Ja, Sie zeichnen nicht direkt in Bitmaps, sondern mithilfe eines Canvas. Verwenden Sie etwas wie folgt: 'Bitmap someBitmap = Bitmap.createBitmap (Breite, Höhe, Bitmap.Config.RGB_565);' um ein Bitmap mit bestimmten Dimensionen und Farbraum zu erstellen, dann 'Canvas Canvas = neues Canvas (someBitmap);' zu machen Zeichnungsbefehle zu diesem Canvas ändern die Bitmap. –

+0

Also, wenn ich das Canvas von einem SurfaceHolder mit lockCanvas bekomme, habe ich keine Möglichkeit, auf dieses Bitmap zum Lesen zuzugreifen? –

-1

In Android, die Sie auf die Leinwand zeichnen, und wenn Sie es aktualisieren möchten, rufen Sie Invalidate, die die Leinwand auf den Bildschirm neu zeichnen wird. Ich nehme an, Sie haben die onDraw-Methode Ihrer Ansicht überschrieben, also fügen Sie einfach 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(); 
} 

Der obige Code neu zeichnet einfach die Bitmap ständig, natürlich Sie in zusätzliche Sache hinzufügen möchten eine Timing-Funktion zu zeichnen und zu prüfen, verwenden, die invalidate ruft, damit sie nicht ständig läuft. Ich würde dir raten, sich die Quellen aus dem Mondlande anzusehen.

+0

Ja, aber was ist, wenn ich eine Bitmap in eine andere Bitmap zeichnen und die zweite in die Leinwand schreiben möchte? –

+0

Warum nicht beide auf die Leinwand zeichnen? Der Canvas wird erst aktualisiert, wenn der Invalidate aufgerufen wird. – stealthcopter