Drawable:如果主机视图更改其大小,则触发OnBoundsChange

时间:2014-04-05 03:09:25

标签: android android-drawable android-bitmap

我正在使用 svg-android 库来处理我的应用中的SVG。简而言之,这个lib从SVG生成(矢量)PictureDrawable

不幸的是,Android无法drawPicture()使用硬件加速进入画布,因此要实现加速,我必须将PictureDrawable中的Picture转换为位图

问题是,如果在创建位图后可绘制的主机大小发生变化,我必须重新采样到新的分辨率。

我有覆盖:

@Override
protected void onBoundsChange(Rect bounds) {
    super.onBoundsChange(bounds);
    if (Conf.LOG_ON) Log.d(TAG, "OnBoundsChange "+bounds);
    createBitmapWithNewBounds();
}

当我手动调用setBounds时,它会起作用,但当可绘制的主机大小发生变化时,onBoundsChange()不会自动调用(,我不知道它是否应该)。

那么有没有办法让drawable检测到它的主机大小发生了变化:

  • 我可以触发setBounds()的手动通话?
  • onBoundsChange()会自动调用吗?

1 个答案:

答案 0 :(得分:0)

您是否尝试覆盖protected boolean onStateChanged(int[] state)

我已经冒昧地将源代码和随附的文档包括在内: /** * Override this in your subclass to change appearance if you recognize the * specified state. * * @return Returns true if the state change has caused the appearance of * the Drawable to change (that is, it needs to be drawn), else false * if it looks the same and there is no need to redraw it since its * last state. */ protected boolean onStateChange(int[] state) { return false; }

根据Drawable的来源,默认实现是指示状态没有改变,正如您可以通过返回值看到的那样。由于drawable不会扩展视图,因此它必须类似于要求layout()。 因此,我认为如果您只是覆盖onStateChanged()以返回true,您应该看到呼叫涓涓细流到onBoundsChanged()。显然,天真的return true不是正确的解决方案,因为它取决于传入的int[] state,但这应该会让您走上正确的轨道。
希望这可以帮助。