Предотвратить GradientDrawable для перерисовки во время анимации - PullRequest
0 голосов
/ 10 октября 2011

Я установил GradientDrawable в качестве фона.При выполнении какой-либо 3d-транзакции (особенно по оси Y) GradientDrawable перерисовывает сам, а скорость воспроизведения не хороша.

  • Я не могу кэшировать представление, что чертеж установлен в качестве фона, потому что я хочу другие видывдобавок ко всему, для анимации.
  • Я не могу поместить другое представление только для фона и кэша, это представление, потому что такое представление только в полноэкранном режиме вызовет те же проблемы.
  • Я не могу использовать windowsDecorator дляфон.

Так что мне нужен способ остановить GradientDrawable, чтобы попытаться перерисовать себя во время анимации.Я думаю, что jumpToCurrentState() делает то, что я хочу, но я хочу, чтобы он работал на уровне API> = 8, а jumpToCurrentState() только для уровня API> = 11.Кроме того, я хотел бы знать, что jumpToCurrentState делает именно для переноса его на API lvl 8, но не может найти функцию где-либо в отрисовке (источник не выпущен?)

Так есть ли любой способ кеширования отрисовки сам, а не представление, содержащее это Drawable?

В крайнем случае не рисовать фон во время анимации, но я очень хочу этого избежать.

1 Ответ

0 голосов
/ 10 октября 2011

В итоге я создал систему кэширования растровых изображений для GradientDrawable самому. (Не хотелось кэшировать представление, которое имеет этот объект в качестве фона).

Это дает большой прирост скорости для анимации.

  public class PGradientDrawable extends GradientDrawable {

    private int firstColor;
    private int secondColor;
    private Paint cachePaint = new Paint();
    private Canvas cacheCanvas = new Canvas();
    private Bitmap bitmap;

    public PGradientDrawable(Orientation angle, int[] intarray) {
        super(angle, intarray);
        firstColor = intarray[0];
        secondColor = intarray[1];
    }

    public boolean isBackground = false;
    boolean firstTime = true;

    public void buildCache(int width, int height) {
        if (bitmap != null)
            bitmap.recycle();
        try {
            bitmap = Bitmap
                    .createBitmap(width, height, Bitmap.Config.ARGB_8888);
            bitmap.setDensity(context.getResources().getDisplayMetrics().densityDpi);
            cacheCanvas.setBitmap(bitmap);
            // TODO shader must be what the GradientDrawable is,type
            // orientation..
            cachePaint.setShader(new LinearGradient(0, 0, width, height,
                    firstColor, secondColor, Shader.TileMode.CLAMP));
            cacheCanvas.drawPaint(cachePaint);

        } catch (OutOfMemoryError e) {
            // clear the bitmap force draw() to repaint
            bitmap = null;
        }

    }

    @Override
    public void draw(Canvas canvas) {
        if (bitmap != null) {
            // Draw the bitmap
            canvas.drawBitmap(bitmap, 0, 0, null);
            return;
        }
        super.draw(canvas);
    }

}
...