阻止GradientDrawable在动画时重绘

时间:2011-10-10 16:37:37

标签: android android-layout drawable

我已将GradientDrawable设置为背景。在进行一些3d事务处理时(特别是在Y轴上),GradientDrawable会重新绘制它,并且表示不好。

  • 我无法缓存将绘图设置为背景的视图,因为 我想要其他观点来制作动画。
  • 我不能仅为后台添加另一个视图并缓存该视图 因此那个视图只有全屏会导致相同 问题。
  • 我无法使用windowsDecorator作为背景。

所以我想要的是一种方法来阻止GradientDrawable在动画期间尝试重绘自己。我认为jumpToCurrentState()符合我的要求,但我希望它能够在API级别上工作> = 8而jumpToCurrentState()仅适用于API级别> = 11。另外我希望我知道jumpToCurrentState完全将它移植到API lvl 8但是却无法在drawable中找到该函数(源未发布?)

是否有任何方式来缓存drawable,而不是包含该Drawable的视图?

最后的选择是在动画期间不绘制背景,但我真的很想避免这种情况。

1 个答案:

答案 0 :(得分:0)

我最终为GradientDrawable创建了一个位图缓存系统。 (不想缓存具有此drawable作为背景的视图。)

这为动画提供了极大的速度提升。

  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);
    }

}