StateListDrawable 动态更换背景

系统中默认的按钮被按下的颜色和未点击时的颜色不一样,该种实现可以用Java代码和XML实现。

Java代码实现(通过StateListDrawable)

okBtn.setBackgroundDrawable(addStateDrawable(this, R.drawable.btn_normal, R.drawable.btn_    selected, R.drawable.btn_selected));  
cancelBtn.setBackgroundDrawable(addStateDrawable(this, R.drawable.btn_normal, R.drawable.    btn_selected, R.drawable.btn_selected)); 

private StateListDrawable addStateDrawable(Context context,  int idNormal, int idPressed,     int idFocused) {  
     StateListDrawable sd = new StateListDrawable();
       
     Drawable normal = idNormal == -1 ? null : context.getResources().getDrawable(idNormal)
     Drawable press(略);Drawable focus(略);
     //注意该处的顺序,只要有一个状态与之相配,背景就会被换掉  
     //所以不要把大范围放在前面了,如果sd.addState(new[]{},normal)放在第一个的话,就没有q       什么效果了
     sd.addState(new int[]{android.R.attr.state_enabled, android.R.attr.state_focused}, focus);  
     sd.addState(new int[]{android.R.attr.state_pressed, android.R.attr.state_enabled}, pressed);  
        sd.addState(new int[]{android.R.attr.state_focused}, focus);  
        sd.addState(new int[]{android.R.attr.state_pressed}, pressed);  
        sd.addState(new int[]{android.R.attr.state_enabled}, normal);  
        sd.addState(new int[]{}, normal);  
        return sd;  
    }

xml方式实现时,可以先了解下对应xml的语法

    <?xml version="1.0" encoding="utf-8"?>  
      
    <selector xmlns:android="http://schemas.android.com/apk/res/android"  
    android:constantSize=["true" | "false"]  
    android:dither=["true" | "false"]  
    android:variablePadding=["true" | "false"] >  
      
    <item  
    android:drawable="@[package:]drawable/drawable_resource"  
    android:state_pressed=["true" | "false"]  
    android:state_focused=["true" | "false"]  
    android:state_selected=["true" | "false"]  
    android:state_active=["true" | "false"]  
    android:state_checkable=["true" | "false"]  
    android:state_checked=["true" | "false"]  
    android:state_enabled=["true" | "false"]  
    android:state_window_focused=["true" | "false"] />  
      
    </selector>
时间: 2024-08-01 22:42:48

StateListDrawable 动态更换背景的相关文章

利用StateListDrawable给button动态设置背景

项目中,遇到相同样式的Button,只是stroke颜色不一样.为了实现一个,就得写两个shape文件,一个selector文件:多个还得重复写. 解决方法: 结合StateListDrawable给button动态设置背景 public void initButton() { GradientDrawable fDrawable = (GradientDrawable) getResources().getDrawable(R.drawable.circle_button); fDrawabl

Android中View(视图)绘制不同状态背景图片原理深入分析以及StateListDrawable使用详解

今天继续给大家分享下View的相关知识,重点有一下两点:   1.View的几种不同状态属性            2.如何根据不同状态去切换我们的背景图片. 开篇介绍:android背景选择器selector用法汇总 对Android开发有经验的同学,对 <selector>节点的使用一定很熟悉,该节点的作用就是定义一组状态资源图片,使其能够 在不同的状态下更换某个View的背景图片.例如,如下的hello_selection.xml文件定义: <?xml version="

StateListDrawable与GradientDrawable 的运用

在Android开发中,我们时常会用到自定义drawable样式,在drawable中设置shape样式或是selector选择器,但是有时如果一个xml中需要用到多个drawable样式,并且里面设置的样式只是有细微的差别改变,那么自定义多个drawable样式会显得比较臃肿,使得drawable的xml文件太多,管理麻烦,所以有时A字兔君觉得可以在代码中创建drawable. /**     * 设置背景选择器     *     * @param pressedDraw     * @pa

android中ColorStateList及StateListDrawable设置Selector

写过android的代码相信大家对Selector并不陌生吧,下面来看看这段xml文件是如何定义的 <?xml version="1.0" encoding="utf-8" ?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <!-- 触摸时并且当前窗口处于交互状态 --> <item android:state

Android自定义View系列之动态变化的Button

我的微信公众号: 如果你喜欢我的文章,欢迎关注我的微信公众号. 今天给大家介绍的是一款可以动态变化的按钮,如矩形变为圆形.圆形变为矩形.矩形先变为进度条然后再变为圆形,我们还是先看看效果图吧. 第一个按钮由矩形变为圆角矩形. 第二个按钮由矩形变为圆形. 第三个按钮由矩形变为进度条,进度条结束后变为圆形. 在此声明一下,效果实现我这里并非原创,我也是在github上面看到此效果,然后阅读源码,觉得不错,就通过自己的理解把此效果自己也实现了一下. 此控件的特效主要是形状的动态变换,比如背景色,宽度和

Android 中使用代码动态布局

Android 中使用代码动态布局 本文介绍在android中使用代码动态布局,有时候根据不同的需求,比如需要根据服务器上的条目个数来决定app中页面布局控件(显示个数,图标等).此处介绍通过java代码进行动态布局. 一.效果图: 图片随便找的,将就将就吧 二.给出xml文件布局 <?xml version="1.0" encoding="utf-8"?> <ScrollView xmlns:android="http://schema

EditText自定义边框背景与动态检测用户输入

一.EditText自定义边框背景 1.效果演示 2.代码实现 (1)res/drawable/shape_edit_normal.xml 功能:编辑框没获得焦点时,使用该shape.<shape.../>为根元素的ShapeDrawable资源,主要用于定义一个基本的几何图形,如矩形.圆形.线条等. <solid.../>子元素用于指定填充集合图形的的颜色: <corners.../>子元素用于定义几个图形的四个角的弧度: <gradient../>子元素

Android动态生成按钮样式

动态生成按钮样式 使用: int borderColor = Color.parseColor("#2E3135"); int bgColor = Color.parseColor("#00FF00"); // 设置View背景样式,有边框宽度.边框颜色.圆角度数.背景颜色. GradientDrawable shape = DrawableUtils.createShape(1, 4, borderColor, bgColor); btn1.setBackgrou

c语言动态链表的创建

创建动态连链表就是将一个个节点连接起来 (1)动态生成节点 (2)输入节点数据 (3)将节点链在一起 例: typedef struct Data { char num[20]; char name[10]; char sex; float english; float chinese; float math; }; typedef struct Node { struct Data data;//结构体类型//结构体嵌套 struct Node* next;//结构体指针型 }node,*Pn