J'édite pour rendre la question plus simple, en espérant que cela aide à une réponse précise.
Disons que j'ai la oval
forme suivante :
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval">
<solid android:angle="270"
android:color="#FFFF0000"/>
<stroke android:width="3dp"
android:color="#FFAA0055"/>
</shape>
Comment définir la couleur par programmation, à partir d'une classe d'activités?
android
android-layout
shape
Côte Mounyo
la source
la source
oval
et est l'arrière-plan d'un ImageView.View
classe et en l'utilisant commebase
vue dans une mise en page qui permet le chevauchement des widgets (RelativeLayout
,FrameLayout
). Dans cetteView
classe étendue , vous pouvezdraw multiple images onto a canvas
. Mais avant de faire cela, jetez un œil à ceci -> Lien (si vous ne l'avez pas déjà fait).Réponses:
Remarque : La réponse a été mise à jour pour couvrir le scénario où
background
trouve une instance deColorDrawable
. Merci Tyler Pfaff , de l'avoir signalé.Obtenez le
Drawable
deimageView
utilisationgetBackground()
:Vérifiez contre les suspects habituels:
Version compacte:
Notez que la vérification des valeurs nulles n'est pas requise.
Cependant, vous devez utiliser
mutate()
sur les drawables avant de les modifier s'ils sont utilisés ailleurs. (Par défaut, les dessinables chargés à partir de XML partagent le même état.)la source
solid
partie de la forme. Et lastroke
portion?@username
votre commentaire pour vous assurer qu'une notification est envoyée à l'utilisateur. À propos, vous devrezShapeDrawable
créer une sous-classe pour définir la partie de trait. Plus d'informations ici: Lien . Regardez le commentaire car il mentionne un problème avec la réponse acceptée.ImageView's
arrière-plan est défini sur aGradientDrawable
,getBackground()
ne renverra pas de fichierShapeDrawable
. Au lieu de cela, utilisez leGradientDrawable
qui est retourné:GradientDrawable gradientDrawable = (GradientDrawable)imageView.getBackground();
....gradientDrawable.setColors(new int[] { color1, color2 });
.Fait comme ça:
la source
android:background
votre xml ou même unesetBackground
activité avant d'appelergetBackground()
? Cela devrait fonctionner si vous l'aviez fait.Une solution plus simple de nos jours serait d'utiliser votre forme comme arrière-plan, puis de changer sa couleur par programmation via:
Voir PorterDuff.Mode pour les options disponibles.
MISE À JOUR (API 29):
La méthode ci-dessus est obsolète depuis l'API 29 et remplacée par la suivante:
Voir BlendMode pour les options disponibles.
la source
view.getBackground().setColorFilter(Color.parseColor("#343434"), PorterDuff.Mode.SRC_ATOP);
Puisqu'il peut y avoir une bordure sur le fond ou des cournes arrondies.getBackground()
appel. Mon imageview.src contenait une forme et j'ai utilisé:imageIndicator.setColorFilter(toggleColor, PorterDuff.Mode.SRC_ATOP);
oùtoggleColor
est juste un int qui a précédemment stocké le résultat de getColor ()PorterDuff.Mode
pourBlendModeColorFilter
ne compilera pas comme il se doitBlendMode
. Donc, pour l'API 29, cela devrait êtreview.background.colorFilter = BlendModeColorFilter(Color.parseColor("#343434"), BlendMode.SRC_ATOP)
.Essaye ça:
Pour plus de détails consultez ce lien ce
espérons de l'aide.
la source
j'espère que cela aidera quelqu'un avec le même problème
la source
gd.setStroke(width_px, Color.parseColor("#FF5722"));
En développant la réponse de Vikram , si vous colorez des vues dynamiques, comme des éléments de vue recycleur, etc. Vous voudrez probablement appeler mutate () avant de définir la couleur. Si vous ne le faites pas, toutes les vues qui ont un dessin commun (c.-à-d. Un arrière-plan) verront également leur dessin modifié / coloré.
la source
if (background instanceof LayerDrawable) { background = ((LayerDrawable) background.mutate()).getDrawable(indexIfLayerDrawable); } if (background instanceof ShapeDrawable)[...]
pour gérer les dispositions d'arrière-plans qui utilisent<layer-list ... <item ...
.Cette question a reçu une réponse il y a quelque temps, mais elle peut être modernisée en la réécrivant en tant que fonction d'extension kotlin.
la source
c'est la solution qui fonctionne pour moi ... l'a également écrit dans une autre question: Comment changer la couleur de la forme de manière dynamique?
la source
Rien ne fonctionne pour moi, mais lorsque je règle la couleur de la teinte, cela fonctionne sur Shape Drawable
nécessite Android 5.0 API 21
la source
Version de la fonction d'extension My Kotlin basée sur les réponses ci-dessus avec Compat :
la source
Le moyen simple de remplir la forme avec le rayon est:
la source
Peut-être suis-je trop tard, mais si vous utilisez Kotlin. Il y a un moyen comme ça
Prendre plaisir....
la source
Pour tous ceux qui utilisent C # Xamarin, voici une méthode basée sur l'extrait de code de Vikram:
la source