Selector生效问题
在做Android UI的时候,Selector是必不可少的,下面说一下使用selector其中一个小技巧
昨天有个小伙伴来问我,你看我明明给这个TextView设置了background,为什么不生效呢?先来看看他是怎样写的:
<TextView
android:background="@drawable/tv_background"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<?xml version="1.0" encoding="utf-8"?>
//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,如下
<?xml version="1.0" encoding="utf-8"?>
<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标签即可实现:
<?xml version="1.0" encoding="utf-8"?>
<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>