アプリからストロークの色を変更する必要があります。ユーザーは背景色を変更できるため、ボタンのストローク(アウトライン)も変更できるようにする必要があります。既にドロアブルに設定されているので(下のサンプル)、これを変更する方法を見つけていません。このような他のすべての質問と同様に、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>
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);
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);
ストロークの幅を知らなくても、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)
あなたの場合、solid
とstroke
の両方があるため、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)
}
実行時にシェイプの境界線の色を変更する で同様の質問に答えました
F20kによって提案されたのと同じソリューションに似ていますが、私の場合、ドロウアブルはShapeDrawableではなくGradientDrawableでした。
動作するか確認してください...
おそらく、それらは Color State Lists を参照しているので、ボタンが押されたか、フォーカスされたか、有効になっているかなどに基づいて色を変更できます。
(ColorStateListではなく)StateListsを使用してみてください。ご覧ください: http://developer.Android.com/guide/topics/resources/drawable-resource.html#StateList
プログラムでShapeDrawable
(またはこの例ではRoundRectShape
)をプログラムで作成し、ボタンのsetBackgroundDrawable
を呼び出すこともできます。