ビューの背景として、放射状のグラデーションでシェイプ ドローアブルを使用したいと考えています。javadoc によると、グラデーションの半径は特定の値 (おそらくピクセル) またはパーセントとして設定できます。
アンドロイド:gradientRadius
放射状グラデーションでのみ使用されるグラデーションの半径。
「1.2」などの浮動小数点値の場合があります。
"14.5%" のように、% または %p のいずれかが追加された浮動小数点数である小数値の場合があります。% サフィックスは、常に基本サイズのパーセンテージを意味します。オプションの %p サフィックスは、一部の親コンテナーに相対的なサイズを提供します。
間違っている場合は訂正してください。ただし、ここでピクセル値を使用しても、このグラデーションは画面密度によってまったく異なるように見えるため、まったく役に立ちません (テスト済みで、これは本当です)。% と %p の値を使用しようとしましたが、まったく機能しませんでした。
Android ソース コードを詳しく調べて、gradientRadius がどのように処理されているかを確認したところ、GradientDrawable クラスで次のことがわかりました。
TypedValue tv = a.peekValue(
com.android.internal.R.styleable.GradientDrawableGradient_gradientRadius);
if (tv != null) {
boolean radiusRel = tv.type == TypedValue.TYPE_FRACTION;
st.mGradientRadius = radiusRel ?
tv.getFraction(1.0f, 1.0f) : tv.getFloat();
} else ...
}
あはは!したがって、 % または %p を追加すると、値が 100 で除算されます ( TypeValue.getFraction() のドキュメントがさらに不明確であるため、これをテストしました)。65% が 0.65 になりました。理にかなっていますが、有用な目的には役立ちません。
では、gradientRadius を使用する最良の方法は何ですか?
PS。GradientDrawable を使用してプログラムで背景を追加しましたが、目的の結果が得られています。ビューの幅に相対的な値で GradientDrawable.setGradientRadius() を使用し、デバイス間で一貫したグラデーションを取得しました。