Android кеш рисования - PullRequest
15 голосов
/ 15 июня 2010

Пожалуйста, объясните, как работает кеш рисования в Android. Я реализую пользовательский подкласс View. Я хочу, чтобы мой рисунок кэшировался системой. В конструкторе View я вызываю

setDrawingCacheEnabled(true);

Затем в розыгрыше (Canvas c) я делаю:

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

Все же getDrawingCache() возвращает мне ноль. Мой draw() не вызывается ни из setDrawingCacheEnabled(), ни из getDrawingCache(). Пожалуйста, что я делаю не так?

Ответы [ 2 ]

8 голосов
/ 17 июня 2010

Существует жесткое ограничение на размер кэша чертежа, доступный через класс ViewConfiguration. Мое представление больше допустимого для кэширования.

К вашему сведению, источники класса View доступны через SDK Manager для некоторых(не все) версии Android.

6 голосов
/ 10 июня 2011

Надеюсь, это объясняет это.

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. Вызовите setDrawingCacheEnabled (true) в методе onDraw после рисования на холсте.
  3. При желании поместите инструкцию log в метод onDraw, чтобы подтвердить, что он вызывается только один раз при каждом вызове метода setSomeProperty (). Обязательно удалите вызов журнала после подтверждения, так как это станет проблемой производительности.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...