Dieses Codelab ist Teil des Kurses „Advanced Android in Kotlin“. Sie profitieren von diesem Kurs, wenn Sie die Codelabs nacheinander durcharbeiten. Das ist aber nicht zwingend erforderlich. Alle Kurs-Codelabs finden Sie auf der Landingpage für Codelabs auf Android-Geräten für Fortgeschrittene.
Einführung
In Android stehen Ihnen verschiedene Verfahren zur Implementierung benutzerdefinierter 2D-Grafiken und Animationen in Ansichten zur Verfügung.
Neben der Verwendung von Drawables können Sie auch Zeichnungen mit den Zeichenmethoden der Klasse Canvas
erstellen. Die Canvas
ist eine 2D-Zeichnungsoberfläche, die Methoden zum Zeichnen bietet. Das ist sinnvoll, wenn sich deine App von selbst regelmäßig neu zeichnen muss, da sich die Änderungen im Laufe der Zeit für den Nutzer ändern. In diesem Codelab lernen Sie, wie Sie auf einem View
-Element eine Leinwand erstellen und zeichnen.
Folgende Vorgänge können auf einem Canvas ausgeführt werden:
- Fülle die gesamte Fläche mit Farben.
- Zeichnen Sie Formen wie Rechtecke, Bögen und Pfade, die wie in einem
Paint
-Objekt definiert definiert sind. Das ObjektPaint
enthält die Stil- und Farbinformationen zum Zeichnen von Geometrien (z. B. Linie, Rechteck, Oval und Pfade) oder beispielsweise die Schriftart. - Transformationen wie Übersetzung, Skalierung oder benutzerdefinierte Transformationen anwenden.
- Sie können eine Clip- oder Pfadform auf den Canvas anwenden, um dessen sichtbare Teile zu definieren.
Android-Zeichnen (super vereinfacht!)
Das Zeichnen in Android oder einem anderen modernen System ist ein komplexer Prozess, der mehrere Abstraktionen in sich zieht und bei den Hardwareoptimierungen eingesetzt wird. Das Zeichnen von Android ist ein faszinierendes Thema, über das viel geschrieben wird. Es wird jedoch im Rahmen dieses Codelabs nicht gezeigt.
Für dieses Codelab und die zugehörige App, die auf einem Canvas zur Anzeige im Vollbildmodus zeichnen, können Sie sich das folgende Beispiel vorstellen.
- Sie benötigen eine Ansicht, die zeigt, was gemalt wird. Hierbei kann es sich um eine der Ansichten des Android-Systems handeln. Alternativ können Sie in diesem Codelab eine benutzerdefinierte Ansicht erstellen, die als Inhaltsansicht für Ihre App (
MyCanvasView
) dient. - Wie alle Ansichten enthält diese Ansicht einen eigenen Canvas (
canvas
). - Die einfachste Methode zum Zeichnen auf dem Canvas einer Ansicht besteht darin, dass Sie die Methode
onDraw()
überschreiben und auf dem Canvas zeichnen. - Wenn Sie eine Zeichnung erstellen, müssen Sie den zuvor gezeichneten Inhalt im Cache speichern. Es gibt mehrere Möglichkeiten, Ihre Daten im Cache zu speichern. Eine davon wird in einer Bitmap (
extraBitmap
) gespeichert. Eine andere ist das Speichern eines Verlaufs der gezeichneten Daten als Koordinaten oder Anweisungen. - Mithilfe der Canvas Zeichnungen API kannst du die Caching-Bitmap (
extraBitmap
) erstellen. Dazu erstellst du eine Caching-Canvas (extraCanvas
) für deine Caching-Bitmap. - Anschließend zeichnen Sie auf Ihrem Caching-Canvas (
extraCanvas
) auf Ihrer Caching-Bitmap (extraBitmap
). - Damit alles auf dem Bildschirm gezeichnet wird, weisest du den Canvas (
canvas
) der Ansicht an, die Caching-Bitmap (extraBitmap
) zu zeichnen.
Was Sie bereits wissen sollten
- Wie Sie eine App mit einer Aktivität, einem einfachen Layout und mit Android Studio erstellen.
- Ereignis-Handler mit Datenansichten verknüpfen
- So erstellen Sie eine benutzerdefinierte Ansicht.
Lerninhalte
- Hiermit wird ein
Canvas
-Element erstellt und als Reaktion auf Berührung des Nutzers gezeichnet.
Aufgaben
- Erstelle eine App, bei der als Reaktion auf den Nutzer, der den Bildschirm berührt, Linien auf dem Bildschirm gezeichnet werden.
- Zeichne Bewegungsereignisse auf und zeichnet daraufhin als Reaktion auf einem Canvas Linien, die in einer benutzerdefinierten Vollbildansicht auf dem Bildschirm angezeigt werden.
Die App MiniPaint verwendet eine benutzerdefinierte Ansicht, um entsprechend dem Screenshot unten eine Linie als Reaktion auf Nutzerbewegungen anzuzeigen.
Schritt 1: MiniPaint-Projekt erstellen
- Erstellen Sie ein neues Kotlin-Projekt namens MiniPaint, das die Vorlage Empty Activity (Leere Aktivität) verwendet.
- Öffnen Sie die Datei
app/res/values/colors.xml
und fügen Sie die folgenden zwei Farben hinzu.
<color name="colorBackground">#FFFF5500</color>
<color name="colorPaint">#FFFFEB3B</color>
styles.xml
öffnen- Ersetzen Sie im übergeordneten Element des angegebenen
AppTheme
StilsDarkActionBar
durchNoActionBar
. Dadurch wird die Aktionsleiste entfernt, sodass Sie im Vollbildmodus zeichnen können.
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
Schritt 2: MyCanvasView-Klasse erstellen
In diesem Schritt erstellen Sie die benutzerdefinierte Ansicht "MyCanvasView
" zum Zeichnen.
- Erstelle im
app/java/com.example.android.minipaint
-Paket eine neue Kotlin-Datei/-Klasse mit dem NamenMyCanvasView
. - Richten Sie die
MyCanvasView
-Klasse auf dieView
-Klasse aus und übergeben Sie diecontext: Context
. Akzeptieren Sie die vorgeschlagenen Importe.
import android.content.Context
import android.view.View
class MyCanvasView(context: Context) : View(context) {
}
Schritt 3: MyCanvasView als Inhaltsansicht festlegen
Um zu sehen, was du in MyCanvasView
zeichnen möchtest, musst du es als Inhaltsansicht für MainActivity
festlegen.
- Öffne
strings.xml
und definiere einen String, der für die Inhaltsbeschreibung der Ansicht verwendet werden soll.
<string name="canvasContentDescription">Mini Paint is a simple line drawing app.
Drag your fingers to draw. Rotate the phone to clear.</string>
MainActivity.kt
öffnen- Löschen Sie in
onCreate()
setContentView(R.layout.activity_main)
. - Erstelle eine Instanz von
MyCanvasView
.
val myCanvasView = MyCanvasView(this)
- Darunter fordern Sie den Vollbildmodus für das Layout
myCanvasView
an. Setzen Sie dazu das FlagSYSTEM_UI_FLAG_FULLSCREEN
aufmyCanvasView
. So wird die Ansicht vollständig vom Bildschirm ausgefüllt.
myCanvasView.systemUiVisibility = SYSTEM_UI_FLAG_FULLSCREEN
- Fügen Sie eine Inhaltsbeschreibung hinzu.
myCanvasView.contentDescription = getString(R.string.canvasContentDescription)
- Darunter kannst du die Inhaltsansicht auf
myCanvasView
setzen.
setContentView(myCanvasView)
- Führen Sie Ihre App aus. Sie sehen einen völlig weißen Bildschirm, da der Canvas keine Größe hat und Sie noch nichts gezeichnet haben.
Schritt 1: onSizeChanged() überschreiben
Die Methode onSizeChanged()
wird vom Android-System aufgerufen, wenn sich die Größe einer Ansicht ändert. Da die Ansicht ohne Größe beginnt, wird die Methode onSizeChanged()
der Ansicht auch aufgerufen, nachdem die Aktivität sie erstellt und aufgebläht hat. Diese onSizeChanged()
-Methode ist daher der ideale Ort, um den Canvas der Ansicht zu erstellen und einzurichten.
- In
MyCanvasView
können Sie auf Klassenebene Variablen für einen Canvas und eine Bitmap definieren. Nennen Sie sieextraCanvas
undextraBitmap
. Hier sehen Sie eine Bitmap und einen Canvas für das Caching der Daten.
private lateinit var extraCanvas: Canvas
private lateinit var extraBitmap: Bitmap
- Definieren Sie eine Variable
backgroundColor
auf Kursebene für die Hintergrundfarbe des Canvas und initialisieren Sie sie mit der zuvor definiertencolorBackground
.
private val backgroundColor = ResourcesCompat.getColor(resources, R.color.colorBackground, null)
- Überschreibe in „
MyCanvasView
“ die Methode „onSizeChanged()
“. Diese Callback-Methode wird vom Android-System mit den geänderten Bildschirmabmessungen aufgerufen, d. h. mit einer neuen Breite und Höhe (zum Ändern) und der alten Breite und Höhe (zum Ändern).
override fun onSizeChanged(width: Int, height: Int, oldWidth: Int, oldHeight: Int) {
super.onSizeChanged(width, height, oldWidth, oldHeight)
}
- Erstellen Sie in
onSizeChanged()
eine Instanz vonBitmap
mit der neuen Breite und Höhe (der Bildschirmgröße) und weisen Sie sieextraBitmap
zu. Das dritte Argument ist die Bitmap-Farbkonfiguration.ARGB_8888
speichert jede Farbe in 4 Byte und wird empfohlen.
extraBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888)
- Erstellen Sie eine
Canvas
-Instanz ausextraBitmap
und weisen Sie sieextraCanvas
zu.
extraCanvas = Canvas(extraBitmap)
- Geben Sie die Hintergrundfarbe an, in der
extraCanvas
gefüllt werden soll.
extraCanvas.drawColor(backgroundColor)
- Mit
onSizeChanged()
werden bei jeder Ausführung der Funktion eine neue Bitmap und ein Canvas erstellt. Du benötigst eine neue Bitmap, da sich die Größe geändert hat. Es handelt sich dabei jedoch um ein Speicherleck. Dabei verbleiben die alten Bitmaps. Reparieren SieextraBitmap
, bevor Sie den nächsten erstellen, indem Sie diesen Code direkt nach dem Aufruf vonsuper
hinzufügen.
if (::extraBitmap.isInitialized) extraBitmap.recycle()
Schritt 2: onDraw() überschreiben
Alle Zeichnungen für MyCanvasView
werden in onDraw()
ausgeführt.
Rufen Sie zuerst den Canvas auf und füllen Sie den Bildschirm mit der Hintergrundfarbe, die Sie in onSizeChanged()
festgelegt haben.
- Überschreiben Sie
onDraw()
und zeichnen Sie den Inhalt des im Cache gespeichertenextraBitmap
auf dem mit der Ansicht verknüpften Canvas. Die MethodedrawBitmap()
Canvas
gibt es in mehreren Versionen. In diesem Code kannst du die Bitmap, die x- und y-Koordinaten (in Pixeln) der linken oberen Ecke und dienull
für diePaint
angeben, da diese später festgelegt werden.
override fun onDraw(canvas: Canvas) {
super.onDraw(canvas)
canvas.drawBitmap(extraBitmap, 0f, 0f, null)
}
Der Canvas, der an onDraw()
übergeben und vom System zum Anzeigen der Bitmap verwendet wird, unterscheidet sich von der Oberfläche, die Sie in der onSizeChanged()
-Methode erstellt und von Ihnen zum Zeichnen auf der Bitmap verwendet haben.
- Führen Sie Ihre App aus. Anschließend sollte der gesamte Bildschirm mit der angegebenen Hintergrundfarbe gefüllt sein.
Zum Zeichnen benötigen Sie ein Paint
-Objekt, das angibt, wie gezeichnet wird, und ein Path
-Element, das angibt, was gezeichnet werden soll.
Schritt 1: Paint-Objekt initialisieren
- Definieren Sie in MyCanvasView.kt auf oberster Ebene eine Konstante für die Strichbreite.
private const val STROKE_WIDTH = 12f // has to be float
- Definieren Sie auf Klassenebene von
MyCanvasView
die VariabledrawColor
, in der die Farbe gezeichnet werden soll, und initialisieren Sie sie mit dercolorPaint
-Ressource, die Sie zuvor definiert haben.
private val drawColor = ResourcesCompat.getColor(resources, R.color.colorPaint, null)
- Fügen Sie auf Kursebene unten eine Variable
paint
für einPaint
-Objekt ein und initialisieren Sie sie so:
// Set up the paint with which to draw.
private val paint = Paint().apply {
color = drawColor
// Smooths out edges of what is drawn without affecting shape.
isAntiAlias = true
// Dithering affects how colors with higher-precision than the device are down-sampled.
isDither = true
style = Paint.Style.STROKE // default: FILL
strokeJoin = Paint.Join.ROUND // default: MITER
strokeCap = Paint.Cap.ROUND // default: BUTT
strokeWidth = STROKE_WIDTH // default: Hairline-width (really thin)
}
- Die
color
derpaint
ist diedrawColor
, die Sie zuvor definiert haben. isAntiAlias
definiert, ob die Kantenglättung angewendet wird. Mit der EinstellungisAntiAlias
auftrue
werden die Ränder der gezeichneten Elemente geglättet (ohne Beeinträchtigung der Form).isDither
, wenn „true
“, wirkt sich darauf aus, wie Farben mit höherer Genauigkeit als das Gerät analysiert werden. Durch Dithering wird der Farbbereich der Bilder am häufigsten auf die 256 (oder weniger) Farben reduziert.- Mit
style
wird die Art des Malens auf einen Strich festgelegt. Das ist im Grunde eine Linie. MitPaint.Style
wird angegeben, ob das zu zeichnende ursprüngliche Element gefüllt, strichelt oder beides (in derselben Farbe) ist. Standardmäßig wird das Objekt gefüllt, auf das der Paint angewendet wird. Mit „Füllung“ färben Sie die Form innen ein, während „Schlag & Strich“ der Kontur folgt. strokeJoin
vonPaint.Join
gibt an, wie Linien und Kurvensegmente in einem Strich dargestellt werden. Der Standardwert istMITER
.- Mit
strokeCap
wird die Form des Endes der Linie als Kappe festgelegt. MitPaint.Cap
werden der Anfang und das Ende von Strichlinien und -pfaden angegeben. Der Standardwert istBUTT
. strokeWidth
gibt die Breite des Strichs in Pixeln an. Standardmäßig ist die Breite der Haare sehr dünn. Daher wird die zuvor festgelegte KonstanteSTROKE_WIDTH
festgelegt.
Schritt 2: Pfadobjekt initialisieren
Der Path
ist der Pfad dessen, was der Nutzer zeichnet.
- Füge in
MyCanvasView
eine Variablepath
hinzu und initialisieren Sie sie mit einemPath
Objekt, um den Pfad zu speichern, der gezeichnet wird, wenn Sie dem Nutzer auf dem Bildschirm folgen. Importieren Sieandroid.graphics.Path
für diePath
.
private var path = Path()
Schritt 1: Auf Bewegung auf dem Display reagieren
Die Methode onTouchEvent()
in einer Ansicht wird aufgerufen, wenn der Nutzer das Display berührt.
- Überschreibe in
MyCanvasView
dieonTouchEvent()
-Methode, um diex
- undy
-Koordinaten der inevent
übergebenen Werte im Cache zu speichern. Verwende dann einenwhen
-Ausdruck, um Bewegungsereignisse zu verarbeiten, indem du entweder auf dem Bildschirm nach unten gehst, den Bildschirm bewegst oder die Touch-Geste auf dem Bildschirm loslässt. Mithilfe dieser Ereignisse wird auf dem Bildschirm eine Linie gezeichnet. Rufen Sie für jeden Ereignistyp eine Dienstprogrammmethode auf, wie im Code unten dargestellt. Eine vollständige Liste aller Touch-Ereignisse finden Sie in der Dokumentation zu derMotionEvent
-Klasse.
override fun onTouchEvent(event: MotionEvent): Boolean {
motionTouchEventX = event.x
motionTouchEventY = event.y
when (event.action) {
MotionEvent.ACTION_DOWN -> touchStart()
MotionEvent.ACTION_MOVE -> touchMove()
MotionEvent.ACTION_UP -> touchUp()
}
return true
}
- Fügen Sie auf Kursebene die fehlenden Variablen
motionTouchEventX
undmotionTouchEventY
zum Caching der X- und Y-Koordinaten des aktuellen Touch-Ereignisses hinzu (MotionEvent
-Koordinaten). Initialisiere sie mit0f
.
private var motionTouchEventX = 0f
private var motionTouchEventY = 0f
- Erstellen Sie Stubs für die drei Funktionen
touchStart()
,touchMove()
undtouchUp()
.
private fun touchStart() {}
private fun touchMove() {}
private fun touchUp() {}
- Dein Code sollte erstellt und ausgeführt werden, du siehst aber noch keinen andersfarbigen Hintergrund.
Schritt 2: „touchStart()“ implementieren
Diese Methode wird aufgerufen, wenn der Nutzer zum ersten Mal den Bildschirm berührt.
- Fügen Sie auf Kursebene Variablen hinzu, um die neuesten x- und y-Werte im Cache zu speichern. Nachdem sich der Nutzer nicht mehr bewegt und die Berührung aufgehoben hat, ist dies der Ausgangspunkt für den nächsten Pfad (das nächste Segment der Linie, die gezeichnet werden soll).
private var currentX = 0f
private var currentY = 0f
- Implementiere die
touchStart()
-Methode. Setzen Siepath
zurück, bewegen Sie sich zu den x-y-Koordinaten des Touch-Ereignisses (motionTouchEventX
undmotionTouchEventY
) und weisen Sie diesem WertcurrentX
undcurrentY
zu.
private fun touchStart() {
path.reset()
path.moveTo(motionTouchEventX, motionTouchEventY)
currentX = motionTouchEventX
currentY = motionTouchEventY
}
Schritt 3: „touchMove()“ implementieren
- Fügen Sie auf Kursebene eine
touchTolerance
-Variable hinzu und legen Sie sie aufViewConfiguration.get(context).scaledTouchSlop
fest.
private val touchTolerance = ViewConfiguration.get(context).scaledTouchSlop
Wenn Sie einen Pfad verwenden, ist es nicht erforderlich, jedes Pixel zu zeichnen, und jedes Mal, wenn eine Aktualisierung des Bildschirms erforderlich ist. Stattdessen können (und werden) Sie einen Pfad zwischen Punkten kombinieren, um eine bessere Leistung zu erzielen.
- Wenn Sie den Finger kaum bewegen, müssen Sie nicht zeichnen.
- Wenn du mit dem Finger weniger als die
touchTolerance
-Strecke bewegst, nicht zeichnen. scaledTouchSlop
gibt den Abstand in Pixeln an, den eine Berührung überschreitet, bevor das System annimmt, dass der Nutzer scrollt.
- Definieren Sie die
touchMove()
-Methode. Berechne die Entfernung, die du zurückgelegt hast (dx
,dy
), erstelle eine Kurve zwischen den beiden Punkten und speichere sie inpath
. Aktualisiere dann die laufendecurrentX
und diecurrentY
. Zeichnen Sie dann diepath
. Rufen Sie danninvalidate()
auf, um das erneute Entfernen des Bildschirms mit der aktualisiertenpath
zu erzwingen.
private fun touchMove() {
val dx = Math.abs(motionTouchEventX - currentX)
val dy = Math.abs(motionTouchEventY - currentY)
if (dx >= touchTolerance || dy >= touchTolerance) {
// QuadTo() adds a quadratic bezier from the last point,
// approaching control point (x1,y1), and ending at (x2,y2).
path.quadTo(currentX, currentY, (motionTouchEventX + currentX) / 2, (motionTouchEventY + currentY) / 2)
currentX = motionTouchEventX
currentY = motionTouchEventY
// Draw the path in the extra bitmap to cache it.
extraCanvas.drawPath(path, paint)
}
invalidate()
}
Hier finden Sie weitere Informationen:
- Die zurückgelegte Strecke berechnen (
dx, dy
). - Wenn die Bewegung weiter als die Touch-Toleranz erfolgte, fügen Sie dem Pfad ein Segment hinzu.
- Legen Sie als Startpunkt für das nächste Segment den Endpunkt dieses Segments fest.
- Erstellen Sie mit
quadTo()
stattlineTo()
eine nahtlos gezeichnete Linie ohne Ecken. Weitere Informationen finden Sie unter Bezierkurven. - Rufe
invalidate()
auf (eventuellonDraw()
aufrufen) und zeichnen Sie die Ansicht neu.
Schritt 4: „touchUp()“ implementieren
Hebt er die Touchbedienung auf, wird der Pfad zurückgesetzt. Es wird nichts gezeichnet, sodass keine Entwertung erforderlich ist.
- Implementiere die
touchUp()
-Methode.
private fun touchUp() {
// Reset the path so it doesn't get drawn again.
path.reset()
}
- Führen Sie den Code aus und zeichnen Sie mit dem Finger auf dem Bildschirm. Wenn Sie das Gerät drehen, wird der Bildschirm gelöscht, da der Zeichenstatus nicht gespeichert wird. In dieser Beispiel-App ist dies bewusst so, dass der Nutzer den Bildschirm einfach schließen kann.
Schritt 5: Rahmen um die Skizze zeichnen
Während der Nutzer auf dem Bildschirm zeichnet, erstellt deine App den Pfad und speichert ihn in der Bitmap extraBitmap
. Mit der Methode onDraw()
wird die zusätzliche Bitmap im Canvas der Ansicht angezeigt. In onDraw()
können Sie mehr zeichnen. Du kannst beispielsweise Formen zeichnen, nachdem du die Bitmap gezeichnet hast.
In diesem Schritt zeichnen Sie einen Rahmen um den Rand des Bilds.
- Füge in
MyCanvasView
eine Variable namensframe
hinzu, die einRect
-Objekt enthält.
private lateinit var frame: Rect
- Erstellen Sie am Ende von
onSizeChanged()
einen Platzhalter und fügen Sie Code hinzu, um mithilfe der neuen Abmessungen und des Einfügens denRect
für den Frame zu erstellen.
// Calculate a rectangular frame around the picture.
val inset = 40
frame = Rect(inset, inset, width - inset, height - inset)
- Zeichnen Sie in
onDraw()
nach der Bitmap ein Rechteck.
// Draw a frame around the canvas.
canvas.drawRect(frame, paint)
- Führen Sie Ihre App aus. beachten Sie den Frame.
Aufgabe (optional): Daten in einem Pfad speichern
In der aktuellen App werden die Zeicheninformationen in einer Bitmap gespeichert. Das ist zwar eine gute Lösung, aber es ist nicht die einzige Möglichkeit, Zeichnungen zu speichern. Wie Sie den Verlauf Ihrer Zeichnungen speichern, hängt von der App und Ihren verschiedenen Anforderungen ab. Wenn Sie z. B. Formen zeichnen, können Sie eine Liste der Formen mit Ort und Abmessungen speichern. Für die MiniPaint App könnten Sie den Pfad als Path
speichern. Hier ist ein allgemeiner Überblick über den Vorgang, wenn du ihn ausprobieren möchtest.
- Entferne in
MyCanvasView
den gesamten Code fürextraCanvas
undextraBitmap
. - Fügen Sie Variablen für den bisherigen Pfad und den aktuellen Pfad hinzu.
// Path representing the drawing so far
private val drawing = Path()
// Path representing what's currently being drawn
private val curPath = Path()
- Zeichnen Sie in
onDraw()
anstelle der Bitmap die gespeicherten und aktuellen Pfade.
// Draw the drawing so far
canvas.drawPath(drawing, paint)
// Draw any current squiggle
canvas.drawPath(curPath, paint)
// Draw a frame around the canvas
canvas.drawRect(frame, paint)
- Fügen Sie in
touchUp()
den aktuellen Pfad zum vorherigen Pfad hinzu und setzen Sie den aktuellen Pfad zurück.
// Add the current path to the drawing so far
drawing.addPath(curPath)
// Rewind the current path for the next touch
curPath.reset()
- Führen Sie Ihre App aus, und ja, es gibt keinen Unterschied.
Laden Sie den Code für das fertige Codelab herunter.
$ git clone https://github.com/googlecodelabs/android-kotlin-drawing-canvas
Alternativ können Sie das Repository als ZIP-Datei herunterladen, entpacken und in Android Studio öffnen.
- Ein
Canvas
ist eine 2D-Zeichnungsoberfläche, die Methoden zum Zeichnen bietet. - Das
Canvas
kann einerView
-Instanz zugeordnet werden, von der sie angezeigt wird. - Das Objekt
Paint
enthält die Stil- und Farbinformationen zum Zeichnen von Geometrien (z. B. Linie, Rechteck, Oval und Pfade) und Text. - Ein gängiges Muster für das Arbeiten mit einem Canvas besteht darin, eine benutzerdefinierte Ansicht zu erstellen und die Methoden
onDraw()
undonSizeChanged()
zu überschreiben. - Überschreibe die Methode
onTouchEvent()
, um Berührungen von Nutzern zu erfassen und darauf zu reagieren, indem sie Elemente zeichnen. - Sie können eine zusätzliche Bitmap zum Speichern von Informationen für Zeichnungen verwenden, die sich im Laufe der Zeit ändern. Alternativ können Sie Formen oder einen Pfad speichern.
Udacity-Kurs:
Android-Entwicklerdokumentation:
Canvas
-KlasseBitmap
-KlasseView
-KlassePaint
-KlasseBitmap.config
-KonfigurationenPath
-Klasse- Wikipedia-Seite zu Bezierkurven
- Canvas und Drawables
- Artikel zur Graphics Architecture (erweitert)
- Drawables
- onDraw()
- onSizeChanged()
MotionEvent
ViewConfiguration.get(context).scaledTouchSlop
In diesem Abschnitt werden mögliche Hausaufgaben für Schüler oder Studenten aufgeführt, die an diesem von einem Kursleiter geleiteten Codelab arbeiten. Die Lehrkraft kann Folgendes tun:
- Bei Bedarf können Sie die entsprechenden Aufgaben zuweisen.
- Schülern mitteilen, wie sie Aufgaben für die Aufgabe abgeben
- Benoten Sie die Hausaufgaben.
Lehrkräfte können diese Vorschläge so oft oder so oft verwenden, wie sie möchten. anderen Aufgaben können sie nach Belieben zugewiesen werden.
Wenn Sie alleine an diesem Codelab arbeiten, können Sie Ihr Wissen mit diesen Hausaufgaben testen.
Diese Fragen beantworten
Frage 1
Welche der folgenden Komponenten sind für die Arbeit mit einer Canvas
erforderlich? Wählen Sie alle zutreffenden Antworten aus.
▢ Bitmap
▢ Paint
▢ Path
▢ View
Frage 2
Welche Auswirkungen hat ein Anruf auf invalidate()
?
▢ Die App wird ungültig.
▢ Damit wird die Zeichnung aus der Bitmap gelöscht.
▢ Gibt an, dass der vorherige Code nicht ausgeführt werden soll.
▢ Das System wird darüber informiert, dass es den Bildschirm neu zeichnen muss.
Frage 3
Welche Funktion haben die Objekte Canvas
, Bitmap
und Paint
?
▢ 2D-Zeichnungsoberfläche, auf dem Bildschirm angezeigte Bitmap, Stilinformationen
▢ 3D-Zeichnungsoberfläche, Bitmap zum Speichern des Pfads, Gestaltung von Informationen zum Zeichnen
▢ 2D-Zeichnungsoberfläche, auf dem Bildschirm angezeigte Bitmap, Stil für die Ansicht
▢ Cache zum Zeichnen von Informationen, Bitmap zum Zeichnen, Stil für Zeichnen
Links zu weiteren Codelabs in diesem Kurs finden Sie auf der Landingpage des erweiterten Android-Tools in Kotlin.