Android小技巧——Selector用法

Selector生效问题

在做Android UI的时候,Selector是必不可少的,下面说一下使用selector其中一个小技巧
昨天有个小伙伴来问我,你看我明明给这个TextView设置了background,为什么不生效呢?先来看看他是怎样写的:

 <TextView
     android:background="@drawable/tv_background"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"/>
  

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

代码很简单,就是当正常状态下,显示shape_normal样式,当TextView被点击时使用shape_press样式,乍一看,好像没有任何问题,但为什么就不能生效呢?这里必须要说的是selector的匹配规则。

匹配规则
给一个view的某个属性设置selector时候,selector的匹配规则是从上往下匹配,当匹配到第一个符合当前状态的item就返回。

所以前面问题的原因很明显了,当代码执行的时候,即使TextView处于press状态,但它也属于正常状态下的一种,所以在第一个就匹配成功了,当然就不会匹配到下面的shape_press样式了。所以如果需要有个press态,调一下item顺序即可。

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

所以,建议每个Android程序员朋友,当使用selector的时候,尽量的把默认的item放在最后,这样就不会产生这样的问题了。

Selector中直接包含shape

很多小伙伴写一些背景圆角的按钮时候,并且有按住和释放时候的状态,往往要写一个selector xml和两个shape drawable xml文件,其实可以直接在selector包含shape,如下


<selector xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
    <item android:state_selected="true">
        <shape android:shape="rectangle">
            <corners android:topRightRadius="10dp">corners>
            <solid android:color="@color/black_transparent_70">solid>
        shape>
    item>
    <item>
        <shape android:shape="rectangle">
            <corners android:topRightRadius="10dp">corners>
            <solid android:color="@color/black_transparent_60">solid>
        shape>
    item>
selector>

Selector设置图像透明度

有时候产品需要在获取焦点,或者按住的时候设置图片的透明度,这个可以采用Selector加上bitmap标签即可实现:


<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true">
        <bitmap android:src="@drawable/ic_category_none" android:alpha="0.5">bitmap>
    item>
    <item android:drawable="@drawable/ic_category_none">item>
selector>

你可能感兴趣的:(android-实用技巧)