J'ai
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:shape="rectangle">
<solid
Android:color="#FFFF00" />
<padding Android:left="7dp"
Android:top="7dp"
Android:right="7dp"
Android:bottom="7dp" />
</shape>
<TextView
Android:background="@drawable/test"
Android:layout_height="45dp"
Android:layout_width="100dp"
Android:text="Moderate"
/>
Alors maintenant, je veux que cette forme change de couleur en fonction des informations que je récupère d'un appel de service Web. Cela peut donc être jaune, vert ou rouge, ou autre chose, en fonction de la couleur que je reçois de l'appel du service Web.
Comment puis-je changer la couleur de la forme? Basé sur cette information?
Vous pouvez le modifier simplement comme ceci
GradientDrawable bgShape = (GradientDrawable)btn.getBackground();
bgShape.setColor(Color.BLACK);
Pour moi, il s'est écrasé car getBackground
a renvoyé une GradientDrawable
au lieu d'une ShapeDrawable
.
Donc je l'ai modifié comme ça:
((GradientDrawable)someView.getBackground()).setColor(someColor);
Cela fonctionne pour moi, avec une ressource XML initiale:
example.setBackgroundResource(R.drawable.myshape);
GradientDrawable Gd = (GradientDrawable) example.getBackground().getCurrent();
Gd.setColor(Color.parseColor("#000000"));
Gd.setCornerRadii(new float[]{30, 30, 30, 30, 0, 0, 30, 30});
Gd.setStroke(2, Color.parseColor("#00FFFF"), 5, 6);
Résultat de ce qui précède: http://i.stack.imgur.com/hKUR7.png
Vous pouvez créer vos propres formes en Java. Je l'ai fait pour un iPhone comme Page Controler et Paint the shape in Java
/**
* Builds the active and inactive shapes / drawables for the page control
*/
private void makeShapes() {
activeDrawable = new ShapeDrawable();
inactiveDrawable = new ShapeDrawable();
activeDrawable.setBounds(0, 0, (int) mIndicatorSize,
(int) mIndicatorSize);
inactiveDrawable.setBounds(0, 0, (int) mIndicatorSize,
(int) mIndicatorSize);
int i[] = new int[2];
i[0] = Android.R.attr.textColorSecondary;
i[1] = Android.R.attr.textColorSecondaryInverse;
TypedArray a = this.getTheme().obtainStyledAttributes(i);
Shape s1 = new OvalShape();
s1.resize(mIndicatorSize, mIndicatorSize);
Shape s2 = new OvalShape();
s2.resize(mIndicatorSize, mIndicatorSize);
((ShapeDrawable) activeDrawable).getPaint().setColor(
a.getColor(0, Color.DKGRAY));
((ShapeDrawable) inactiveDrawable).getPaint().setColor(
a.getColor(1, Color.LTGRAY));
((ShapeDrawable) activeDrawable).setShape(s1);
((ShapeDrawable) inactiveDrawable).setShape(s2);
}
espérons que cela aide . Greez Fabian
Peut-être que quelqu'un d'autre a besoin de changer de couleur dans le XML sans créer plusieurs dessinables comme j'en avais besoin. Créez ensuite un cercle dessinable sans couleur, puis spécifiez backgroundTint pour ImageView.
circle.xml
<?xml version="1.0" encoding="utf-8"?>
<shape
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:shape="oval">
</shape>
Et dans votre layout:
<ImageView
Android:layout_width="50dp"
Android:layout_height="50dp"
Android:background="@drawable/circle"
Android:backgroundTint="@color/red"/>
Modifier:
Il existe un bug concernant cette méthode qui l'empêche de fonctionner sur Android Lollipop 5.0 (niveau 21 de l'API). Mais ont été corrigés dans les versions les plus récentes.
circle.xml (dessinable)
<?xml version="1.0" encoding="utf-8"?>
<shape
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:shape="rectangle">
<solid
Android:color="#000"/>
<size
Android:width="10dp"
Android:height="10dp"/>
</shape>
disposition
<ImageView
Android:id="@+id/circleColor"
Android:layout_width="15dp"
Android:layout_height="15dp"
Android:textSize="12dp"
Android:layout_gravity="center"
Android:layout_marginLeft="10dp"
Android:background="@drawable/circle"/>
en activité
circleColor = (ImageView) view.findViewById(R.id.circleColor);
int color = Color.parseColor("#00FFFF");
((GradientDrawable)circleColor.getBackground()).setColor(color);
LayerDrawable bgDrawable = (LayerDrawable) button.getBackground();
final GradientDrawable shape = (GradientDrawable)
bgDrawable.findDrawableByLayerId(R.id.round_button_shape);
shape.setColor(Color.BLACK);
Cette solution a fonctionné pour moi avec le sdk Android v19:
//get the image button by id
ImageButton myImg = (ImageButton) findViewById(R.id.some_id);
//get drawable from image button
GradientDrawable drawable = (GradientDrawable) myImg.getDrawable();
//set color as integer
//can use Color.parseColor(color) if color is a string
drawable.setColor(color)
Si vous avez une image comme celle-ci:
<ImageView
Android:id="@+id/color_button"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_marginRight="10dp"
Android:src="@drawable/circle_color"/>
qui lui donne une forme dessinable en tant que src, vous pouvez utiliser ce code pour changer la couleur de la forme:
ImageView iv = (ImageView)findViewById(R.id.color_button);
GradientDrawable bgShape = (GradientDrawable)iv.getDrawable();
bgShape.setColor(Color.BLACK);
Ma forme xml:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:Android="http://schemas.Android.com/apk/res/Android">
<solid Android:color="@Android:color/transparent" />
<stroke Android:width="0.5dp" Android:color="@Android:color/holo_green_dark"/>
</shape>
Mon activité xml:
<?xml version="1.0" encoding="utf-8"?>
<Android.support.design.widget.CoordinatorLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto"
xmlns:tools="http://schemas.Android.com/tools"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:fitsSystemWindows="true"
tools:context="cn.easydone.test.MainActivity">
<Android.support.design.widget.AppBarLayout
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:theme="@style/AppTheme.AppBarOverlay">
<Android.support.v7.widget.Toolbar
Android:id="@+id/toolbar"
Android:layout_width="match_parent"
Android:layout_height="?attr/actionBarSize"
Android:background="?attr/colorPrimary"
app:popupTheme="@style/AppTheme.PopupOverlay" />
<TextView
Android:id="@+id/test_text"
Android:background="@drawable/bg_stroke_dynamic_color"
Android:padding="20dp"
Android:text="asdasdasdasd"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"/>
</Android.support.design.widget.AppBarLayout>
<Android.support.v7.widget.RecyclerView
Android:id="@+id/recycler_view"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:padding="10dp"
Android:clipToPadding="false"
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
Mon activité Java:
TextView testText = (TextView) findViewById(R.id.test_text);
((GradientDrawable)testText.getBackground()).setStroke(10,Color.BLACK);
Image de résultat: result
La manière la plus simple de remplir la forme avec le Radius est la suivante:
XML:
<TextView
Android:id="@+id/textView"
Android:background="@drawable/test"
Android:layout_height="45dp"
Android:layout_width="100dp"
Android:text="Moderate"/>
Java:
(textView.getBackground()).setColorFilter(Color.parseColor("#FFDE03"), PorterDuff.Mode.SRC_IN);
drawable_rectangle.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:shape="rectangle">
<solid Android:color="@Android:color/transparent" />
<stroke
Android:width="1dp"
Android:color="#9f9f9f" />
<corners
Android:bottomLeftRadius="5dp"
Android:bottomRightRadius="5dp"
Android:topLeftRadius="5dp"
Android:topRightRadius="5dp" />
</shape>
TextView
<androidx.appcompat.widget.AppCompatTextView
Android:id="@+id/textView"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:background="@drawable/drawable_rectangle"
Android:gravity="center"
Android:padding="10dp"
Android:text="Status"
Android:textColor="@Android:color/white"
Android:textSize="20sp" />
public static void changeRectangleColor(View view, int color) {
((GradientDrawable) view.getBackground()).setStroke(1, color);
}
changeRectangleColor(textView, ContextCompat.getColor(context, R.color.colorAccent));
J'essaie de répondre à Ronnie et mon application s'est bloquée. Ensuite, je vérifie mon XML dessinable. Cela ressemble à ceci:
<selector >...</selector>
. Je l'ai changé en ceci: (également changé d'attributs)
<shape> ... </shape>
Ça marche.
Pour ceux qui rencontrent le même problème.