次の方法でリストビューの項目をカスタマイズする必要があります。各アイテムの角は丸く、アイテムの背景は現在のシステム カラーに応じて適応的に変更する必要があります (カラー フィルター (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
。
では、問題は、リストビュー項目で丸みを帯びた角と適応する背景色をどのように組み合わせるかです。