LinearGradient中心动画

时间:2014-01-28 10:32:16

标签: android animation 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);

问题是setGradientCenter没有任何区别。根据这个答案https://stackoverflow.com/a/14383974/1395697,setGradientCenter()存在一个问题,但是这个答案中的解决方案对我不起作用,因为当用户在视图上滑动手指时我更改onTouch()中的渐变,所以它需要非常快。

有办法做到这一点吗?

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

enter image description here

2 个答案:

答案 0 :(得分:3)

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

试试这个解决方案:

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

此代码似乎反应速度足够快,但确实创建了LinearGradient的多个实例。

答案 1 :(得分:0)

您可以使用搜索栏执行此类操作。

您需要设置自定义progressDrawable属性并删除位置标记(拇指),如下所示。

<SeekBar 
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:progressDrawable="@drawable/gradient_progress"  
    android:thumb="@null"/>

gradient_progress.xml

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@android:id/background"
            android:drawable="@drawable/right_colour" />
    <item android:id="@android:id/secondaryProgress">
        <scale android:scaleWidth="100%"
                android:drawable="@drawable/left_colour" />
    </item>
    <item android:id="@android:id/progress">
        <scale android:scaleWidth="100%"
                android:drawable="@drawable/left_colour" />
    </item>
</layer-list>

其中right_colour是右手颜色(蓝色)的可绘制或颜色资源,left_colour是左手颜色(绿色)的9-patch drawable,淡入透明,仅拉伸最左边。我看起来像这样

left_colour.9.png(白色渐渐变得透明,很难看到这里)

这提供了一个快速且不需要任何触摸编码的解决方案,但它确实有一个缺点,它不能直接到达远端,因此图像的“线性渐变”部分是即使用户已经完全移动,仍然可见。如果这不是一个大问题,那么这将很好。