3

API 16 (JellyBean) よりも低い API レベルで形状のグラデーションの色配列を設定することは可能ですか?

私は現在使用しています:

GradientDrawable gd = (GradientDrawable)this.getBackground();
int[] colors = {0xFFFF0000, 0xFFCC0099};
gd.setColors(colors);

これはうまく機能しますが、API レベル 8 (Froyo) または 10 (Gingerbread v2) をサポートしたいと考えています。

4

1 に答える 1

6

これを行う簡単な方法はないと思うので、ここで私が提案したいGradientDrawableのは、古いもののパラメーターに基づいて新しいものを作成することです (16 未満の API の場合)。ここで欠陥を指摘してくれた@StephenNiedzielskiに感謝します — <code>getOrientation() は API 16 未満では使用できません。

ドローアブルを新しく作成するには、ドローアブルの向きが必要なため、リフレクションなしでこれを行う方法はありません。オリエンテーションが既にある場合は、次の操作を実行できます。

GradientDrawable gd = (GradientDrawable) getBackground();
int[] colors = {0xFFFF0000, 0xFFCC0099};
if (android.os.Build.VERSION.SDK_INT >= 16) {
    gd = gd.mutate(); // For safe resource handling
    gd.setColors(colors);
} else {
    // Fallback for APIs under 16.
    GradientDrawable ngd = new GradientDrawable(/* Orientation variable */, colors);
    // You may have to set other qualities of `ngd` here to make it match.
    setBackgroundDrawable(ngd);
}

したがって、その情報がなければ、16 未満の API で Reflection を使用する必要があります。これはハックですが、これらの API の実装は決して変更されないため (更新されていないため) 、かなり安全です。

好みに合う場合は、リフレクションを使用してGradientState内部クラスにアクセスできます。gd.mGradientState.mOrientation基本的に、メソッドが実行する呼び出し (コメントで述べたように)をエミュレートする必要がありますgetOrientation()。どちらも非公開であるため、Reflection を使用する必要があります。

于 2013-01-09T21:25:08.370 に答える