2014-12-16 6 views
43

Как определить android:state_selected внутри RippleDrawableКак установить state_selected в пульсации вытяжки

я следующий XML для пульсирующей вытяжки, но цвета фона не отображается, когда я установил myView.setSelected(true);

<?xml version="1.0" encoding="utf-8"?> 
<ripple 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:color="#DDDDDD" 
    > 

    <item android:id="@android:id/mask"> 
     <shape> 
      <solid 
       android:color="@color/black" /> 
     </shape> 
    </item> 


    <item android:state_selected="true"> 
     <shape> 
      <solid 
       android:color="#EEEEEE" /> 
     </shape> 
    </item> 


    <item> 
     <color android:color="#FFFFFF" /> 
    </item> 

</ripple> 

ответ

70

Найдено ответ , на всякий случай, если кто-то другой имеет ту же проблему

<?xml version="1.0" encoding="utf-8"?> 
<ripple 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:color="#DDDDDD" 
    > 


    <item> 
    <selector> 
     <item android:state_selected="true"> 
      <color android:color="#EEEEEE" /> 
     </item> 

     <item android:state_activated="true"> 
      <color android:color="#EEEEEE" /> 
     </item> 

     <item> 
      <color android:color="#FFFFFF" /> 
     </item> 
    </selector> 
    </item> 


</ripple> 
+1

Вам не нужно, чтобы установить слой маски здесь, так как ваша маска и содержание имеют одинаковые границы и непрозрачность. Удаление маски значительно улучшит производительность. – alanv

+0

Спасибо @alanv. Удалена маска. Вы упомянули одинаковые границы и непрозрачность, как непрозрачность работает в маске? – Sohaib

+7

По какой-то причине, если вы используете прозрачный цвет для нормального состояния селектора, вы должны использовать маску, иначе пульсация не будет нарисована. – vovahost

6

Объединение вышеуказанного ответа с другими ответами:

What should be the color of the Ripple, colorPrimary or colorAccent? (Material Design)

дает хороший эффект волны, который также работает, когда элемент находится в выбранном состоянии.

<ripple xmlns:android="http://schemas.android.com/apk/res/android" 
    android:color="?attr/colorControlHighlight"> 
<!-- Ripple mask - applied to all selector states --> 
<item android:id="@android:id/mask"> 
    <color android:color="#42ffffff" /> 
</item> 
<!-- Selected state of item --> 
<item> 
    <selector> 
     <item android:state_selected="true"> 
      <color android:color="?attr/colorAccent" /> 
     </item> 
    </selector> 
</item> 
</ripple> 

Это идет в папке вытяжки-V21, для других платформ, вы можете просто создать селектор, который использует цвет акцента:

<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:drawable="@color/accent" android:state_selected="true"/> 
    <item android:drawable="@color/accent" android:state_pressed="true"/> 
</selector> 
7

Чтобы добавить ответ @Sohaib «s:

@ Аланв прав, что ОП не нуждается в маске. Но если один из ваших состояний селекторных прозрачна и вам нужна маска она идет здесь:

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

    <!-- mask here... --> 
    <item android:id="@android:id/mask"> 
     <color android:color="@color/black"/> <!-- any color will do --> 
    </item> 

    <item> 
     <selector> 
      <!-- ... NOT here. --> 
      <item android:state_selected="true"> 
       <color android:color="@color/blue"/> 
      </item> 

      <item android:state_activated="true"> 
       <color android:color="@color/red"/> 
      </item> 

      <item> 
       <color android:color="@color/transparent"/> 
      </item> 
     </selector> 
    </item> 
</ripple> 

я изначально имел маску внутри моего селекторном: стрелы:

1

Я хотел, чтобы имитировать поведение материала Дизайн флажков, но я не мог получить их прямо, пока я не использовал ColorStateList так:

В вытяжке-v21/bg_checkbox_ripple.xml

<?xml version="1.0" encoding="utf-8"?> 
<ripple 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:color="@color/checked_accent_statelist" 
    android:radius="24dp"> 
</ripple> 

В цвете/checked_acce nt_statelist.xml

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:color="?colorControlHighlight" android:state_checked="false"/> 
    <item android:color="?android:textColorHighlight" android:state_checked="true"/> 
</selector> 

Атрибут «андроид: textColorHighlight» ваш акцент цвета, но с правом прозрачности для использования в ряби (я думаю, что это на 26%).

Кроме того, вы должны предоставить запасной вариант для предварительного API 21 устройств в вытяжке/bg_checkbox_ripple.xml

<?xml version="1.0" encoding="utf-8"?> 
<selector 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:exitFadeDuration="@android:integer/config_shortAnimTime"> 
    <item> 
     <shape android:innerRadius="24dp" android:shape="oval"> 
      <solid android:color="@color/checked_accent_statelist"/> 
     </shape> 
    </item> 
</selector>