web-dev-qa-db-ja.com

実行時に形状の境界線の色を変更する

ドローアブルフォルダに次のような形があります。

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:shape="rectangle">
    <corners Android:radius="5dp" />
    <solid Android:color="#ffffff" />
    <stroke Android:width="2dp" Android:color="#B5B5B5"/>
</shape>

これにより、角が丸い長方形が定義され、次のような任意のパネルに背景として適用できます:Android:background = "@ drawable/round_corner_shape"

ここで質問があります。アプリケーションには背景と同じ形状のパネルがほとんどありませんが、形状ごとに異なる境界線(ストローク)の色が必要です。 3つのシェイプを作成したくありません。唯一の違いは、ストロークの色です。 実行時にストローク値を変更することは可能ですか?

26
Zelter Ady

私も同じ問題を抱えていました。私の場合、GridViewがあり、グリッド内のアイテムは、実行時にユーザーが境界線の色を変更できました。

そのため、そのグリッドのgridviewAdapterで、getViewメソッド(アダプターのビューを生成するメソッド)で次のことを行いました。

public View getView(int position, View convertView, ViewGroup parent) {
    LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    convertView = inflater.inflate(R.layout.griditem, null);
    GradientDrawable gradientDrawable = (GradientDrawable) convertView.getBackground(); 

    gradientDrawable.setStroke(2, mColor); 
    convertView.invalidate();
    return convertView;
}

mColorは、xmlファイルで行うのと同じように、色を表すintです。 Javaコードでは、「#」の代わりに「0x」を使用してAARRGGBB形式で定義します。たとえば、100%不透明なBLACKには0xFF000000を使用し、100%不透明なBLUEには0xFF0000FFを使用します。これは、google api'helpfully 'がintの色が「ストロークの色」であることを示しているためです。

これで私の問題は解決しました...あなたの場合にも同様のことを試すことができると思います。

18
rodalves

こんにちは、実行時にバックグラウンドを作成してみてください。その後、いつでも変更できます。

RoundRectShape rect = new RoundRectShape(
  new float[] {30,30, 30,30, 30,30, 30,30},
  null,
  null);
ShapeDrawable bg = new ShapeDrawable(rect);
bg.getPaint().setColor(0x99FFFFFF);
view.setBackgroundDrawable(bg);
1
Talha