Com fer que les vostres animacions Android de Kotlin siguin accessibles

Bloc

Com fer que les vostres animacions Android de Kotlin siguin accessibles

Quan es van investigar exemples per a una primera contribució a Android, hi havia pocs exemples d’animacions escrites a Kotlin. També hi havia pocs exemples de codi de consideracions d’accessibilitat dins de les animacions natives.

Així que aquí hi anem! Vegem com escriure una animació 'expandir' nativa a Kotlin i parlarem de com ajudar els usuaris amb TalkBack o text ampliat activat. Tot el codi està disponible en això repo d'exemple , creant una única activitat amb una visualització animada al seu interior. El codi en què es basa es va escriure conjuntament Calum Turner .


Accessibilitat a Android (a11y)

Tots els dispositius Android inclouen un lector de pantalla integrat anomenat TalkBack. Es pot activar des de la configuració del dispositiu i també inclou una guia d’ús per primera vegada. Els gestos s’utilitzen per navegar per la pàgina, amb la lectura en veu alta d’elements enfocats. Sense això, una aplicació queda inutilitzable per a molts usuaris amb discapacitat visual.

És fonamental que els elements correctes es puguin enfocar, que tinguin descripcions i que s’anunciïn canvis a la vista.

Dins del mateix menú de configuració, es pot ajustar la mida de la font base per defecte, a escala 1.0. Les vistes haurien de reaccionar a aquest canvi de mida de la lletra, amb tots els elements encara presents i funcionant.

Disseny

Aquí no veurem els detalls d’estil del disseny, ja que són bastant exclusius d’aquest exemple, però val la pena ressaltar els tocs d’accessibilitat.

S'utilitzen dues propietats: android:contentDescription i android:importantForAccessibility.

El contentDescription és el que es llegeix quan un element guanya el focus. Això és essencial per a qualsevol ImageView que guanyi el focus, en cas contrari, un lector de pantalla llegirà a l'usuari el que no serveix de 'etiquetat'.

Si es tractés d'un botó, es llegiria per defecte 'botó, doble toc per activar', però per a la nostra icona ImageView especifiquem l'acció manualment, ja que no tenim aquest valor per defecte.

importantForAccessibility:no

També fem servir onCreate per desactivar l'enfocament de la visualització de text '+', ja que el text de sota de les dues insígnies proporciona una descripció i, per tant, el '+' és més confús que útil si es llegeix en veu alta.

recuperar correus electrònics aol suprimits

Per a tots dos, la prova manual en un dispositiu real amb TalkBack activat és la millor indicació de si el context té sentit sense visuals.

Amplia animació

La nostra animació s’activarà amb un toc d’icona ‘informació’, per canviar l’ampliació d’una secció de detalls.

Ho farem tot dins d’una única activitat per permetre centrar-nos simplement en el codi d’animació. En una aplicació del món real, la visió a la qual s’aplica és més probable que es trobi dins de la seva pròpia vista de fragment o reciclador, de manera que s’utilitzaria una estructura de codi més abstracta.

Configuració d'un oient

Dins del nostre exemple d'activitat personEntryBody primer hem d’establir un oient a la nostra icona i passar a la vista que es vol commutar.

0dp

També hem configurat una variable dins de la classe per fer un seguiment de si la vista es commuta, configurant-la inicialment per tancar-la.

codi netflix.com/tv8 de l'any
isToggled

Commuta l'animació expandida

Dins del nostre disseny, hem definit l’alçada de **val** expandAnimator = ValueAnimator .ofInt(startHeight, targetHeight) .setDuration(200) expandAnimator.addUpdateListener **{ val** value = **it**._animatedValue_ **as** Int body._layoutParams_.**height** = value body.requestLayout() **}** expandAnimator._doOnEnd_ **{ ** isToggled = !isToggled **}** expandAnimator.start() a measure().

Per activar aquesta obertura, hem de conèixer la nova alçada per establir-la, quant de temps ha de tenir l'animació i quina alçada ha de tenir en cada moment de l'animació.

Cal definir isToggled a la inversa i assegureu-vos que quan torneu a fer-ho faci el contrari.

[androidx]( https://developer.android.com/kotlin/ktx#core-packages)

}

Com que l’alçada quan es dibuixa la vista inicialment és 0, hem de calcular-ne la nova mida mesurant el disseny.

Tal com es descriu a Documents de disseny de visualització d'Android , podem utilitzar build.gradle juntament amb els paràmetres de disseny que hem assignat a la vista per tornar a mesurar cada cop que es toca la icona d'informació.

Per calcular l’alçada màxima hem d’afegir manualment el farciment superior i inferior, ja que no s’inclouen a l’alçada mesurada.

