web-dev-qa-db-ja.com

ストロークの色をユーザー定義の色に変更する必要があります。国家とは何の関係もない

アプリからストロークの色を変更する必要があります。ユーザーは背景色を変更できるため、ボタンのストローク(アウトライン)も変更できるようにする必要があります。既にドロアブルに設定されているので(下のサンプル)、これを変更する方法を見つけていません。このような他のすべての質問と同様に、XMLファイルを使用するように言われたように思えますが、それで動的にできません。助けてくれてありがとう!

ストロークの色をユーザー定義の色に変更する必要があります。状態とは関係ありません。

<?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>
53
Mark Worsnop

1。このような「ビュー」の描画可能ファイルがある場合

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

その後、変更できます
a。ストロークの色:

GradientDrawable drawable = (GradientDrawable)view.getBackground();
drawable.setStroke(3, Color.RED); // set stroke width and stroke color 


b。無地:

GradientDrawable drawable = (GradientDrawable)view.getBackground();
drawable.setColor(Color.RED); // set solid color

2。このような「ビュー」の描画可能ファイルがある場合

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

次に、個別の描画可能オブジェクトを使用して、個々のitem属性を変更できます。

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

ここでストロークまたは単色の変更:

//solid color
gradientDrawableChecked.setColor(Color.BLUE);
gradientDrawableUnChecked.setColor(Color.RED);

//stroke
gradientDrawableChecked.setStroke(1, Color.RED);
gradientDrawableUnChecked.setStroke(1, Color.BLUE);
170

LayerDrawable をご覧ください。XMLから作成され、実行時に使用されるためです。

デモの例を次に示します。

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

次のように実行時に変更できます。

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

ストロークの幅を知らなくても、GradientDrawableのストロークの色を変更する方法が必要でした。私の目標は、Drawable.setTintを使用してこれを行うことでした。透明にするsolid要素をshape xmlに追加して、機能させる必要がありました。

<!-- 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)

あなたの場合、solidstrokeの両方があるため、layer-listを使用する必要があります。上)。これにより、ストロークの幅を事前に知らなくても、ソリッドとストロークに異なる色を設定できます。

<!-- 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)
}
1
iamreptar

実行時にシェイプの境界線の色を変更する で同様の質問に答えました

F20kによって提案されたのと同じソリューションに似ていますが、私の場合、ドロウアブルはShapeDrawableではなくGradientDrawableでした。

動作するか確認してください...

0
rodalves

おそらく、それらは Color State Lists を参照しているので、ボタンが押されたか、フォーカスされたか、有効になっているかなどに基づいて色を変更できます。

0
f20k

(ColorStateListではなく)StateListsを使用してみてください。ご覧ください: http://developer.Android.com/guide/topics/resources/drawable-resource.html#StateList

プログラムでShapeDrawable(またはこの例ではRoundRectShape)をプログラムで作成し、ボタンのsetBackgroundDrawableを呼び出すこともできます。

0
Lior