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

Как работает 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);
    }
  }
}

Растровое изображение не имеет нулевого значения и имеет нужный размер, но полностью черный.

Почему мой растровый рисунок черный? Этот код может быть неприлично ошибочным; Я пробовал миллионы разных вещей и просто не могу понять.

4b9b3361

Ответ 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?
  }