Depenent de doOnEnd llavors sabem si comencem des de 0 o comencem des de l'alçada màxima expandida, i per tant l'altura objectiu oposada.

Utilitzem un Value Animator per passar del valor inicial al valor final objectiu i establir la durada en ms. Aquesta durada es basa únicament en proves manuals posteriors de sensació UX.

isToggled

Lligem la durada a l'alçada amb un oient d'actualitzacions, sol·licitant que es dibuixi un nou disseny després de cada actualització i ajustem l'alçada cada vegada.

[AccessibilityEvent]( https://developer.android.com/reference/android/view/accessibility/AccessibilityEvent)

Com que fem servir Kotlin, també afegim la biblioteca measure() a la nostra

android:contentDescription='tap to toggle extra person information' 
per beneficiar-se del seu
infoIcon.setOnClickListener **{** toggleCardBody(root.personEntryBody) **}** 
extensió. Això ens permet invertir molt fàcilment el
private var isToggled = false 
variable.

Finalment comencem la nostra animació! Ja tenim un cos que s’expandeix i es contrau amb un toc d’icona.

Animacions més suaus

Tot i que la nostra animació funciona tècnicament tal qual, un bon pas addicional és afegir-ne un interpolador de manera que el moviment se senti més natural.

**private fun** toggleCardBody(body: View) { body.measure(ViewGroup.LayoutParams._MATCH_PARENT_, ViewGroup.LayoutParams._WRAP_CONTENT_) **val** maxHeight = body._measuredHeight_ + body._paddingTop_ + body._paddingBottom_ **val** startHeight = **if** (**isToggled**) maxHeight **else** 0 **val** targetHeight = **if** (**isToggled**) 0 **else** maxHeight 
|_+_|

Augmentar la nostra accessibilitat

Afegirem dues coses finals per esperar que ajudem els nostres usuaris de tot l'any.

Primer podem ajudar-vos amb la navegació mitjançant un

ValueAnimator  
.ofInt(startHeight, targetHeight)
.setDuration(200)
.

 expandAnimator.addUpdateListener  {  
val
value = it . animatedValue as Int
body. layoutParams . height = value
body.requestLayout()
} expandAnimator. doOnEnd **{
** isToggled = !isToggled } expandAnimator.start()

Això significa que quan l'animació es mou de tancat a obert, el focus saltarà immediatament al focus del primer element del cos, en aquest cas la descripció. Al disseny, definim la descripció de l'acció de la icona d'informació, però com que potser no podem confiar en un indicador visual perquè l'usuari pugui passar al següent element, ho podem gestionar.

En segon lloc, permetem diferents mides de lletra. L'alçada mesurada va tornar de

expandAnimator.  interpolator  = FastOutSlowInInterpolator()  
no té en compte l'escala de tipus de lletra establerta a la configuració d'accessibilitat dels dispositius, de manera que quan a gran escala es retallarà la part inferior de la descripció, ja que és massa gran per adaptar-se.

Podem accedir a l’escala de tipus de lletra per programació i escalar la nostra alçada en funció d’això. El convertim en un enter, ja que l’escala de tipus de lletra pot donar lloc a un flotador que no funcionaria com a alçada de disseny.

expandAnimator.  doOnEnd   {  if (!isToggled) body.sendAccessibilityEvent(AccessibilityEvent.  TYPE_VIEW_FOCUSED  )  
isToggled = !isToggled }

Acabat!

esquema de colors de codi d'estudi visual

I aquí ho tenim, hem arribat a la nostra animació final! Amb només unes poques línies addicionals hem augmentat molt la seva cobertura a11y i tenim una secció d’expansió suau que revela una insígnia Kotlin i Android.

Gràcies per llegir

Publicat originalment per Dominic Fraser a https://medium.freecodecamp.org

Aprèn més

El curs complet per a desenvolupadors d'Android Kotlin

Kotlin per a Android: principiant a avançat

Kotlin per a principiants: apreneu a programar amb Kotlin

Masterclass de desenvolupament d'Android Kotlin mitjançant Android Oreo

Kotlin per a desenvolupadors d'Android i Java: codi net a Android

Masterclass de desenvolupament d'Android Kotlin: amb Android Oreo

#kotlin #android # mobile-apps

medium.freecodecamp.org

Com fer que les vostres animacions Android de Kotlin siguin accessibles

Quan es van investigar exemples per a una primera contribució a Android, hi havia pocs exemples d’animacions escrites a Kotlin. També hi havia pocs exemples de codi de consideracions d’accessibilitat dins de les animacions natives.

tutorial sass per a principiants