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);
}
}
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
Vielen Dank dafür. Es funktioniert wunderbar. Jetzt ab, um mehr darüber zu erfahren, warum es funktioniert (d. H. Über Bitmaps). – dkimble