====== Android Canvas : Views Personalitzades ======
{{ android:display_canvas.png?200}}
Article de referència: [[Android]]
En aquest article veiem com crear una ''View'' o //widget// personalitzat, dibuixant directament sobre ell amb l'objecte ''Canvas''.
{{tag> #Dam #DamMp08 #DamMp08Uf1 #DamMp08Uf01 #DamMp08Uf2 Android mobile kotlin }}
\\
===== Crear una nova View =====
Ves a la carpeta amb els arxius de codi Kotlin/Java i clica amb el botó dret o vés a:
File -> New -> Kotlin Class/File
Posa-li el nom que desitgis, per exemple Display:
class Display @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
) : View(context, attrs, defStyleAttr) {
private val paint = Paint().apply {
color = Color.BLUE
style = Paint.Style.FILL
isAntiAlias = true
}
override fun onDraw(canvas: Canvas) {
super.onDraw(canvas)
// Fons
canvas.drawColor(Color.WHITE)
// pintem un quadrat del 25% al 75% de l'alçada i amplada
canvas.drawRect(
width * 0.25f, // left
height * 0.75f, // top
width * 0.75f, // right
height * 0.25f, // bottom
paint)
}
}
Fixa't en què:
* ''width'' i ''height'' els agafem de la classe ''View'' i retorna els tamanys reals del //widget// al dispositiu.
* Hem sobreescrit el mètode ''onDraw''
\\
===== Afegeix la nova classe al layout =====
La manera més fàcil és afegir una View genèrica amb la interfície gràfica, amb els tamanys que ens convingui, i després anar al codi XML i canviar el tipus de //widget// per la nova ''class'' que hem creat.
Canviariem l'element '''' per ''''
Segurament quedaria similar a aquest exemple (dins d'una //constraint layout//):
\\
===== Aplicar canvis als dibuixos sobre el widget =====
El més còmode per dibuixar-hi de forma dinàmica és posar el codi dins de la nova classe ''Display'' i repintar sempre tota la ''View''.
Per forçar que es repinti podem cridar la funció ''View.invalidate()'', la qual acabarà amb la crida a ''onDraw'' que hem implementat:
val display = findViewById(R.id.display)
display.invalidate()