【发布时间】:2015-07-13 12:32:26
【问题描述】:
我想要达到的目标:
径向渐变,起始颜色和结束颜色随着时间的推移从一种定义的颜色平滑地变化到另一种定义的颜色。
到目前为止我所做的尝试:
像这样使用 ObjectAnimator:
searchAnimator = ObjectAnimator.ofFloat(drawThread, new Property<DrawThread, Float>(Float.TYPE, "fraction") {
@Override
public Float get(DrawThread object) {
return object.fraction;
}
@Override
public void set(DrawThread object, Float value) {
object.setFraction(value);
}
}, 0, 1);
searchAnimator.setDuration(maxSearchDuration);
searchAnimator.setInterpolator(new LinearInterpolator());
随着时间的推移,这将调用DrawThread.setFraction(value);。在线程内部,我使用SurfaceView 执行Canvas 绘图,如下所示:
mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mPaint.setDither(true);
mPaint.setStyle(Paint.Style.FILL_AND_STROKE);
radius = (int) Math.sqrt(canvas.getWidth() / 2 * canvas.getWidth() / 2 + canvas.getHeight() / 2 * canvas.getHeight() / 2);
//calculating colors for current fraction using ARGBEvaluator
int start = (int) argbEvaluator.evaluate(fraction, colors[0].start, colors[1].start);
int end = (int) argbEvaluator.evaluate(fraction, colors[0].end, colors[1].end);
//end
mPaint.setShader(new RadialGradient(canvas.getWidth() / 2, canvas.getHeight() / 2,
radius, start, end, Shader.TileMode.CLAMP));
canvas.drawCircle(canvas.getWidth() / 2, canvas.getHeight() / 2, radius, mPaint);
问题:
- 渐变不平滑。图片看起来颜色很浅
- 性能非常低。我在全高清 Snapdragon 801 设备上获得了大约 16 FPS。
所以我想问的是在提高性能(甚至完全不同的方式)和提高图像质量方面的任何帮助。
【问题讨论】:
-
我可能会尝试使用
GradientDrawable作为普通视图(不是 SurfaceView)的背景。并使用 ValueAnimator 计算和回调每个动画帧,您可以在其中计算梯度值并调用gradientDrawable.setColors(int[]) -
@Budius,谢谢,但我已经尝试过了。性能相同,setColors 方法不适用于旧 API(如 7)
-
这将是我的第一个方法,因为它比 SurfaceView 简单得多。您的后台线程不是在做其他减慢速度的工作吗?关于 API 级别,不确定您的要求,但 API 7 太旧了,甚至 Google 都在很长一段时间内放弃了对它们的支持。它甚至没有显示在仪表板上:developer.android.com/about/dashboards/…
-
@Budius 这里是 API 文档,上面写着
setColors()是在 API 16 中添加的 developer.android.com/reference/android/graphics/drawable/… 我完全不能选择放弃对旧 API 的支持
标签: android performance animation gradient