selector的巧用
selector一般都是在backgroup中使用,可以是button、imageview的backgroup,下面来看看有哪些可以实现的效果
1、一张图片实现点击变暗,松开变亮的效果
<!--?xml version="1.0" encoding="utf-8"?-->
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true">
<layer-list>
<item android:drawable="@drawable/test" />
<item>
<shape android:shape="oval" >
<solid android:color="#51000000" />
</shape>
</item>
</layer-list>
</item>
<item android:drawable="@drawable/test" />
</selector>
2、一张图片实现点击变小,松开变大的效果
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true">
<layer-list>
<item android:drawable="@drawable/test"
android:top="3dp"
android:bottom="3dp"
android:left="3dp"
android:right="3dp"/>
</layer-list>
</item>
<item android:drawable="@drawable/test" />
</selector>
3、背景半透明,圆角
shape_card.xml,直接在backgroup里面使用就可以
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 设置圆角半径 -->
<corners android:radius="10dp" />
<!-- 设置半透明 -->
<solid android:color="#33DCDCDC" />
</shape>
设置半透明示例:
<solid android:color="#88ffffff" />
5、动态的给button(其他控件)添加selector
- 动态在button中添加backgroup的selector,使得按下按钮换图片
/**
* 动态在button中添加backgroup的selector,使得按下按钮换图片
* @param context 调用方法的 Activity
* @param idNormal 默认图片的 id
* @param idPress 点击图片的 id
* @param button 点击的 view
*/
fun addSelectorFromDrawable(
context: Context,
idNormal: Int,
idPress: Int,
button: Button
) {
val drawable = StateListDrawable()
val normal: Drawable? = getDrawable(idNormal)
val press: Drawable? = getDrawable(idPress)
// val normal: Drawable = context.getResources().getDrawable(idNormal)//旧版写法
// val press: Drawable = context.getResources().getDrawable(idPress)//旧版写法
drawable.addState(intArrayOf(android.R.attr.state_pressed), press)//按下
drawable.addState(intArrayOf(-android.R.attr.state_pressed), normal)//松开
// button.setBackgroundDrawable(drawable)//旧版写法
button.background=drawable
}
以上代码改成静态写法为:
selector_1.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@mipmap/shoes" android:state_pressed="false" />
<item android:drawable="@mipmap/shoes_press" android:state_pressed="true" />
</selector>
- 动态在button中添加backgroup,使得选中之后 按钮换图片(动态修改selector)
/**
* 动态在button中添加backgroup,使得选中之后 按钮换图片(动态修改selector)
* @param context 调用方法的 Activity
* @param idNormal 默认图片的 id
* @param idPress 点击图片的 id
* @param button 点击的 view
*/
fun addSelectorCheck(
context: Context,
idNormal: Int,
idPress: Int,
button: Button
) {//这里可以换其他的控件
val drawable = StateListDrawable()
val normal: Drawable? = getDrawable(idNormal)
val press: Drawable? = getDrawable(idPress)
// val normal: Drawable = context.getResources().getDrawable(idNormal)//旧版写法
// val press: Drawable = context.getResources().getDrawable(idPress)//旧版写法
drawable.addState(intArrayOf(android.R.attr.state_checked), press)//选中(这里可以改成其他属性)
drawable.addState(intArrayOf(-android.R.attr.state_checked), normal)//未选中
// button.setBackgroundDrawable(drawable)//旧版写法
button.background=drawable
}
以上代码改成静态写法为:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@mipmap/shoes" android:state_checked="false" />
<item android:drawable="@mipmap/shoes_press" android:state_checked="true" />
</selector>