Android TV: размер и цвет тени VerticalGridFragment

Я работаю над приложением для Android TV, но меня не совсем устраивает стандартная тень, отображаемая VerticalGridFragment, я бы хотел, чтобы она была меньше и немного менее темной.

Я просмотрел код, но не нашел полного рабочего решения. В моем подклассе VerticalGridPresenter единственным методом, который я могу переопределить, является createShadowOverlayOptions, но я не могу получить желаемый результат.

Единственный обходной путь, который я придумал, — это определить следующие размеры, чтобы те, которые объявлены в библиотеке поддержки, были переопределены:

<dimen name="lb_material_shadow_details_z">3dp</dimen>
<dimen name="lb_material_shadow_focused_z">4dp</dimen>
<dimen name="lb_material_shadow_normal_z">3dp</dimen>

Но это скорее хак, чем правильное решение.

Это стандартная тень:

Стандартная тень

Вот результат, который я получаю с моим текущим взломом:

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

Как вы видите, он меньше, но я не могу изменить цвет.

Есть ли правильный способ установить цвет и размер тени для классов VerticalGridFragment и RowsFragment?

Я использую последнюю версию Leanback:

compile 'com.android.support:leanback-v17:25.2.0'

Моему minSdkVersion 17 лет из-за пользовательского проигрывателя Android TV, но это нормально, если он работает с 21 года.


person fasteque    schedule 06.03.2017    source источник


Ответы (1)


На самом деле я спрашивал об этом команду Leanback раньше, и они сказали, что рекомендуемый способ настройки их компонентов — переопределение стилей и размеров. Так что это может помочь успокоить часть вашего беспокойства.

Однако нам также пришлось настроить тени на наших представлениях. Мы сделали это, создав наши собственные представления и наши собственные презентаторы представлений (вместо использования их ImageCardView). Благодаря этому мы смогли установить собственные тени на уровне презентации.

Если вы посмотрите документацию для ListRowPresenter документы говорят:

ListRowPresenter применяет тень по умолчанию к каждому дочернему представлению. Вызовите setShadowEnabled(boolean), чтобы отключить тени. Подкласс может переопределить и вернуть false в isUsingDefaultShadow() и заменить его собственной теневой реализацией.

Чтобы узнать больше о том, как они обрабатывают тени, просмотрите исходный код ListRowPresenter, а также ознакомьтесь с классами ShadowHelper и ShadowHelperApi21, чтобы увидеть, как они реализовали добавление теней к своим элементам списка. На самом деле мы просто скопировали эти два класса, поскольку они являются локальными для пакета.

Вы также можете переопределить ShadowOverlayHelper.Options createShadowOverlayOptions() в ListRowPresenter, что дает вам некоторую возможность изменить радиус угла и сфокусированное и не сфокусированное z.

person Kyle Venn    schedule 06.03.2017
comment
Спасибо за подсказки: принято, потому что это указывает мне на правильные классы и логику для реализации пользовательской тени (конечно, я не мог претендовать на полную реализацию здесь). - person fasteque; 07.03.2017
comment
что, если я хочу показывать тень только тогда, когда выбрана любая карта? - person NehaK; 26.06.2018
comment
Прошло некоторое время с тех пор, как я это сделал, но последняя строка должна работать: вы также можете переопределить ShadowOverlayHelper.Options createShadowOverlayOptions() в ListRowPresenter, что дает вам некоторую возможность изменить радиус угла и сфокусированное и не сфокусированное z. Вы можете указать ShadowOverlayHelper.Options, который указывает dynamicShadowUnfocusedZ как 0, и тогда будет отображаться только сфокусированная тень. - person Kyle Venn; 26.06.2018