我想要为线性渐变的中心设置动画,以便在开始时整个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()中的渐变,所以它需要非常快。
有办法做到这一点吗?
我想做这样的事情(所有的触控效果都很好但不是动画渐变):
答案 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,淡入透明,仅拉伸最左边。我看起来像这样
(白色渐渐变得透明,很难看到这里)
这提供了一个快速且不需要任何触摸编码的解决方案,但它确实有一个缺点,它不能直接到达远端,因此图像的“线性渐变”部分是即使用户已经完全移动,仍然可见。如果这不是一个大问题,那么这将很好。