Android的setDrawingCacheEnabled()如何工作?

Eri*_*rke 23 android

我有一个UI,根布局是RelativeLayout.它有许多视图,如字段,按钮等.

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

我想使用setDrawingCacheEnabled(true)以便(我希望)加速这两个面板的动画.作为一个简化的例子,这里大致是我在其中一个面板中滑动的方式.我称之为"detailPanel".

public class MyActivity extends Activity {
  // Initially invisible.
  private View detailPanel;

  // A simple slide animation.
  private Animation detailEnterAnimation;

  ...

  public void someButtonClicked(View view) {
    detailPanel.startAnimation(detailEnterAnimation);
    detailPanel.setVisibility(View.VISIBLE);
    detailPanel.setDrawingCacheEnabled(true);
  }
}
Run Code Online (Sandbox Code Playgroud)

现在在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);
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

位图非空,大小合适,但它完全是黑色的.

为什么我的位图是黑色的?该代码可能是错误的; 我已经尝试了一百万种不同的东西而且无法弄明白.

The*_*Vee 7

从Android文档(http://developer.android.com/reference/android/view/View.html#setDrawingCacheEnabled%28boolean%29):

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

也许这是你的情况?


Kei*_*chi 3

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

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