0

我的简单目标是更改ImageButton不同按钮状态的背景。所以,我所拥有的是

我的布局.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(它是透明图像,但由于这个网站有白色背景,我把它贴在黑色层上)

在此处输入图像描述

因此,如您所见,两种状态(按下和默认)之间的视觉差异应该是透明的。但作为真机的设计模式却呈现出另一种结果

                        默认状态 按下状态
在此处输入图像描述 在此处输入图像描述

我的心真的被堵住了。为什么默认按钮与按下的按钮有这样的颜色差异?正如我所料,差异应该只是在透明模式下。

有任何想法吗?或者可能是我的代码片段有问题?

4

1 回答 1

0

我找到了我的问题的解决方案,但这很奇怪。

上述行为的情况包括使用 inline<shape>来表示按下状态和对可绘制对象的引用作为默认状态

解决方案:

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的引用作为按下状态和内联<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>

此外,要点是应最后遵循默认状态(低于任何其他状态)。

我无法解释为什么会这样,但它对我有用。

于 2015-05-26T13:02:29.843 回答