2016-05-13 7 views
2

Ich versuche zu verstehen, wie 2D-Grafiken auf Android dynamisch generieren. Ich konnte kein Beispiel im Netz von jemandem finden, der das tut.android dynamische 2D-Zeichnung auf einem Canvas

Mein Beispiel unten zieht zufällig 1000 Zeilen von zufälligen Farben. Ich würde gerne alle Linien sehen, die gezeichnet werden, aber ich sehe nichts bis zum Aufruf von setContentView() (an diesem Punkt sind alle Linien bereits gezeichnet).

Ich habe viele Permutationen ausprobiert, einschließlich das Verschieben der setContentView() vor dem Aufruf von draw() und Hinzufügen von View.invalidate() innerhalb der for-Schleife, aber in jedem Fall bleibt der Bildschirm weiß bis nach allen Zeilen sind gezogen.

Wenn jemand auf ein Beispiel dieser Arbeit verweisen kann, würde ich mich freuen, es zu erforschen und die richtige Antwort hier selbst hinzuzufügen.

package com.example.graphicsdemo; 
+imports 

public class MainActivity extends Activity { 
    ImageView ourView; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     draw(); 
     setContentView(ourView); 
    } 
    public void draw() { 
     Bitmap blankBitmap = Bitmap.createBitmap(600,600,Bitmap.Config.ARGB_8888); 
     Canvas canvas = new Canvas(blankBitmap); 
     ourView = new ImageView(this); 
     ourView.setImageBitmap(blankBitmap); 
     Paint paint = new Paint(); 
     Random random = new Random(); 

     for(int i = 0 ; i < 1000 ; i++) { 
      paint.setColor(Color.argb(255, random.nextInt(255), random.nextInt(255), random.nextInt(255))); 
      canvas.drawLine(random.nextInt(600), random.nextInt(600), random.nextInt(600), random.nextInt(600), paint); 
     } 
    } 
} 

Antwort

3

Ich hoffe, dieses Beispiel helfen: zuerst Ihre eigene Ansicht machen und rufen läßt es Dynamic:

import java.util.Random; 

import android.content.Context; 
import android.graphics.Bitmap; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.util.AttributeSet; 
import android.view.View; 

public class DynamicView extends View { 
    int i = 0; 

    public DynamicView(Context context) { 
     super(context); 


    } 

    @Override 
    protected void onDraw(Canvas canvas) { 

     Paint paint = new Paint(); 
     Random random = new Random(); 
     paint.setColor(Color.argb(255, random.nextInt(255), 
       random.nextInt(255), random.nextInt(255))); 
     canvas.drawLine(random.nextInt(600), random.nextInt(600), 
       random.nextInt(600), random.nextInt(600), paint); 

     if (i < 1000) { 
      i++; 
      invalidate(); 
     } 
    } 

} 

diese Ansicht wird ein 1000 Mal ungültig macht nach jedem

zeichnen

jetzt hier Ihre Hauptaktivität onCreate-Methode:

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     DynamicView myView = new DynamicView(this); 
     setContentView(myView); 
    } 

als sim so.

Als Antwort auf Ihre Frage ist dies eine bessere Code und komplizierter, aber immer noch leicht zu verstehen Alles, was wir tun müssen, ist es, die Linien auf einem Bitmap zeichnen und dann auf der Ansicht, dass die Bitmap zeichnen, so die Bitmap ändern sich nicht und wird alle bisherigen gezeichneten Linien haben und immer noch ziehen auf sie

jetzt hier ist der aktualisierte Code:

Dynamic

import java.util.Random; 

import android.content.Context; 
import android.graphics.Bitmap; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.graphics.Rect; 
import android.util.AttributeSet; 
import android.view.View; 

public class DynamicView extends View { 
    int i = 0; 
    Bitmap frame ; 
    Canvas frameDrawer; 
    Rect bounds; 
    Paint paint ; 
    Random random ; 
    int width , height; 

    public DynamicView(Context context ,int width ,int height) { 
     super(context); 

     this.width = width; 
     this.height = height; 

     frame = Bitmap.createBitmap(width,height,Bitmap.Config.ARGB_8888); 
     frameDrawer = new Canvas(frame); 
     bounds = new Rect(0 , 0, width,height); 
     //this initialization will make the frameDrawer draw on the frame bitmap 

     //always avoid allocating new objects in the draw method to optimize the performance 
     paint = new Paint(); 
     random = new Random(); 
    } 

    @Override 
    protected void onDraw(Canvas canvas) { 


     paint.setColor(Color.argb(255, random.nextInt(255), 
       random.nextInt(255), random.nextInt(255))); 
     //instead of drawing on the view canvas draw on the frame bitmap 
     frameDrawer.drawLine(random.nextInt(width), random.nextInt(height), 
       random.nextInt(width), random.nextInt(height), paint); 
     // and then draw the bitmap on the view canvas 
     canvas.drawBitmap(frame, null, bounds , null); 

     if (i < 1000) { 
      i++; 
      invalidate(); 
     } 
    } 

} 

jetzt die neue Sache in der MainActivity ist, dass wir jetzt Kontrolle über die Zeichnung Grenzen, aber immer noch nicht die Grenzen der Ansicht, die den gesamten Bildschirm Platz nehmen können (wenn Sie die Grenzen der Ansicht anpassen implementieren nur die OnLayout-Methode und geben Sie Ihre Wert)

MainActivity

import android.os.Bundle; 
import android.app.Activity; 
import android.view.Menu; 

public class MainActivity extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     DynamicView myView = new DynamicView(this,320,480); 
     setContentView(myView); 
    } 
} 
+0

Dies ist eine hervorragende Antwort, und ich tatsächlich geholfen, die OnDraw zu verstehen()/ungültig() Paradigma. Danke für das. Ich sehe, dass ich etwas in meiner Frage weggelassen habe - ich möchte, dass neue Zeilen zur Ansicht hinzugefügt werden, so dass die Anzeige die Summe aller gezeichneten Linien ist. Als ich dein Beispiel ausführte, war das Ergebnis 1000 unabhängige Zeilen, die jeweils auf einem unberührten weißen Hintergrund gezeichnet wurden. – dkimble

+0

Vielen Dank dafür. Es funktioniert wunderbar. Jetzt ab, um mehr darüber zu erfahren, warum es funktioniert (d. H. Über Bitmaps). – dkimble