Android GradientDrawable - Corner Radii问题

时间:2010-12-03 16:58:55

标签: android expandablelistadapter cornerradius

我正在尝试使用ExpandableListAdapter.getChildView调试我遇到的问题。

我已经定义了一个Drawable,其中包含一个渐变的形状和一个半径为1的角,用于列表项的背景 - 没有什么特别的。

然后,在我的适配器代码中,我在getChildView中有这个片段:

GradientDrawable background = (GradientDrawable) convertView.getBackground();
float topRadius = 0;
float bottomRadius = 0;

// Make the corner radius obvious for debugging             
if (childPosition == 0)
    topRadius = 14;
if (childPosition == (mValues.size() - 1))
    bottomRadius = 14;

background.setCornerRadii(new float [] { topRadius, topRadius, 
                                         topRadius, topRadius,  
                                         bottomRadius, bottomRadius, 
                                         bottomRadius, bottomRadius});
convertView.setBackgroundDrawable(background);

此处的尝试是围绕第一个列表项的顶部和最后一个列表项的底部。通过调试,似乎我正在为我想要的项目设置我想要的值。

然而,我遇到的问题是为所有列表项设置了角半径,就像它是底部项一样。

稍微说,有没有办法获得GradientDrawable的角半径,至少是为了调试目的?

谢谢,
WTS

2 个答案:

答案 0 :(得分:16)

而不是调用setCornerRadii(),调用mutate()。setCornerRadii(),这应该可以解决你的问题(http://www.curious-creature.org/2009/05/02/drawable-mutations/提供完整的解释)

编辑(由Wonko提供)
这几乎是正确的(提供的链接基本上解释了原因)。唯一的变化是mutate()返回一个Drawable,它没有setCornerRadii()方法。相反,您需要将变异对象强制转换为GradientDrawable,它就像魅力一样。

((GradientDrawable) background.mutate()).setCornerRadii(
    new float [] { topRadius, topRadius, topRadius, topRadius,  
                   bottomRadius, bottomRadius, bottomRadius, bottomRadius});

答案 1 :(得分:1)

编辑:刚刚意识到这不是解决OP问题的方法。

除了Mathias的评论之外,对此的修复是首先将半径设置为1,然后设置单个角半径:

background.setCornerRadius(1.0f);
background.setCornerRadii(new float [] { topRadius, topRadius,  
                                         topRadius, topRadius,   
                                         bottomRadius, bottomRadius,  
                                         bottomRadius, bottomRadius}); 

如果这可以解决问题,请告诉我。至于获得角半径,我不知道有任何方法这样做......