Android';s setDrawingCacheEnabled()是否正常工作?

Android';s setDrawingCacheEnabled()是否正常工作?,android,Android,我有一个UI,其中根布局是相对的。它有许多视图,如字段、按钮等 还有另外两个面板最初是不可见的。当用户单击按钮时,其中一个面板从左侧滑入,另一个面板从底部滑入。问题是Nexus S的帧速率太低了 我想使用setDrawingCacheEnabled(true),以便(我希望)加速这两个面板的动画。作为一个简化的例子,这里大致是我如何滑入其中一个面板的。我称之为“细节面板” 现在在DetailPanel中,我尝试使用缓存。我希望通过缓存进行位图渲染可以提高性能: public class Deta

我有一个UI,其中根布局是相对的。它有许多视图,如字段、按钮等

还有另外两个面板最初是不可见的。当用户单击按钮时,其中一个面板从左侧滑入,另一个面板从底部滑入。问题是Nexus S的帧速率太低了

我想使用setDrawingCacheEnabled(true),以便(我希望)加速这两个面板的动画。作为一个简化的例子,这里大致是我如何滑入其中一个面板的。我称之为“细节面板”

现在在DetailPanel中,我尝试使用缓存。我希望通过缓存进行位图渲染可以提高性能:

public class DetailPanel extends LinearLayout {
  public void draw(Canvas canvas) {
    Bitmap cache = getDrawingCache();
    if (cache != null) {
      canvas.drawBitmap(cache, 0, 0, null);
    } else {
      super.draw(canvas);
    }
  }
}
位图是非空的,大小正确,但它是完全黑色的


为什么我的位图是黑色的?该代码可能是严重错误的;我已经尝试了一百万种不同的方法,但都无法解决问题。

在使用绘图缓存之前,您可能需要先构建绘图缓存,否则它会给您一个空白位图

  public void someButtonClicked(View view) {
    detailPanel.startAnimation(detailEnterAnimation);
    detailPanel.setVisibility(View.VISIBLE);
    detailPanel.setDrawingCacheEnabled(true);
    detailPanel.buildDrawingCache();  //may be you need to add this?
  }

来自Android文档():

启用图形缓存类似于在关闭硬件加速时设置图层。启用“硬件加速”时,启用图形缓存对渲染没有影响,因为系统使用不同的加速机制,而忽略该标志。如果要在视图中使用位图,即使启用了硬件加速,请参阅setLayerType(int,android.graphics.Paint)以了解如何启用软件和硬件层


也许这就是你的情况?

你试过扩展滑动抽屉吗?它已经有了滑动动画。也许这是正确的方向:具体的动画不是我真正想要的。更重要的是,我希望对图形缓存的工作原理有一个大致的了解,这样我就可以将它应用到各种UI中。我知道它非常古老,但你解决了这个问题吗?我(不幸地)需要支持相对较旧的设备,我希望这可以提高性能,但我的视图返回非null且为空。
  public void someButtonClicked(View view) {
    detailPanel.startAnimation(detailEnterAnimation);
    detailPanel.setVisibility(View.VISIBLE);
    detailPanel.setDrawingCacheEnabled(true);
    detailPanel.buildDrawingCache();  //may be you need to add this?
  }