代码之家  ›  专栏  ›  技术社区  ›  Seva Alekseyev

Android绘图缓存

  •  15
  • Seva Alekseyev  · 技术社区  · 14 年前

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

    setDrawingCacheEnabled(true);
    

    然后在绘图(画布C)中,我执行以下操作:

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

    然而 getDrawingCache() 向我返回空值。我的 draw() 既不是从调用也不是从调用 setDrawingCacheEnabled() 也不 获取绘图缓存() . 拜托,我做错什么了?

    2 回复  |  直到 10 年前
        1
  •  8
  •   Seva Alekseyev    12 年前

    图形缓存大小有一个硬限制,可以通过viewconfiguration类获得。我的视图大于缓存允许的大小。

    仅供参考,对于某些(不是全部)Android版本,视图类的源代码可以通过SDK管理器获得。

        2
  •  6
  •   Gavin Saunders    13 年前

    希望这能解释。

    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) {
            ...
        }
    
    }
    

    解释了示例代码。

    1. 在setsomeproperty()方法中,调用setdrawingcacheenabled(false)清除缓存并通过调用invalidate()强制重绘。
    2. 在绘制到画布后,在OnDraw方法中调用SetDrawingCacheEnabled(true)。
    3. 或者,在OnDraw方法中放置一条日志语句,以确认每次调用setSomeProperty()方法时只调用一次。请确保在确认后删除日志调用,因为这将成为性能问题。