【发布时间】:2011-01-20 14:32:09
【问题描述】:
有没有办法强制 android 视图重绘它的背景? 我设置了一个带有渐变的可绘制形状作为背景,效果很好,但是在更改视图的高度后,您可以看到那些难看的渐变步骤。
我能做什么?
我试过view.invalidate() 和view.refreshDrawableState() 没有任何明显的区别。
谢谢!
//编辑: 以下是更多细节和我的代码: 在您回答之后,我认为条带可能是我的代码错误造成的。这是我正在做的事情:
- 缩放视图
- 设置其新的宽度和高度,因为缩放视图不接受其他区域的用户输入,然后是“旧”区域(请参阅android weird (at least for me) behaviour of control after scaling / doesn't accept input in it's whole area)
- 尝试再次设置背景(其中包含渐变和圆角矩形)
这是我的代码:
public void onAnimationEnd(Animation animation)
{
MyView view = (MyView) ((ExtendedScaleAnimation) animation).getView();
view.getLayoutParams().width = toWidth;
view.getLayoutParams().height = toHeight;
view.clearAnimation();
view.requestLayout();
view.refreshBackground(); // background will be changed
}
在设备上,您可以看到背景可绘制对象发生了变化,但在我看来,在动画结束之前应用了背景变化的闪烁。以编程方式应该结束了!还是我错了?
再次感谢您!
【问题讨论】:
-
抖动应该解决渐变带问题,但我不知道如何在 xml 中的可绘制形状上启用它。以编程方式,每个 Drawable 都有 setDither(boolean)。
-
我们可能需要查看更多代码。我认为 view.invalidate() 会起作用。如果您碰巧不在 ui 线程上,可以尝试 postInvalidate。
-
@bigstones:这只是 XML 中的
android:dither。我认为问题不在于视图没有重绘,而是超过一定的尺寸,显示器的色阶用完,导致可见的条纹。这可能可以通过转换为位图并更改颜色深度来解决(我个人为这个问题所做的只是使用相对较高的 9-patch 渐变;似乎可以提供更好的结果)但可能有更好的方法。不过,我没有找到。 -
感谢您的快速回复。我在 UI 线程上。我将抖动设置为真,但遗憾的是这并没有改变结果。我的渐变是从“#919191”到“#e4e4e4”,最大超过 460 像素。如果我试图仅绘制该渐变(出于测试目的),它似乎很好。所以可能不是大小导致问题。
标签: android view background drawable redraw