Как работает Android setDrawingCacheEnabled()?
У меня есть интерфейс, где корневая компоновка - RelativeLayout. Он имеет несколько видов, таких как поля, кнопки и т.д.
Есть также две другие панели, которые изначально невидимы. Когда пользователь нажимает кнопку, одна из этих панелей скользит слева, а другая - снизу. Проблема в том, что частота кадров является жалкой на Nexus S.
Я хочу использовать setDrawingCacheEnabled (true), чтобы (надеюсь) ускорить анимацию этих двух панелей. В качестве упрощенного примера здесь примерно показано, как я скольжу в одной из этих панелей. Я назову его "detailPanel".
public class MyActivity extends Activity {
// Initially invisible.
private View detailPanel;
// A simple slide animation.
private Animation detailEnterAnimation;
...
public void someButtonClicked(View view) {
detailPanel.startAnimation(detailEnterAnimation);
detailPanel.setVisibility(View.VISIBLE);
detailPanel.setDrawingCacheEnabled(true);
}
}
Теперь в DetailPanel я пытаюсь использовать кеш. Я надеялся, что рендеринг растровых изображений через кеш повысит производительность:
public class DetailPanel extends LinearLayout {
public void draw(Canvas canvas) {
Bitmap cache = getDrawingCache();
if (cache != null) {
canvas.drawBitmap(cache, 0, 0, null);
} else {
super.draw(canvas);
}
}
}
Растровое изображение не имеет нулевого значения и имеет нужный размер, но полностью черный.
Почему мой растровый рисунок черный? Этот код может быть неприлично ошибочным; Я пробовал миллионы разных вещей и просто не могу понять.
Ответы
Ответ 1
Из документации Android (http://developer.android.com/reference/android/view/View.html#setDrawingCacheEnabled%28boolean%29):
Включение кэша чертежа аналогично настройке уровня, когда аппаратное ускорение отключено. Когда аппаратное ускорение включено, включение кэша чертежа не влияет на рендеринг, поскольку в системе используется другой механизм ускорения, который игнорирует флаг. Если вы хотите использовать растровое изображение для представления, даже если аппаратное ускорение включено, см. SetLayerType (int, android.graphics.Paint) для получения информации о том, как включить программные и аппаратные уровни.
Возможно, это ваш случай?
Ответ 2
Вы можете создать свой кэш чертежа перед его использованием, иначе он даст вам пустую растровую карту
public void someButtonClicked(View view) {
detailPanel.startAnimation(detailEnterAnimation);
detailPanel.setVisibility(View.VISIBLE);
detailPanel.setDrawingCacheEnabled(true);
detailPanel.buildDrawingCache(); //may be you need to add this?
}