android - 渐变色动画

标签 android performance animation gradient

我想要实现的目标:

径向渐变,开始和结束颜色随着时间的推移从一种定义的颜色平滑地变化到另一种。

到目前为止我尝试了什么:

像这样使用 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);

问题:

  1. 渐变不平滑。图像看起来像低色
  2. 性能很差。我在全高清 Snapdragon 801 设备上获得了大约 16 FPS。

所以我想问的是在提高性能(甚至是完全不同的方式)和提高最终图像质量方面的任何帮助。

最佳答案

您可以像这样在渐变中设置动画颜色变化:

int colorFrom = ContextCompat.getColor(this, R.color.red);
int colorTo = ContextCompat.getColor(this, R.color.blue);
ValueAnimator colorAnimation = ValueAnimator.ofObject(new ArgbEvaluator(), colorFrom, colorTo);
colorAnimation.setDuration(2000);

int color1 = ContextCompat.getColor(this, R.color.red);
int color2 = ContextCompat.getColor(this, R.color.green);
GradientDrawable gradientDrawable = new GradientDrawable(
            GradientDrawable.Orientation.TOP_BOTTOM, new int[]{color1, color2});
gradientDrawable.setGradientType(GradientDrawable.LINEAR_GRADIENT);

colorAnimation.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {

        @Override
        public void onAnimationUpdate(ValueAnimator animator) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                gradientDrawable.setColors(new int[]{(int) animator.getAnimatedValue(), color2});
                viewWithGradientBg.setBackground(gradientDrawable);
            }
        }

    });

colorAnimation.start();

Kotlin 变体:

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    val colorFrom = ContextCompat.getColor(requireContext(), android.R.color.holo_red_dark)
    val colorTo = ContextCompat.getColor(requireContext(), android.R.color.holo_blue_dark)
    val colorAnimation = ValueAnimator.ofObject(ArgbEvaluator(), colorFrom, colorTo)
    colorAnimation.duration = 2000
    val color1 = ContextCompat.getColor(requireContext(), android.R.color.holo_red_dark)
    val color2 = ContextCompat.getColor(requireContext(), android.R.color.holo_blue_dark)
    val gradientDrawable = GradientDrawable(GradientDrawable.Orientation.TL_BR, intArrayOf(color1, color2))
    gradientDrawable.gradientType = GradientDrawable.RADIAL_GRADIENT
    colorAnimation.addUpdateListener { animator ->
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            gradientDrawable.colors = intArrayOf(animator.animatedValue as Int, color2)
            viewWithGradientBg.background = gradientDrawable
        }
    }
    gradientDrawable.gradientRadius = 140f;
    gradientDrawable.setGradientCenter(0.5f, 0.5f);
    colorAnimation.repeatCount = INFINITE
    colorAnimation.start()
}

关于android - 渐变色动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31383537/

相关文章:

java - 尽管在 wamp 服务器中,android 中的 SQL 查询无法识别希伯来字母

android 有多少 Intent 服务可以并行运行

javascript - 需要 setInterval 来自行停止

android - 如何在Android的PocketSphinx中优雅地处理错误?

java - 待办事项 应用程序崩溃

java - 从 Iterator<?> 返回相同的对象

python - 在 Python 中确定重叠时间序列的最有效方法

python:如何提高合并两个DataFrame的速度?

jquery - 如何为这个 .toggle() 的运动设置动画?

html - 如何创建一个充满移动 'nodes'并响应鼠标移动的网站背景?