L'app in cui sto lavorando utilizza molte ImageViews come pulsanti. La grafica di questi pulsanti utilizza il canale alfa per sfumare i bordi del pulsante e renderli irregolari. Attualmente, dobbiamo generare 2 elementi grafici per ciascun pulsante (1 per lo stato selezionato/focalizzato/premuto e l'altro per lo stato predefinito non selezionato) e utilizzare un oggetto StateListDrawable definito in un file XML per ogni pulsante.Tonalità/dim. Selezionabile al tocco
Mentre funziona correttamente, sembra estremamente dispendioso poiché tutti i grafici selezionati sono semplicemente versioni colorate dei pulsanti non selezionati. Questi richiedono tempo per produrre (anche se poco) e occupare spazio nell'APK finale. Sembra che ci dovrebbe essere un modo semplice per questo automaticamente.
La soluzione perfetta, a quanto pare, è utilizzare ImageViews per ciascun pulsante e specificare nell'attributo tinta un ColorStateList. Questo approccio ha il vantaggio che è necessario un solo ColorStateList XML per tutti i pulsanti (che condividono la stessa tinta). Comunque, non funziona. Come accennato a here, ImageView genera una NumberFormatException quando il valore fornito per la tinta è diverso da un singolo colore.
Il mio prossimo tentativo era usare un LayerDrawable per il drawable selezionato. All'interno dell'elenco dei livelli, avremmo l'immagine originale nella parte inferiore della pila coperta da un rettangolo semitrasparente. Questo ha funzionato sulle parti solide della grafica del pulsante. Tuttavia, i bordi che dovevano essere completamente trasparenti ora erano dello stesso colore dello strato superiore.
Qualcuno ha riscontrato questo problema prima e ha trovato una soluzione ragionevole? Vorrei attenermi agli approcci XML ma probabilmente codificherò una sottoclasse ImageView semplice che eseguirà la tinta del codice richiesta.
Come faccio a farlo funzionare bene per i file con 9 patch, in modo che l'intera area non trasparente dell'immagine venga oscurata al tocco degli eventi? Attualmente ciò che fa per le immagini con 9 patch è di cambiare solo la parte che è definita come il contenuto dell'immagine, e non l'intera immagine stessa ... –