我正在使用 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()
会自动调用吗?答案 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
,但这应该会让您走上正确的轨道。
希望这可以帮助。