【问题标题】:Android GradientDrawable - Corner Radii issueAndroid GradientDrawable - 角半径问题
【发布时间】:2010-12-03 16:58:55
【问题描述】:

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

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

然后,在我的适配器代码中,我在 getChildView 中有这个 sn-p:

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

【问题讨论】:

  • 不确定这是否与您相关,只是想指出半径存在一个已知错误,对于您不想圆角的角,应始终使用 0.1f 而不是 0。见code.google.com/p/android/issues/detail?id=939 - 但我认为你的方式是相反的,所以它可能与列表适配器逻辑有关。
  • grepcode.com/file/repository.grepcode.com/java/ext/…,我认为不可能获得角半径。您是否尝试过在 xml 中定义可绘制对象 - 只是为了看看它是否有所作为?
  • @Mathias:基本的drawable在xml中,但我需要修改第一项和最后一项(仅)。
  • @WtS:我的意思是使用三个可绘制对象(顶部、中间、底部)并将逻辑放在适配器的 getView/bindView 中。但我看到你已经得到了一个解决方案,来自 Romain 的有趣链接,需要自己通读一遍......干杯。

标签: android expandablelistadapter cornerradius


【解决方案1】:

不要调用 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});

【讨论】:

  • 很好的答案,很好的链接。我确实对您的答案进行了一项更改(我仍然将其标记为答案),因此将来遇到此问题的任何人都可以将信息集中在一个位置。
  • 大声笑 - 刚刚意识到链接是你自己的。如果可以的话,我会投票两次。 :)
【解决方案2】:

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

除了 Mathias 的注释之外,解决此问题的方法是首先将半径设置为 1,然后设置各个角的半径:

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

如果这能解决问题,请告诉我。至于获得拐角半径,我不知道有什么办法……

【讨论】:

  • 不 - 查看@Romain Guy 的解决方案和原因(标记为答案)
  • 是的,在阅读了 Romain/您的回答后,我意识到我的并不是这个特定问题的解决方案。好东西,以后要知道! :)
猜你喜欢
  • 2011-08-05
  • 2017-02-13
  • 1970-01-01
  • 2014-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多