web-dev-qa-db-de.com

Ich muss die Strichfarbe in eine benutzerdefinierte Farbe ändern. Nichts mit dem Staat zu tun

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>
42
Mark Worsnop

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);
143

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)
}
0
iamreptar

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 ...

0
rodalves

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);
0
Rahul

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

0
f20k

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.

0
Lior