Rendering-Grundlagen
Dieser Leitfaden behandelt die grundlegenden Konzepte des Renderings mit Skija, von der Erstellung einer Zeichenoberfläche bis zur Ausführung grundlegender Zeichenoperationen.
Die Surface und der Canvas
In Skia (und Skija) findet das gesamte Zeichnen auf einem Canvas statt. Ein Canvas benötigt jedoch ein Ziel, in das gezeichnet wird, das von einer Surface bereitgestellt wird.
Off-Screen-Rendering (Raster)
Der einfachste Einstieg ist die Erstellung einer Raster-Surface (im Speicher). Dies ist ideal zum Generieren von Bildern, für serverseitiges Rendering oder zum Testen.
// Erstelle eine 100x100 Pixel große Surface mit dem Standard-N32-Farbformat (normalerweise RGBA oder BGRA)
Surface surface = Surface.makeRasterN32Premul(100, 100);
// Hole den Canvas von der Surface
Canvas canvas = surface.getCanvas();Das Canvas-Objekt ist Ihre primäre Schnittstelle zum Zeichnen. Es verwaltet den aktuellen Zustand (Transformationen, Clipping) und stellt die Zeichenmethoden bereit.
Verwendung von Paint
Während der Canvas definiert, wo und was gezeichnet wird, definiert das Paint-Objekt, wie es gezeichnet wird. Ein Paint-Objekt enthält Informationen über Farben, Strichstile, Blending-Modi und verschiedene Effekte.
Paint paint = new Paint();
paint.setColor(0xFFFF0000); // Vollständig deckendes RotArbeiten mit Farben
Farben werden in Skija als 32-Bit-Ganzzahlen im ARGB-Format dargestellt:
0xgefolgt vonFF(Alpha),RR(Rot),GG(Grün),BB(Blau).0xFFFF0000ist Deckendes Rot.0xFF00FF00ist Deckendes Grün.0xFF0000FFist Deckendes Blau.0x80000000ist Halbtransparentes Schwarz.
Grundlegende Zeichenoperationen
Der Canvas bietet viele Methoden zum Zeichnen von Primitiven.
// Zeichne einen Kreis bei (50, 50) mit Radius 30
canvas.drawCircle(50, 50, 30, paint);
// Zeichne eine einfache Linie
canvas.drawLine(10, 10, 90, 90, paint);
// Zeichne ein Rechteck
canvas.drawRect(Rect.makeXYWH(10, 10, 80, 80), paint);Erfassen und Speichern der Ausgabe
Nach dem Zeichnen auf einer Surface möchten Sie das Ergebnis oft als Bilddatei speichern.
// 1. Erstelle eine Momentaufnahme des aktuellen Surface-Inhalts als Image
Image image = surface.makeImageSnapshot();
// 2. Kodiere das Bild in ein bestimmtes Format (z.B. PNG)
Data pngData = image.encodeToData(EncodedImageFormat.PNG);
// 3. Konvertiere die Daten in einen ByteBuffer zum Schreiben
ByteBuffer pngBytes = pngData.toByteBuffer();
// 4. Schreibe in eine Datei mit Standard-Java-I/O
try {
java.nio.file.Path path = java.nio.file.Path.of("output.png");
Files.write(path, pngBytes.array());
} catch (IOException e) {
e.printStackTrace();
}Lesen von Pixeln (Bildschirmaufnahme)
Wenn Sie die Rohpixeldaten von der Surface benötigen (z.B. zur Verarbeitung oder Inspektion), ohne sie in ein Bildformat zu kodieren:
// Erstelle eine Bitmap zum Speichern des Ergebnisses
Bitmap bitmap = new Bitmap();
bitmap.allocPixels(ImageInfo.makeN32Premul(100, 100));
// Lese Pixel von der Surface in die Bitmap
// Liest die gesamte Surface, wenn die Größen übereinstimmen
surface.readPixels(bitmap, 0, 0);
// Für einen bestimmten Bereich (z.B. 50x50 Bereich beginnend bei 10, 10)
Bitmap region = new Bitmap();
region.allocPixels(ImageInfo.makeN32Premul(50, 50));
surface.readPixels(region, 10, 10);Verkettete API
Viele Skija-Setter geben this zurück, was eine fließende, Builder-ähnliche API ermöglicht:
Paint strokePaint = new Paint()
.setColor(0xFF1D7AA2)
.setMode(PaintMode.STROKE)
.setStrokeWidth(2f)
.setAntiAlias(true);