Подтвердить что ты не робот

Кэш для рисования Android

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

setDrawingCacheEnabled(true);

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

}

Пример кода объяснен.

  • В методе setSomeProperty() вызовите setDrawingCacheEnabled (false), чтобы очистить кеш и принудительно выполнить перерисовку, вызвав invalidate().
  • Вызов setDrawingCacheEnabled (true) в методе onDraw после рисования на холст.
  • При необходимости поместите оператор журнала в метод onDraw, чтобы подтвердить, что он вызывается только один раз, когда вы вызываете метод setSomeProperty(). Обязательно удалите логический вызов после подтверждения, поскольку это станет проблемой производительности.