Wie zu zeichnen auf Leinwand von SurfaceView?
Ich versuche zu tun, einfache Maler. Das problem, dass es aussieht wie Android verfügt über drei unabhängige Canvas-Bereich und geben Sie mir es zum zeichnen der Reihe nach.
Ich aus UI mit SurfaceView
, nahm Halter von ihm.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
sv = (SurfaceView) findViewById(R.id.sv);
holder = sv.getHolder();
holder.addCallback(callback);
}
Dann nahm der Oberfläche.
@Override
public void surfaceCreated(SurfaceHolder holder) {
surface = holder.getSurface();
}
Und durch die Ereignisse aus OnTouchListener()
zeichnen von Punkten und Linien.
private void paintStartDot(float x, float y) {
Canvas canvas = surface.lockCanvas(null);
canvas.drawPoint(x, y, drawPaint);
surface.unlockCanvasAndPost(canvas);
lastX = x;
lastY = y;
}
private void paintEndDot(float x, float y) {
Canvas canvas = surface.lockCanvas(null);
canvas.drawLine(lastX, lastY, x, y, drawPaint);
surface.unlockCanvasAndPost(canvas);
lastX = x;
lastY = y;
}
Screencast:
Was ist falsch?
Komplette Quellcode ist hier verfügbar:
https://github.com/tseglevskiy/canvasdemo1/blob/error/app/src/main/java/ru/jollydroid/canvasdemo1/MainActivity.java
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den
Canvas
dassSurface.lockCanvas
gibt Sie ist nicht persistent. Der moment, den Sie anrufenunlockCanvasAndPost
, den Inhalt der Oberfläche Puffer geschoben werden, aus dem Bildschirm. Jedes mal, wenn Sie rufenlockCanvas
müssen Sie zeichnen das Bild von Grund auf.Wenn Sie möchten, aktualisieren Sie die Leinwand schrittweise, halten Sie die "off-screen" Leinwand, unterstützt durch ein
Bitmap
, dass Sie die Aktualisierung in Reaktion auf die Aktionen des Benutzers. Dann malen Sie die bitmap in dieSurface
Leinwand.Ich bin mir nicht sicher, ob Sie wirklich brauchen eine
SurfaceView
. Sie konnte nur die Erweiterung derView
und überschreiben Sie dieView.onDraw
Methode. In diesem Fall, rufen Sieview.invalidate()
um anzuzeigen, dass er neu gezeichnet werden muss.Siehe auch: Android-Ansicht.onDraw() hat immer einen sauberen Leinwand