0

次の方法でリストビューの項目をカスタマイズする必要があります。各アイテムの角は丸く、アイテムの背景は現在のシステム カラーに応じて適応的に変更する必要があります (カラー フィルター (PorterDuff) を使用するか、適切な RGB コンポーネントでカラー シフトを計算することによって)。質問なので、実行時に背景として使用する特定の色があるとします)。

android:background次のコードで形状を参照するアイテムのレイアウト ファイルを指定することで、簡単に角丸を適用できます。

<corners android:radius="5dp" />

問題は、(私の知る限り) 形状の色を動的に (Java から) 調整できないことです。そのため、XML で定義された形状のアプローチを使用することはできず、Java コーディングを使用するソリューションに移行しました。

私は私のgetView方法でそのようなものを持っています(背景が描画可能ではなく色である場合):

PaintDrawable mDrawable = new PaintDrawable();
mDrawable.getPaint().setColor(Color.argb(calcColor, r, g, b));
int px = DP2PX(10);
mDrawable.setCornerRadius(px);
view.setBackgroundDrawable(mDrawable);

それは機能しますが、アイテムが選択されたり押されたりすると、カスタムの背景がデフォルトの選択の背景を上書きします。これはバグです。選択したアイテムは、標準の選択背景で表示する必要がありますが、角は丸くします。

LinearLayoutリストビュー項目のサブクラスを使用してオーバーライドdispatchDrawまたはその中で使用しようとしましたonDrawが、これは不思議なことにコーナーには影響しません。たとえば、次のコードを見つけました。

float radius = 10.0f;
Path clipPath = new Path();
RectF rect = new RectF(0, 0, this.getWidth(), this.getHeight());
clipPath.addRoundRect(rect, radius, radius, Path.Direction.CW);
canvas.clipPath(clipPath);
super.dispatchDraw(canvas);

このようなカスタム描画ビューは、標準に基づくアイテムと比較して変更なしで表示されますLinearLayout

では、問題は、リストビュー項目で丸みを帯びた角と適応する背景色をどのように組み合わせるかです。

4

1 に答える 1

0

問題の部分的な解決策があります。のコードgetViewは次のようになりました。

PaintDrawable mDrawable = new PaintDrawable();
mDrawable.getPaint().setColor(Color.argb(calcColor, r, g, b));
int px = DP2PX(10);
mDrawable.setCornerRadius(px);

Drawable defaultBg = getResources().getDrawable(android.R.drawable.list_selector_background);

StateListDrawable states = new StateListDrawable();
states.addState(new int[] {android.R.attr.state_pressed}, defaultBg);
states.addState(new int[] {android.R.attr.state_focused}, defaultBg);
states.addState(new int[] { },  mDrawable);

view.setBackgroundDrawable(states);

これにより、アイドル ビューに角丸とカスタム カラーが適用され、押されたビューのデフォルトの選択背景が表示されますが、後者は角丸なしで表示されます。デフォルトのセレクターに丸みを帯びた角を適用する方法についての提案をいただければ幸いです。

于 2013-04-05T10:30:49.400 に答える