安卓开发 StateListDrawable 应用
基础部份 StateListDrawable
安卓开发中,如果要做一个按扭按下改变背景,或获取焦点改变背景,最简单的方法是利用将背景指向一个资源,然后果在资源中配置事件,总共分为三步,
1) 创建一个布局文件,例如
内容如下:
1 2 3 4 5 | <Button android:layout_width= "wrap_content" android:layout_height= "wrap_content" android:background= "@drawable/selector_button" android:text= "Button" |
2)编写xml 文件
创建一个drawable文件,例如 selector_button.xml
,内容如下:(红色部份指定一个图片资源文件)这儿指定了三种状态,
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true" android:drawable="@drawable/button_pressed" />
<item android:state_focused="true" android:drawable="@drawable/button_focused" />
<item android:drawable="@drawable/button_normal" />
</selector>
附,drawable 文件示例:这个文件是上面红包部份的指定文件用,这只是示例,说明这是一个样式文件,或图片资源
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#FF0000" />
</shape>
通过 android:background
属性将资源对应到Button上。通过这种方式,当Button处于不同状态时,会根据定义的规则选择正确的背景图像进行显示。你可以根据自己的需求,定义不同状态下的图片或背景,并在布局文件中使用来实现不同状态下的图像切换效果。这种资源指定叫 StateListDrawable
其它使用的属性包括如下:
在StateListDrawable中,我们可以在每个 <item>标签中配置以下属性:
android:drawable:必须属性,用于指定当前控件在该状态下显示的Drawable资源。
android:state_pressed:布尔值,表示用户点击或触摸控件时的状态。默认为false。
android:state_focused:布尔值,表示当前控件获得焦点时的状态。默认为false。
android:state_hovered:布尔值,表示光标移到当前控件上方时的状态。默认为false。
android:state_selected:布尔值,表示当前控件被选择的状态,如在下拉列表中使用方向键选择一项。默认为false。
android:state_checkable:布尔值,表示当前控件可被勾选的状态,仅在控件具有可勾选和不可勾选状态之间切换时有效。
android:state_checked:布尔值,表示当前控件处于被勾选(checked)的状态。
android:state_enabled:布尔值,表示当前控件处于可用的状态,即可以被点击。默认为true。
android:state_activated:布尔值,表示当前控件被激活的状态。
android:state_window_focused:布尔值,表示当前控件所在的应用窗口获得焦点的状态。
通过在 <item>标签中配置这些属性,我们可以定义不同状态下控件要显示的Drawable资源,以实现状态切换时的样式变化。
示例一
其中<item android:drawable="@android:color/holo_blue_light"/> 要写在下面一行,如果不这样写那么要在这一行,
加上加一个属性 android:state_pressed="false"/> 完整 Drawable文件 selector 内容如下“
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@android:color/holo_blue_light" android:state_pressed="false" /> //参考代码
<item android:drawable="@android:color/holo_red_dark" android:state_pressed="true" />
<item android:drawable="@android:color/holo_blue_light" /> //这句要在下面,如果不这样,需要加上android:state_pressed="false" ,参与上面红色代码部份
</selector>
对于item项 可以不指定文件,直接给颜色值 <item android:drawable="@color/btn_color_default" /> 但是这要用用文件的值,不能直接给值,安卓规范
布局文件如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<Button
android:layout_width="match_parent"
android:layout_height="50dp"
android:background="@drawable/bg_login"
android:text="登录" />
</LinearLayout>
自定义样式文件可以如下,文件名 引用在资源文件,
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:radius="10dp" />
<solid android:color="#00f" />
<stroke
android:width="1dp"
android:color="#0f0" />
</shape>
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端