LinearGradient Center Animation

Я хочу анимировать центр линейного градиента, так что вначале весь drawable является цветом1, а в конце весь drawable является цветом2, а между центром градиента движется слева направо.

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 (), когда пользователь проводит Его пальцем по виду, поэтому он должен быть очень быстрым.

Есть ли способ сделать это?

Я хочу сделать что-то вроде этого (все сенсорные вещи отлично работают, но не анимированный градиент):

Введите описание изображения здесь

    То, о чем вы просите, не является чистым линейным градиентом – линейный градиент между двумя цветами на фиксированной ширине имеет только одну математическую функцию, определяющую его, и именно поэтому вы не можете изменить центр. Я думаю, что вы ищете, это фиксированное начало и конец цвета, а также область линейного градиента между ними.

    Попробуйте это решение:

      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 и удалить маркер позиции (большой палец) примерно так.

     <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-патч, который можно вырезать из левого цветного (зеленого) затухания до прозрачного, что будет растягивать только крайний левый край. Моя выглядит так

    left_colour.9.png (Это белая затухающая прозрачность, так что трудно увидеть здесь)

    Это дает быстрое решение и не требует какого-либо сенсорного кодирования с вашей стороны, но у него есть недостаток, он не совсем подходит к дальнему концу, поэтому часть «линейного градиента» изображения все еще видна даже Когда пользователь переместился полностью. Если это не большая проблема, тогда это будет работать хорошо.

    Intereting Posts