0

Моя простая цель - изменить фон ImageButton на разные состояния кнопок. Итак, что у меня естьНеожиданный результат использования разных фигур с состояниями ImageButton

mylayout.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    tools:context=".MyActivity" 
    android:orientation="vertical" 
    android:id="@+id/idBackground"> 
    ... 
    <ImageButton 
     android:id="@+id/btnCapture" 
     android:layout_height="wrap_content" 
     android:layout_width="wrap_content" 
     android:background="@drawable/ic_photo_selector" 
     android:src="@drawable/ic_photo" 
     android:padding="25dp" 
     android:layout_alignParentBottom="true" 
     android:layout_centerHorizontal="true"/> 
    ... 
</RelativeLayout> 

ic_photo_selector.xml

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

    <item android:state_pressed="true"> 
     <shape android:shape="oval" > 

      <gradient 
       android:centerColor="#3311ffed" 
       android:centerX="0.5" 
       android:centerY="0.5" 
       android:endColor="#8011ffed" 
       android:gradientRadius="150" 
       android:startColor="#2711ffed" 
       android:type="radial" /> 

      <stroke 
       android:width="2dp" 
       android:color="#3300DDFF" /> 

      <padding 
       android:bottom="15dp" 
       android:left="15dp" 
       android:right="15dp" 
       android:top="15dp" /> 

     </shape> 
    </item> 

    <item android:drawable="@drawable/capture_button_bg"/> 

</selector> 

capture_button_bg.xml

<?xml version="1.0" encoding="utf-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android" 
    android:shape="oval" > 

    <gradient 
     android:centerColor="#1111ffed" 
     android:centerX="0.5" 
     android:centerY="0.5" 
     android:endColor="#5E11ffed" 
     android:gradientRadius="150" 
     android:startColor="#0511ffed" 
     android:type="radial" /> 

    <stroke 
     android:width="2dp" 
     android:color="#1100DDFF" /> 

    <padding 
     android:bottom="15dp" 
     android:left="15dp" 
     android:right="15dp" 
     android:top="15dp" /> 

</shape> 

ic_photo.png (это прозрачное изображение, но из-за этот веб-сайт имеет белый фон, я разместил его на черном слое)

enter image description here

Итак, как вы можете видеть, визуальную разницу между двумя состояниями (нажатие и по умолчанию) должно быть просто прозрачным. Но режим дизайна, как реальных устройств показали еще один результат

      Default State    Pressed State
enter image description here enter image description here

Мой разум действительно заблокирован. Почему кнопка по умолчанию имеет такую ​​разницу цветов с нажатой кнопкой? Как я и ожидал, разница должна быть только в режиме прозрачности.

Любые идеи? Или может быть, это что-то не так в моих фрагментах кода?

+0

вы можете попробовать изображение. –

+0

В селекторе вы устанавливаете параметр , который по умолчанию. Попробуйте заменить его прозрачным цветом. – Kantesh

+0

@ Ravi Это мне не помогло. Более того, когда я использовал «ImageView» вместо «ImageButton», селектор потерял смысл (кнопка теперь имеет статическое изображение). – user3307869

ответ

0

Я нашел решение своей проблемы, но это что-то странное.

Случаю поведения, описанное выше, состояли в использовании встроенного <shape> для прессованного состояния и ссылки на Drawable для состояния по умолчанию.

Решение:

1) Используя встроенный <shape> как для залипшего и состояния по умолчанию

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

    <item android:state_pressed="true"> 
     <shape android:shape="oval" > 

      <gradient 
       android:centerColor="#3311ffed" 
       android:centerX="0.5" 
       android:centerY="0.5" 
       android:endColor="#8011ffed" 
       android:gradientRadius="150" 
       android:startColor="#2711ffed" 
       android:type="radial" /> 

      <stroke 
       android:width="2dp" 
       android:color="#3300DDFF" /> 

      <padding 
       android:bottom="15dp" 
       android:left="15dp" 
       android:right="15dp" 
       android:top="15dp" /> 

     </shape> 
    </item> 

    <item> 
     <shape android:shape="oval" > 

      <gradient 
       android:centerColor="#1111ffed" 
       android:centerX="0.5" 
       android:centerY="0.5" 
       android:endColor="#5E11ffed" 
       android:gradientRadius="150" 
       android:startColor="#0511ffed" 
       android:type="radial" /> 

      <stroke 
       android:width="2dp" 
       android:color="#1100DDFF" /> 

      <padding 
       android:bottom="15dp" 
       android:left="15dp" 
       android:right="15dp" 
       android:top="15dp" /> 

     </shape> 
    </item> 

</selector> 

2) Используя ссылку на Drawable для залипшех и inline <shape> для состояние по умолчанию

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

    <item android:state_pressed="true" android:drawable="@drawable/capture_button_bg_pressed"/> 

    <item> 
     <shape android:shape="oval" > 

      <gradient 
       android:centerColor="#1111ffed" 
       android:centerX="0.5" 
       android:centerY="0.5" 
       android:endColor="#5E11ffed" 
       android:gradientRadius="150" 
       android:startColor="#0511ffed" 
       android:type="radial" /> 

      <stroke 
       android:width="2dp" 
       android:color="#1100DDFF" /> 

      <padding 
       android:bottom="15dp" 
       android:left="15dp" 
       android:right="15dp" 
       android:top="15dp" /> 

     </shape> 
    </item> 

</selector> 

capture_button_bg_pressed.xml

<?xml version="1.0" encoding="utf-8"?> 

      <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval" > 

       <gradient 
        android:centerColor="#3311ffed" 
        android:centerX="0.5" 
        android:centerY="0.5" 
        android:endColor="#8011ffed" 
        android:gradientRadius="150" 
        android:startColor="#2711ffed" 
        android:type="radial" /> 

       <stroke 
        android:width="2dp" 
        android:color="#3300DDFF" /> 

       <padding 
        android:bottom="15dp" 
        android:left="15dp" 
        android:right="15dp" 
        android:top="15dp" /> 

      </shape> 

Кроме того, главное, что состояниепо умолчанию должно следовать последним (ниже любых других государств).

Я не могу объяснить, почему это так, но это работает для меня.

 Смежные вопросы

  • Нет связанных вопросов^_^