如何同时为按钮应用形状和选择器?

92

我已经为一个按钮应用了一个形状,如下所示:

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

<shape xmlns:android="http://schemas.android.com/apk/res/android"
       android:shape="rectangle" >
    <gradient android:startColor="#DD000000" android:endColor="#DD2d2d2d"  android:angle="90"></gradient>
    <corners android:radius="15dip"></corners>

</shape>

现在我想使用这样的选择器:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/active"
      android:state_pressed="true" />
<item android:drawable="@drawable/passive"/>

这个按钮也可以吗?是否有可能...???

9个回答

198

使用以下方法:

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

   <item android:state_pressed="true" >
       <shape>.......</shape>
   </item>
   ..........
   ..........
</selector>

8
是的,它通过使用以下内容起作用: <corners android:radius="15dip"></corners> <solid android:color="#febd26"/> </shape>
</item> <item> <shape android:shape="rectangle" > <gradient android:startColor="#DD000000" android:endColor="#DD2d2d2d" android:angle="90"></gradient> <corners android:radius="15dip"></corners> </shape> </item> </selector>
- Khawar Raza
7
在未来,请将像这样的信息放在您的“问题”中,这样可以更轻松地格式化和查找。评论往往会随着时间的推移而消失。 - Tim Post
我尝试按照你的建议在item元素中添加一个shape元素,但它只是出现了一个错误消息,没有什么帮助 09-13 15:25:02.868: ERROR/AndroidRuntime(9129): FATAL EXCEPTION: main android.view.InflateException: Binary XML file line #13: Error inflating class <unknown>. 我正在将选择器设置为 RoundedImageViewandroid:background 属性 [ https://github.com/vinc3m1/RoundedImageView#usage]。有人有任何想法如何解决这个问题吗? - Etienne Lawlor
尝试使用这种技术时,我一直收到错误消息。AZ_的答案对我更有效。 - Alan Nelson
@Alan Nelson,我的回答只是框架,而AZ_已经给出了例子。 - Hanry

25

简洁明了的回答:

res/values/colors.xml 中创建颜色资源。

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


    <item name="yellow" type="color">#F7B500</item>
    <item name="yellow_dark" type="color">#AC7E00</item>

    <integer-array name="androidcolors">
        <item>@color/yellow</item>
        <item>@color/yellow_dark</item>
    </integer-array>

</resources>

创建一个可绘制对象,路径为res/drawable/bg_yellow_round.xml

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

    <solid android:color="@color/yellow" />

    <stroke
        android:width="2dp"
        android:color="@color/yellow" />

    <corners
        android:bottomLeftRadius="20dp"
        android:bottomRightRadius="20dp"
        android:topLeftRadius="20dp"
        android:topRightRadius="20dp" />

</shape>
创建另一个drawable,您希望在同一位置进行转换并将其命名为 res/drawable/bg_yellow_dark_round.xml
<solid android:color="@color/yellow_dark" />

<stroke
    android:width="2dp"
    android:color="@color/yellow_dark" />

<corners
    android:bottomLeftRadius="20dp"
    android:bottomRightRadius="20dp"
    android:topLeftRadius="20dp"
    android:topRightRadius="20dp" />

现在在 res/color/btn_selector_yellow.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 android:drawable="@color/yellow" android:state_focused="true" android:state_pressed="false"/>
    <item android:drawable="@drawable/bg_yellow_dark_round" android:state_pressed="true"/>
    <item android:drawable="@drawable/bg_yellow_round"/>

</selector>

现在按照以下方式将其设置为您的按钮

<Button
                android:id="@+id/button1"
                android:layout_width="248dp"
                android:layout_height="44dp"
                android:layout_gravity="center_horizontal"
                android:layout_marginBottom="10dp"
                android:layout_marginTop="20dp"
                android:background="@color/btn_selector_yellow"
                android:text="AZ_ is so cool" />

现在这将会从light yellow进行过渡

dark yellow.


这个可以用,你能指导如何实现涟漪效果吗? - hardik9850
https://developer.android.com/reference/android/graphics/drawable/RippleDrawable.html - AZ_

13

shape.xml

<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="@color/star_off"/>
    <corners android:radius="5dp"/>
    <padding android:left="0dp" android:top="0dp" android:right="0dp" android:bottom="0dp" />
</shape>

选择器.xml

<selector xmlns:android="http://schemas.android.com/apk/res/android" android:exitFadeDuration="@android:integer/config_mediumAnimTime">

    <item android:drawable="@color/tab_focused" android:state_focused="true" android:state_pressed="false"/>
    <item android:drawable="@color/tab_pressed" android:state_pressed="true"/>
    <item android:drawable="@drawable/shape"/>

