Android绘图缓存

Sev*_*yev 15 android view

请解释一下绘图缓存在Android中是如何工作的.我正在实现一个自定义View子类.我希望系统缓存我的绘图.在View构造函数中,我调用

setDrawingCacheEnabled(true);
Run Code Online (Sandbox Code Playgroud)

然后在绘图(Canvas c)中,我做:

    Bitmap cac = getDrawingCache();
    if(cac != null)
    {
        c.drawBitmap(cac, 0, 0, new Paint());
        return;
    }
Run Code Online (Sandbox Code Playgroud)

然而,getDrawingCache()回报对我来说无效.我draw()既不是来自setDrawingCacheEnabled(),也不是来自getDrawingCache().拜托,我做错了什么?

Sev*_*yev 9

绘制缓存大小有一个硬性限制,可通过ViewConfiguration类获得.我的视图大于允许缓存.

仅供参考,View类的来源可通过SDK Manager获取,用于某些(并非所有)Android版本.


小智 6

希望这能解释它.

public class YourCustomView extends View {

    private String mSomeProperty;

    public YourCustomView(Context context) {
        super(context);
    }

    public YourCustomView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public YourCustomView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    public void setSomeProperty(String value) {
        mSomeProperty = value;
        setDrawingCacheEnabled(false); // clear the cache here
        invalidate();
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        // specific draw logic here

        setDrawingCacheEnabled(true); // cache
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        ...
    }

}
Run Code Online (Sandbox Code Playgroud)

示例代码说明.

  1. 在setSomeProperty()方法中调用setDrawingCacheEnabled(false)来清除缓存并通过调用invalidate()强制重绘.
  2. 绘制到画布后,在onDraw方法中调用setDrawingCacheEnabled(true).
  3. (可选)在onDraw方法中放置一个日志语句,以确认每次调用setSomeProperty()方法时只调用一次.确认后确保删除日志调用,因为这将成为性能问题.

  • 这实际上是否有效,因为文档似乎以不同的方式解释它:启用或禁用绘图缓存.启用绘图缓存时,**下一次调用getDrawingCache()或buildDrawingCache()将在位图中绘制视图**无论是否添加这些行,我的onDraw()每次调用invalidate时都会调用一次( )测试:不使用缓存. (3认同)
  • 这是错的.您只需要启用绘图缓存,它将在每次绘制调用时填充.这实际上不起作用,因为在第一次调用onDraw时不会启用绘图缓存. (2认同)