Lollipop RippleDrawable против селектора для предварительного Lollipop

#android #material-design #android-5.0-lollipop #ripple #rippledrawable

#Android #материал-дизайн #android-5.0-lollipop #пульсация #rippledrawable

Вопрос:

У меня есть кнопки с другим рисунком 9patch png в качестве фона. В настоящее время кнопки управляются с помощью selector , которые выглядят примерно так:

 <selector xmlns:android="http://schemas.android.com/apk/res/android">
  <item android:drawable="@drawable/pressed" android:state_pressed="true"/>
  <item android:drawable="@drawable/disabled" android:state_enabled="false"/>
  <item android:drawable="@drawable/focused" android:state_focused="true"/>
  <item android:drawable="@drawable/default"/>
</selector>
  

Для Android Lollipop у них есть RippleDrawable для эффекта касания, который выглядит примерно так:

 <ripple xmlns:android="http://schemas.android.com/apk/res/android" android:color="?android:colorControlHighlight">
    <item>
    ...
    </item>
</ripple>
  

Что касается нового эффекта пульсации касания:

1: Могу ли я установить draw9patch в качестве фона для RippleDrawable ?

2: Как мне совместить вышеупомянутые два разных xml, которые я хочу использовать в Material design? Должен ли я использовать новую папку / макет xml для нового RippleDrawable ?

Комментарии:

1. Я не думаю, что вы можете применить 9png в качестве фона. Вы можете применить цвет к вашему RippleDrawable.

Ответ №1:

1) Да. Смотрите документацию для RippleDrawable для получения более подробной информации о том, как составляются слои, но в основном вы хотите:

 <?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
    android:color="?android:attr/colorControlHighlight">
    <item android:drawable="@drawable/yourninepatch" />
</ripple>
  

Или, чтобы также обрабатывать отключенное состояние чистым способом, вы можете захотеть:

 <?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
    android:color="?android:attr/colorControlHighlight">
    <item>
        <selector>
            <item android:state_enabled="false">
                <nine-patch
                    android:src="@drawable/yourninepatch"
                    android:alpha="?android:attr/disabledAlpha" />
            </item>
            <item>
                <nine-patch android:src="@drawable/yourninepatch" />
            </item>
        </selector>
    </item>
</ripple>
  

2) Да, вы должны поместить свой ripple XML в drawable-v21.

Комментарии:

1. Я получил ошибку, Element ripple must be declared когда я поместил <ripple …> xml в папку values-v21 .

2. Извините, я имел в виду каталог drawable-v21.

3. есть какой-нибудь способ сделать это для всех объектов рисования автоматически? значит, нам не нужно создавать ад копирования и вставки?

4. Прочитайте ответ и комментарии еще раз. Он доступен в drawables-v21.

5. Нет, вам нужен только один элемент ripple. Обычно вы оставляете значение colorControlHighlight по умолчанию, но вы также можете установить цвет в список состояния цвета, если вам абсолютно необходимо иметь разные цвета пульсаций при нажатии и фокусировке. Имейте в виду, что вы увидите пульсацию только тогда, когда элемент включен и нажат или сфокусирован.