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
    Как загружать два или несколько файлов одновременно в Android с помощью NanoHTTPD? Конвертировать UTC в локальное время на Android Android 3.0 Панель действий Поиск Просмотр Зачем использовать Enums вместо констант? Как вручную вводить логин и выход из системы с помощью кнопки без использования <com.facebook.widget.LoginButton />? Всплывающее меню выходит из экрана Android: использование памяти увеличивается каждый раз при нажатии на вкладку (при использовании ActivityGroup) Android перестает отправлять события onTouch Как изменить положение диалога прогресса? Каковы возможные причины повреждения двоичных файлов на устройствах Android GetLastKnownLocation () Android, когда обновляется последнее известное местоположение? Android: мгновенно запустите действие, а затем загрузите контент Как использовать blender на Android Как я могу изменить тему Головой Темной / Свет из приложения? Проблема Android TextView Focus в списке (только MarshMallow)