Кэш для рисования 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()
. Пожалуйста, что я делаю неправильно?
Ответы
Ответ 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(). Обязательно удалите логический вызов после подтверждения, поскольку это станет проблемой производительности.