Ich muss die Strichfarbe in der App ändern. Der Benutzer kann die Hintergrundfarbe ändern, sodass ich auch die Kontur (Umrisslinie) der Schaltfläche ändern muss. Da es bereits im Drawable (Beispiel unten) festgelegt ist, habe ich keinen Weg gefunden, dies zu ändern. Scheint so, als würden alle anderen Fragen wie die XML-Datei verwendet ... aber das macht es mir nicht dynamisch. Danke für jede Hilfe!
Ich muss die Strichfarbe in eine benutzerdefinierte Farbe ändern. Nichts mit dem Staat zu tun.
<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:Android="http://schemas.Android.com/apk/res/Android">
<solid Android:color="#ffffffff"/>
<stroke
Android:width="3dp"
Android:color="@color/Dim_Gray" /> <<<<--- This is what I need to change
<padding Android:left="10dp"
Android:top="10dp"
Android:right="10dp"
Android:bottom="10dp"
/>
<corners Android:bottomRightRadius="12dp" Android:bottomLeftRadius="12dp"
Android:topLeftRadius="12dp" Android:topRightRadius="12dp"/>
</shape>
1. Wenn Sie eine zeichnbare Datei für eine "Ansicht" wie diese haben
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:Android="http://schemas.Android.com/apk/res/Android" >
<corners Android:radius="5dp" />
<solid Android:color="@Android:color/white" />
<stroke
Android:width="3px"
Android:color="@color/blue" />
</shape>
Dann können Sie .__ ändern.
ein. Strichfarbe:
GradientDrawable drawable = (GradientDrawable)view.getBackground();
drawable.setStroke(3, Color.RED); // set stroke width and stroke color
b. Einfarbig :
GradientDrawable drawable = (GradientDrawable)view.getBackground();
drawable.setColor(Color.RED); // set solid color
2. Wenn Sie eine zeichnbare Datei für eine "Ansicht" wie diese haben
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item Android:state_checked="true" Android:id="@+id/buttonSelected">
<shape>
<solid Android:color="@color/blue" />
<stroke Android:width="1px" Android:color="@color/blue" />
</shape>
</item>
<item Android:state_checked="false" Android:id="@+id/buttonNotSelected">
<shape Android:shape="rectangle">
<solid Android:color="@color/white" />
<stroke Android:width="1px" Android:color="@color/blue" />
</shape>
</item>
</selector>
Dann können Sie die einzelnen item - Attribute ändern, indem Sie einzelne Zeichenobjekte durch deren Positionen nehmen.
StateListDrawable drawable = (StateListDrawable)view.getBackground();
DrawableContainerState dcs = (DrawableContainerState)drawable.getConstantState();
Drawable[] drawableItems = dcs.getChildren();
GradientDrawable gradientDrawableChecked = (GradientDrawable)drawableItems[0]; // item 1
GradientDrawable gradientDrawableUnChecked = (GradientDrawable)drawableItems[1]; // item 2
jetzt um Strich oder Vollfarbe ändern:
//solid color
gradientDrawableChecked.setColor(Color.BLUE);
gradientDrawableUnChecked.setColor(Color.RED);
//stroke
gradientDrawableChecked.setStroke(1, Color.RED);
gradientDrawableUnChecked.setStroke(1, Color.BLUE);
Ich brauchte einen Weg, um die Strichfarbe eines beliebigen _ GradientDrawable
zu ändern, ohne die Breite des Strichs zu kennen. Mein Ziel war es, dies mit Drawable.setTint
zu tun. Ich musste meinem solid
-xml ein transparentes shape
-Element hinzufügen, damit es funktioniert:
<!-- stroke_background.xml -->
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:shape="rectangle">
<stroke
Android:width="4dp"
Android:color="@Android:color/white" />
<!-- Need transparent solid to get tint applied to only the stroke -->
<solid Android:color="@Android:color/transparent"/>
</shape>
// StrokeView.kt
setBackgroundResource(R.drawable.stroke_background)
// Set the color of your stroke
drawable.setTint(Color.BLUE)
In Ihrem Fall müssen Sie, da Sie sowohl solid
als auch stroke
haben, einen layer-list
verwenden, wobei der Strich NACH dem Volumenkörper hinzugefügt wird (damit er oben gezeichnet wird). Auf diese Weise können Sie unterschiedliche Farben für den Körper und den Strich einstellen, ohne vorher die Strichbreite zu kennen:
<!-- stroke_solid_background.xml -->
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item Android:drawable="@drawable/solid_background" />
<item Android:drawable="@drawable/stroke_background" />
</layer-list>
// StrokeSolidView.kt
setBackgroundResource(R.drawable.stroke_solid_background)
(drawable as LayerDrawable).apply {
// Set the color of your solid
getDrawable(0).setTint(Color.GREEN)
// Set the color of your stroke
getDrawable(1).setTint(Color.BLUE)
}
Ich habe eine ähnliche Frage in Farbe der Formumrandung zur Laufzeit geändert
Es ist die gleiche Lösung, die von f20k vorgeschlagen wurde, aber in meinem Fall war das Drawable ein GradientDrawable anstelle eines ShapeDrawable.
sehen Sie, ob es funktioniert ...
Schauen Sie sich die LayerDrawable an, da sie aus Ihrem XML erstellt und zur Laufzeit verwendet wird.
Hier ist ein Demo-Beispiel:
<layer-list xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item>
<shape Android:shape="rectangle" >
<solid Android:color="@Android:color/transparent" />
</shape>
</item>
<item Android:id="@+id/itemId" Android:top="-4dp" Android:right="-4dp" Android:left="-4dp">
<shape>
<solid Android:color="@Android:color/transparent"/>
<stroke
Android:width="1.5dp"
Android:color="#06C1D7" >
</stroke>
<padding
Android:bottom="-2dp"/>
</shape>
</item>
</layer-list>
Sie können es zur Laufzeit wie folgt ändern:
LayerDrawable layerDrawable = (LayerDrawable) getResources()
.getDrawable(R.drawable.only_one_bottom_line);
GradientDrawable gradientDrawable = (GradientDrawable) layerDrawable.findDrawableByLayerId(R.id.itemId);
int px = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 1.5f, getResources().getDisplayMetrics());
gradientDrawable.setStroke(px, getResources().getColor(R.color.theme_color));
tv_select_city_name.setBackground(layerDrawable);
Vielleicht beziehen sie sich auf Farbzustandslisten , mit denen Sie die Farbe ändern können, je nachdem, ob die Taste gedrückt wurde/fokussiert/aktiviert/etc
Verwenden Sie StateLists (im Gegensatz zu ColorStateList). Schauen Sie doch mal rein: http://developer.Android.com/guide/topics/resources/drawable-resource.html#StateList
Sie können auch eine ShapeDrawable
(oder eine RoundRectShape
in Ihrem Beispiel) programmgesteuert erstellen und dann die setBackgroundDrawable
der Schaltfläche aufrufen.