</selector>

1
请使用@drawable/shape而不是@drawable/shape.xml。 - Khizar Hayat

7
您还可以创建一个内部使用选择器的形状。如果您的形状仅在不同状态下更改其颜色,则这样做会更加清晰。 color/color_selector.xml
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:color="@color/blue_dark" android:state_pressed="true" />
    <item android:color="@color/blue_light" />
</selector>

drawable/shape.xml

<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="@color/color_selector" />
    <corners android:bottomLeftRadius="6dip" android:bottomRightRadius="6dp" />
    <padding android:bottom="0dip" android:left="0dip" android:right="0dip" android:top="0dip" />
</shape>

这对我不起作用,颜色选择器从未被使用...尽管我同意它更简洁。 - Gyome
@Gyome,它正在工作。请查看此链接https://dev59.com/y3M_5IYBdhLWcg3wzmnL - Ji Fang
3
我知道这已经有些过时了,但仅供参考,这种方法只适用于Android 5.0及以上版本。 - lionscribe

4

虽然已经太晚了,但这里有一个已解决的例子。

 <TextView
            android:id="@+id/txt_out_going_calls"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="04dp"
            android:layout_weight="1"
            android:background="@drawable/header_text_view_selector"
            android:gravity="center"
            android:text="@string/outgoing_calls_tab_button_text"
            android:textColor="@color/home_text_color" />

我的 header_text_view_selector

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

        <shape xmlns:android="http://schemas.android.com/apk/res/android">
            <solid android:color="@color/home_fragment_tab_color_selected"/>
            <corners android:radius="25dip" />
            <padding android:bottom="08dip" android:left="9dip" android:right="9dip" android:top="08dip" />
        </shape>
    </item>
    <item android:state_selected="false">

        <shape>
            <solid android:color="@color/home_fragment_tab_color_simple"/>
            <corners android:radius="25dip" />
            <padding android:bottom="08dip" android:left="9dip" android:right="9dip" android:top="08dip" />
        </shape>
    </item>
</selector>

简单来说,我正在创建一个带有选择器的圆形 textview。 在这里,我仅处理state_selectednot_selected。希望它有所帮助。


3
这是我的方法,它很有效!
<item android:state_pressed="true">

    <shape android:shape="oval">


        <gradient android:centerX=".6"
            android:centerY=".40"
            android:endColor="@color/colorPrimary"
            android:gradientRadius="20"
            android:startColor="@color/colorPrimary"
            android:type="radial" />

        <stroke android:width="1dp"
            android:color="#FFFFFF" />

        <size android:width="55dp"
            android:height="55dp" />

    </shape>
</item>

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


        <gradient android:centerX=".6"
            android:centerY=".40"
            android:endColor="@android:color/transparent"
            android:gradientRadius="20"
            android:startColor="@android:color/transparent"
            android:type="radial" />

        <stroke android:width="1dp"
            android:color="#FFFFFF" />

        <size android:width="55dp"
            android:height="55dp" />

    </shape>
</item>


2

我的例子是一个带有state_pressed状态的圆形按钮。 以下是代码:

<?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">
            <solid android:color="@color/light_primary_color" />
        </shape>

    </item>
    <item>
        <shape android:shape="oval">
            <solid android:color="@color/accent_color" />
        </shape>
    </item>

</selector>

0

使用形状名称就像使用任何图像一样,并使用它的选择器就像使用图像选择器一样。尝试一下,您不会遇到任何问题。这是您所询问的内容吗?


2
将您的形状 XML 放入 drawable 文件夹中,并在选择器中传递 android:drawable="@drawable/shape_xml",然后在视图中使用您的选择器。 - Vineet Shukla
1
请使用代码片段更好地编写您的示例。 - Roy Lee

-1
为了更具可重用性,您可以在单个属性上设置状态。避免复制您的形状
<selector
    xmlns:android="http://schemas.android.com/apk/res/android"
>
    <item>
        <shape android:shape="rectangle" >
            <corners android:radius="5dp"/>
            <solid
                android:state_enabled="false"
                android:color="@color/transparent"
            />
            <solid
                android:state_enabled="true"
                android:color="@color/background"
            />
            <stroke
                android:width="@dimen/dividerHeight"
                android:color="@color/dividerLight"
            />
        </shape>
    </item>
</selector>

我能够使用这种方法在禁用后编程设置背景。


这似乎不起作用。我认为选择器必须具有多个子项,并且必须在每个项目上设置状态。 - bmaupin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接