Teinte / dim drawable sur la touche
L'application que je suis en train de travailler sur utilise beaucoup de ImageViews comme des boutons. Les graphiques sur ces boutons pour utiliser le canal alpha de la fermeture de l'un des bords de la touche et de leur donner un aspect irrégulier. Actuellement, nous avons à générer des 2 graphiques pour chaque bouton 1 pour sélectionner/concentré/l'état activé et l'autre pour la valeur par défaut désactivée état) et l'utilisation d'un StateListDrawable définis dans un fichier XML pour chaque bouton.
Alors que cela fonctionne bien, il semble extrêmement peu rentable puisque tous les graphiques sélectionnés sont tout simplement teinté versions de la partie non sélectionnée boutons. Ces prendre le temps de produire (mais peu) et prennent de la place dans la finale APK. Il semble qu'il devrait y avoir un moyen facile de ce automatiquement.
La solution parfaite, il me semble, est d'utiliser ImageViews pour chaque bouton et de spécifier dans sa teinte d'attribut d'un ColorStateList. Cette approche a l'avantage qu'une seule XML ColorStateList est nécessaire pour tous les boutons (qui partagent la même teinte). Toutefois, il ne fonctionne pas. Comme mentionné ici, ImageView jette un NumberFormatException lorsque la valeur fournie à la teinte n'est rien d'autre que d'une seule couleur.
Ma prochaine tentative a été d'utiliser un LayerDrawable pour le drawable. À l'intérieur de la liste des calques, on aurait l'image d'origine au bas de la pile couverts par un semi-transparente rectangle. Il a travaillé sur les parties solides de la touche graphique. Cependant les bords, qui étaient censés être entièrement transparent, étaient maintenant de la même couleur que la couche supérieure.
Quelqu'un a rencontré ce problème avant et trouvé une solution raisonnable? Je voudrais tenir à XML des approches, mais sera probablement le code d'un simple ImageView sous-classe qui fera le nécessaire teinter dans le code.
OriginalL'auteur zienkikk | 2011-11-07
Vous devez vous connecter pour publier un commentaire.
Vous pouvez combiner
StateListDrawable
etLayerDrawable
pour cela.Je suppose que notre colors.xml on dirait que cette
OriginalL'auteur sealskej
Pour ceux qui ont rencontré un besoin similaire, la résolution de ce code est assez propre. Voici un exemple:
C'est pas fini, mais fonctionne bien comme une preuve de concept.
Merci, très cool! J'ai modifié le onTouchEvent un peu comme ceci:
else if ((event.getAction() == MotionEvent.ACTION_UP || event.getAction() == MotionEvent.ACTION_CANCEL) && mIsSelected)
Cela garantit que la teinte disparaît lorsque l'utilisateur maintient le bouton, le fait glisser son doigt à l'extérieur et les rejets.init()
ne doit être appelée que dans leTintableButton(Context context, AttributeSet attrs, int defStyle)
constructeurOriginalL'auteur zienkikk
Votre réponse était excellent 🙂
Cependant, au lieu de créer un objet bouton, je ne suis qu'à l'appel d'une OnTouchlistener pour modifier l'état de chaque vue.
Donne les mêmes résultats si
OriginalL'auteur htafoya
Je pense que cette solution est simple!
Étape 1: Créer res/drawable/dim_image_view.xml
Étape 2: Créer res/drawable/dim_image_view_normal.xml
Étape 3: Créer res/drawable/dim_image_view_pressed.xml
Étape 4: Essayez de définir l'image en xml mise en page:
OriginalL'auteur Joao Ferreira
J'ai trop irrégulières, à la recherche de boutons et ont besoin de la teinte. En fin de compte, j'ai juste eu recours pour avoir un état colorlist que mon
ImageButton
arrière-plan. Donne l'impression que la couleur du bouton change sur la presse et est très simple et moins intensives en calcul. Je sais que ce n'est pas exactement une teinte, mais il ne donner qu'il n'est nécessaire de donner de la rétroaction visuelle à l'utilisateur, dans ce qui est habituellement un instant fugace.OriginalL'auteur Code Poet
Vous pouvez utiliser une classe que j'ai créé https://github.com/THRESHE/TintableImageButton
Pas exactement la meilleure solution, mais il fonctionne.
OriginalL'auteur Kostia Dombrovsky
Votre réponse était également excellent 😉
Je suis modifiant peu peu, il vous donnera un résultat de ce genre:
OriginalL'auteur Favas Kv
Je pense que cette solution est assez simple:
OriginalL'auteur android developer