具有圆角和自适应颜色的Listview项目

时间:2013-04-04 19:45:35

标签: android android-listview

我需要按以下方式自定义listview的项目。每个项目应该有一个圆角,项目的背景应根据当前系统颜色(通过滤色镜(PorterDuff)或通过计算适当的rgb组件中的颜色偏移)自适应地更改 - 这些东西已经编码,这不是主题问题,那么让我们假设我有一种特定的颜色可以在运行时用作背景。)

我可以通过在item的布局文件中指定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列表视图项并覆盖其中dispatchDrawonDraw,但奇怪的是这对角落没有影响。例如,我找到了以下代码:

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的项目相比,显示此自定义绘制视图时没有任何更改。

那么,问题是如何在列表视图项中组合圆角和自适应背景颜色?

1 个答案:

答案 0 :(得分: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);

这适用于空闲视图的圆角和自定义颜色,并显示按下视图的默认选择背景,但后者显示没有圆角。我很感激有关如何在默认选择器上应用圆角的任何建议。