【问题标题】:How to force android view to redraw it's background-drawable? / probably an animation is blocking it to work properly如何强制 android 视图重绘它的背景可绘制? / 可能是动画阻止它正常工作
【发布时间】:2011-01-20 14:32:09
【问题描述】:

有没有办法强制 android 视图重绘它的背景? 我设置了一个带有渐变的可绘制形状作为背景,效果很好,但是在更改视图的高度后,您可以看到那些难看的渐变步骤。

我能做什么? 我试过view.invalidate()view.refreshDrawableState() 没有任何明显的区别。

谢谢!

//编辑: 以下是更多细节和我的代码: 在您回答之后,我认为条带可能是我的代码错误造成的。这是我正在做的事情:

  1. 缩放视图
  2. 设置其新的宽度和高度,因为缩放视图不接受其他区域的用户输入,然后是“旧”区域(请参阅android weird (at least for me) behaviour of control after scaling / doesn't accept input in it's whole area
  3. 尝试再次设置背景(其中包含渐变和圆角矩形)

这是我的代码:

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


【解决方案1】:

你可以在调整大小后尝试: v.setBackgroundResource(null); v.setBackgroundResource(...my drawable...);

【讨论】:

  • 我尝试再次设置背景,但这并没有改变条带问题。但是,我在 ScaleAnimation 结束时执行此操作,并且(再次设置背景后)有短暂的闪烁。我假设它设置背景不是在缩放后的状态(它应该),而是在之前的状态,结果导致条带化。也许你可以看看我的代码(我已经编辑了问题帖子)。
  • 当您在动画中放大视图时,质量会下降,因此尽可能确保初始质量非常重要。您是否尝试通过在 super.onCreate() 之后应用此代码来提高屏幕颜色深度: getWindow().setFormat(PixelFormat.RGBA_8888); ?
  • 非常感谢你!这就是渐变的诀窍。现在真的很顺利。剩下的就是闪烁问题,但这不是基本问题,所以我将其标记为已解决。
  • 很好!我也有动画问题。您是否在动画 XML 中使用 android:fillAfter="true" ?当我尝试一次应用更多不同的过渡时,我遇到了一些奇怪的效果,我不得不进行试验,直到我得到一个我喜欢的平滑过渡。
  • 我猜你想在点击时放大一个对象(视图),它会放大到新的大小。也许你必须在这里采取一种更稳定的不同方法。放大视图后,应将其替换为设置为适当大小的另一个视图。三是视图切换器 xml 方法,或者只使用 smallWew.setVisibility(View.GONE) 然后 smallViewParent.addView(myBiggerView) 方法......类似的东西;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-21
  • 2013-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多