29

ドローアブルフォルダーにこの形状があります:

<?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 つの形状を作成したくありません。唯一の違いはストロークの色です。実行時にストローク値を変更することはできますか?

4

2 に答える 2

20

私も同じ問題を抱えていました。私の場合、実行時にユーザーがグリッド内のアイテムの境界線の色を変更できる 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 が int の色が「ストロークの色」であると「親切に」伝えているため、ここでこれを説明します。

これで私の問題は解決しました...あなたのケースに似たようなことを試すことができると思います。

于 2013-02-23T18:34:33.367 に答える
1

こんにちは、実行時に背景を作成してみてください。その後、いつでも変更できます。

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);
于 2012-11-27T13:50:35.780 に答える