LinearGradient Center Animation

Quiero animar el centro de un gradiente lineal, de modo que al principio todo el dibujable sea color1 y al final todo el dibujable sea color2 y entre el centro del gradiente se desplace de izquierda a derecha.

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

El problema es que setGradientCenter no hace ninguna diferencia. De acuerdo con esta respuesta https://stackoverflow.com/a/14383974/1395697 hay un problema con setGradientCenter (), pero la solución en esta respuesta no funciona para mí, ya que cambiar el gradiente en onTouch () cuando el usuario pasa Su dedo sobre la vista, por lo que tiene que ser muy rápido.

¿Hay alguna forma de hacer esto?

Quiero hacer algo como esto (todas las cosas táctiles funciona muy bien, pero no el degradado animado):

Introduzca aquí la descripción de la imagen

Lo que usted pide no es un gradiente lineal puro – un gradiente lineal entre dos colores en un ancho fijo tiene sólo una función matemática que lo define y es por eso que no se puede cambiar el centro. Lo que creo que estás buscando es un color fijo principio y final, y un gradiente lineal entre ellos.

Pruebe esta solución:

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

Este código parece reaccionar lo suficientemente rápido para tocar, pero crea varias instancias de LinearGradient.

Puedes hacer algo como esto con un buscador.

Deberá establecer un atributo progressDrawable personalizado y quitar el marcador de posición (thumb) algo como esto.

 <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> 

Donde right_colour es un recurso dibujable o de color del color de la mano derecha (azul) y el color de la izquierda es un 9-patch dibujable del color de la izquierda (verde) que se desvanece a transparente que estirará solamente el borde más a la izquierda. El mío se parece a esto

Left_colour.9.png (Es blanco que se descolora a la transparencia tan difícil de ver aquí)

Esto da una solución que es rápida y no requiere ninguna codificación táctil en su parte, pero tiene un inconveniente, no va completamente a la derecha hasta el extremo final por lo que la porción de gradiente lineal de la imagen sigue siendo visible, incluso Cuando el usuario se ha movido completamente. Si eso no es un gran problema, entonces esto funcionará bien.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.