我已将GradientDrawable设置为背景。在进行一些3d事务处理时(特别是在Y轴上),GradientDrawable会重新绘制它,并且表示不好。
所以我想要的是一种方法来阻止GradientDrawable在动画期间尝试重绘自己。我认为jumpToCurrentState()
符合我的要求,但我希望它能够在API级别上工作> = 8而jumpToCurrentState()
仅适用于API级别> = 11。另外我希望我知道jumpToCurrentState完全将它移植到API lvl 8但是却无法在drawable中找到该函数(源未发布?)
是否有任何方式来缓存drawable,而不是包含该Drawable的视图?
最后的选择是在动画期间不绘制背景,但我真的很想避免这种情况。
答案 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);
}
}