LinearGradient Centeranimation

我想为线性渐变的中心设置animation,以便在开始时整个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()中的渐变他的手指在视野上,所以它需要非常快。

有没有办法做到这一点?

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

在此处输入图像描述

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

    试试这个解决方案

      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的多个实例。

    你可以用搜索栏做这样的事情。

    您需要设置自定义progressDrawable属性并删除像这样的位置标记(拇指)。

      

    gradient_progress.xml

              

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

    left_colour.9.png (这是透明的白色褪色,这里很难看到)

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