Эффект прожектора onFocus на Android

avatar
Dhairy Tripathi
8 августа 2021 в 16:18
77
1
1

Я пытаюсь добиться эффекта прожектора всякий раз, когда элемент в представлении ресайклера находится в фокусе. Я прилагаю изображение ниже, чтобы показать, что я имею в виду.
enter image description here

Я добился чего-то подобного, используя рисуемый фон, как показано ниже.

Это код для рисования
bg_glow.xml

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
      <shape android:shape="rectangle">
        <gradient
            android:startColor="#80e8eaed"
            android:gradientRadius="50dp"
            android:endColor="#00000000"
            android:type="radial" />
      </shape>
    </item>
</layer-list>

Я создал пользовательское представление, которое добавляет это рисование всякий раз, когда изображение находится в фокусе. Вот код.

override fun onFocusChanged(gainFocus: Boolean, direction: Int, previouslyFocusedRect: Rect?) {
    super.onFocusChanged(gainFocus, direction, previouslyFocusedRect)
    if (gainFocus) {
        categorySpotlight.background = ContextCompat.getDrawable(context, R.drawable.bg_glow)
        ivappCategory.strokeWidth = 2

    } else {
        categorySpotlight.background = ContextCompat.getDrawable(context, R.drawable.transparent)
        ivappCategory.strokeWidth = 0
    }
}

Теперь есть несколько проблем с этим:

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

Источник

Ответы (1)

avatar
Dev4Life
9 августа 2021 в 15:08
0

Вы можете изменить цвет градиента на основе преобладающего цвета на изображении выделенного элемента.

Если вы можете создать объект рисования программно, вы также можете изменить цвет тени.

В Android можно программно создать рисуемый объект. См. это:

public static GradientDrawable makeRadialGradient(int startColor, int endColor) {
  GradientDrawable gd = new GradientDrawable(
  GradientDrawable.Orientation.TOP_BOTTOM, new int[]{startColor, endColor});
  gd.setGradientType(GradientDrawable.RADIAL_GRADIENT);
  gd.setGradientRadius(500.0f);
  gd.setGradientCenter(0.5f, 0.5f);
  return gd;
}

Теперь вы можете использовать этот метод с вашими пользовательскими цветами, и он даст возможность рисовать градиент (а не растровое изображение). Поэтому, если вы хотите использовать градиент, ваш целевой фон изображения должен быть градиентным (как сейчас). Просто вызовите метод:

makeRadialGradient(Color.parseColor("#D3D3D3"), Color.parseColor("#FFFFFF"));

Теперь, если вы хотите создать градиент от доминирующего цвета, вы можете просто передать цветовые коды в метод, и он даст вам нужный градиент.

Вы должны изменить значения для достижения наилучшего результата.

Измените радиус градиента, опорные точки и тип в соответствии с вашими предпочтениями.

Dhairy Tripathi
10 августа 2021 в 05:37
0

Совсем не работает. Это дает нормальное рисование, а не то, что мне нужно. Спасибо за ответ кстати.

Dev4Life
10 августа 2021 в 06:56
0

Попробуйте уменьшить радиус до 100 или что-то еще, что поможет вам выполнить свою работу.

Dhairy Tripathi
11 августа 2021 в 05:15
0

Не работает. Я просто создаю один овал, который не совсем то, что нужно. Нам нужно создать что-то вроде эффекта прожектора, как показано на изображении выше.