LinearGradient中心动画

Dom*_*icM 9 animation android gradient linear-gradients

我想要为线性渐变的中心设置动画,以便在开始时整个drawable是color1,最后整个drawable是color2,并且在渐变的中心之间从左到右移动.

GradientDrawable gd = new GradientDrawable(
                              GradientDrawable.Orientation.LEFT_RIGHT,
                              new int[] {color1, color2});
gd.setCornerRadius(0f);
gd.setGradientCenter(x, 0);
view.setBackgroundDrawable(gd);
Run Code Online (Sandbox Code Playgroud)

问题是setGradientCenter没有任何区别.根据这个答案/sf/answers/1006878211/ setGradientCenter()存在问题但是这个答案中的解决方案对我不起作用,因为我在用户滑动时更改onTouch()中的渐变他的手指在视野上,所以它需要非常快.

有没有办法做到这一点?

我想做这样的事情(所有触摸的东西都很好但不是动画渐变):

在此输入图像描述

Raa*_*nan 4

您要求的不是纯线性渐变 - 固定宽度上两种颜色之间的线性渐变只有一个数学函数定义它,这就是您无法更改中心的原因。我认为您正在寻找的是固定的颜色开始和结束,以及它们之间的线性渐变区域。

尝试这个解决方案:

    sf = new ShapeDrawable.ShaderFactory() {
     @Override
     public Shader resize(int width, int height) {
        LinearGradient lg = new LinearGradient(0, 0, view.getWidth(), 0, new int[] {Color.WHITE, Color.BLACK}, //substitute the correct colors for these
                 new float[] {center - 0.3f, center + 0.3f}, Shader.TileMode.REPEAT);
        return lg;
     }
  };
  p = new PaintDrawable();
  rectShape = new RectShape();
  p.setShape(rectShape);
  p.setShaderFactory(sf);
  view.setBackgroundDrawable((Drawable) p);
  view.setOnTouchListener(new View.OnTouchListener() {

     @Override
     public boolean onTouch(View v, MotionEvent event) {
        center = event.getX() / view.getWidth(); // calculate the center
        p.setShape(rectShape); // this makes the shader recreate the lineargradient
        return true;
     }
  });
Run Code Online (Sandbox Code Playgroud)

这段代码似乎反应速度足够快,可以触摸,但确实创建了 LinearGradient 的多个实例。