当前位置:

首页 > 系统应用 > 8.1.3 Android中的13种Drawable小结 Part 3

8.1.3 Android中的13种Drawable小结 Part 3

Android Studio macOS版
Android Studio macOS版

Android Studio 是 Google 面向安卓应用开发提供的官方集成开发环境,基于 IntelliJ IDEA 构建。它整合智能代码编辑、Gradle 构建、界面预览、设备模拟、性能分析、调试测试及 APK 分析等工具。

立即下载
Mac 2026-10-13
数据库 编程开发 服务器管理 集成开发环境

本节引言: 本节我们来把剩下的四种Drawable也学完,他们分别是: LayerDrawable,TransitionDrawable,LevelListDrawable和StateListDrawable, 依旧贴下13种Drawable的导图: 1.LayerDrawable 它本质上是一种分

本文目录

    本节引言:

    本节我们来把剩下的四种Drawable也学完,他们分别是: LayerDrawable,TransitionDrawable,LevelListDrawable和StateListDrawable, 依旧贴下13种Drawable的导图:

    1.LayerDrawable

    它本质上是一种分层图形对象,内部维护着一个Drawable数组,绘制时会严格按照数组里的顺序依次完成。索引值越大的Drawable,越会显示在更上面。即便这些Drawable之间存在交叉或重叠区域,也因为处在不同图层中,彼此不会互相干扰;使用时,需要以<layer-list>作为根节点!

    相关属性如下:

    • drawable:引用的位图资源,如果为空徐璈有一个Drawable类型的子节点
    • left:层相对于容器的左边距
    • right:层相对于容器的右边距
    • top:层相对于容器的上边距
    • bottom:层相对于容器的下边距
    • id:层的id

    使用示例:

    运行效果图:

    代码实现:

    非常简单,结合前面学习的shapeDrawable和ClipDrawable:

    layerList_one.xml

    
    
        
            
                
                
            
        
        
            
                
                    
                    
                
            
        
     

    然后在布局文件中添加一个Seekbar,内容如下:

    卧槽,没了?对的,就是这么点东西~说了是层图形对象,我们还可以弄个层叠图片的效果:

    运行效果图:

    实现代码:

    层叠图片的layerlist_two.xml:

    
    
        
            
        
        
            
        
        
            
        
     

    然后在activity_main.xml里加个ImageView,内容如下:

    简单好用,还等什么,快快应用到你的项目中吧~

    2.TransitionDrawable

    作为LayerDrawable的一个子类,TransitionDrawable干的事其实很专一:它只负责管理两层Drawable,只有两层,不能再多。它自带透明度渐变动画,因此可以把一层Drawable自然地过渡到另一层Drawable,形成切换效果。它的根节点是<transition>,这里要特别注意,里面只能放两个Item,放多了也不起作用。整体属性和LayerDrawable大体一致;真正要让这两层动起来,还得主动调用startTransition方法来启动切换动画;如果想反向播放,则可以调用reverseTransition()方法:

    使用示例:

    运行效果图:

    实现代码:

    在res/drawable创建一个TransitionDrawable的xml文件

    
    
        
        
    

    然后布局文件里加个ImageView,然后把src设置成上面的这个drawable 然后MainActivity.ja va内容如下:

    public class MainActivity extends AppCompatActivity {
        private ImageView img_show;
        @Override
        protected void onCreate(Bundle sa vedInstanceState) {
            super.onCreate(sa vedInstanceState);
            setContentView(R.layout.activity_main);
            img_show = (ImageView) findViewById(R.id.img_show);
            TransitionDrawable td = (TransitionDrawable) img_show.getDrawable();
            td.startTransition(3000);
            //你可以可以反过来播放,使用reverseTransition即可~
            //td.reverseTransition(3000);
        }
    }

    另外,如果你想实现:多张图片循环的淡入淡出的效果 可参考:Android Drawable Resource学习(七)、TransitionDrawable中的示例 很简单,核心原理就是:handler定时修改Transition中两个图片!

    3.LevelListDrawable

    用来管理一组Drawable的,我们可以为里面的drawable设置不同的level, 当他们绘制的时候,会根据level属性值获取对应的drawable绘制到画布上,根节点 为:<level-list>他并没有可以设置的属性,我们能做的只是设置每个<item> 的属性!

    item可供设置的属性如下:

    • drawable:引用的位图资源,如果为空徐璈有一个Drawable类型的子节点
    • minlevel:level对应的最小值
    • maxlevel:level对应的最大值

    使用示例:

    运行效果图:

    代码实现:

    通过shapeDrawable画圆,一式五份,改下宽高即可:

    shape_cir1.xml:

    
    
        
        
    

    接着到LevelListDrawable,这里我们设置五层:

    level_cir.xml:

    
    
        
        
        
        
        
     

    最后MainActivity写如下代码:

    public class MainActivity extends AppCompatActivity {
    private ImageView img_show;
    private LevelListDrawable ld;
        private Handler handler = new Handler() {
            public void handleMessage(Message msg) {
                if (msg.what == 0x123) {
                    if (ld.getLevel() > 10000) ld.setLevel(0);
                    img_show.setImageLevel(ld.getLevel() + 2000);
                }
            }
        };
    @Override
        protected void onCreate(Bundle sa vedInstanceState) {
            super.onCreate(sa vedInstanceState);
            setContentView(R.layout.activity_main);
            img_show = (ImageView) findViewById(R.id.img_show);
            ld = (LevelListDrawable) img_show.getDrawable();
            img_show.setImageLevel(0);
            new Timer().schedule(new TimerTask() {
                @Override
                public void run() {
                    handler.sendEmptyMessage(0x123);
                }
            }, 0, 100);
        }
    }

    也很简单,一个Timer定时器,handler修改level值~

    4.StateListDrawable

    好了终于迎来了最后一个drawable:StateListDrawable,这个名字看上去模式,其实我们 以前就用到了,还记得为按钮设置不同状态的drawable的<selctor>吗?没错,用到的 就是这个StateListDrawable!

    可供设置的属性如下:

    • drawable:引用的Drawable位图,我们可以把他放到最前面,就表示组件的正常状态~
    • state_focused:是否获得焦点
    • state_window_focused:是否获得窗口焦点
    • state_enabled:控件是否可用
    • state_checkable:控件可否被勾选,eg:checkbox
    • state_checked:控件是否被勾选
    • state_selected:控件是否被选择,针对有滚轮的情况
    • state_pressed:控件是否被按下
    • state_active:控件是否处于活动状态,eg:slidingTab
    • state_single:控件包含多个子控件时,确定是否只显示一个子控件
    • state_first:控件包含多个子控件时,确定第一个子控件是否处于显示状态
    • state_middle:控件包含多个子控件时,确定中间一个子控件是否处于显示状态
    • state_last:控件包含多个子控件时,确定最后一个子控件是否处于显示状态

    使用示例:

    那就来写个简单的圆角按钮吧!

    运行效果图:

    代码实现:

    那就先通过shapeDrawable来画两个圆角矩形,只是颜色不一样而已:

    shape_btn_normal.xml:

    
    
        
        
        
    

    接着我们来写个selctor:selctor_btn.xml:

    
    
        
        
    

    然后按钮设置android:background="@drawable/selctor_btn"就可以了~ 你可以根据自己需求改成矩形或者椭圆,圆形等!

    本节小结:

    好的,关于Android中的13种不同类型的Drawable已经讲解完毕了,当然,这只是基础,实际 开发中肯定还有各种高逼格的用法,这就要靠大家去扩展了,这里只是给大家一个引导!

    嗯,时间关系,上述的例子都是一个个试的,所以最后的demo乱七八糟哈,可能 你对这些素材又需要,还是贴下,有需要的自行下载:DrawableDemo.zip 嗯,谢谢~祝周末愉快

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    系统应用 Android
    相关文章 更多
    Ducter 0.0.44:Android新增“用这台手机”,敏感动作逐次确认
    Ducter 0.0.44:Android新增“用这台手机”,敏感动作逐次确认

    Ducter 0.0.44在Android设备卡加入“用这台手机”,提供设置引导和占用提示。每次借用手机均需确认,发送、付款与删除等待用户Go;官方说明银行、钱包、密码和身份验证器应用不在可操作范围,iPhone不支持此路径。

    作业帮APP下载_安卓苹果官方正版链接
    作业帮APP下载_安卓苹果官方正版链接

    作业帮安卓下载可从https://oia.zybang.com/download/进入,苹果官方应用ID为803781859。先核对系统,再检查主APP名称及广州极目未来文化科技有限公司,并查看设备兼容性;家长版、口算和直播课应使用各自安装渠道。

    WPS移动版表格文字怎么自动换行并对齐
    WPS移动版表格文字怎么自动换行并对齐

    WPS移动版表格可从单元格格式进入对齐页,开启自动换行并设置水平、垂直对齐。本文说明选区、行高、列宽和合并单元格的影响,以及保存后如何检查长文字是否完整显示。

    手机WPS怎么把多张图片合并成一个PDF文档
    手机WPS怎么把多张图片合并成一个PDF文档

    手机WPS可通过“图片转PDF”一次选择多张照片,检查页序、方向和版式后,选择保存位置并输出为一个多页PDF。服务页搜索和旧版应用页入口不同,保存前应核对合并方式及当前账号权益,生成后重新打开确认页数和内容完整。

    一文看懂灵活计算器手机端和电脑端的使用区别
    一文看懂灵活计算器手机端和电脑端的使用区别

    想知道灵活计算器在手机和电脑上怎么用最高效?本文详解两端在输入节奏、布局整理及账号同步上的核心区别,助你避免数据丢失,建立顺畅的跨设备记账习惯。

    Android安装包无法打开?灵活计算器APK安装排查指南
    Android安装包无法打开?灵活计算器APK安装排查指南

    遇到灵活计算器APK无法打开或解析错误?本文详解Android侧载安装的排查逻辑,涵盖来源验证、权限配置、空间清理及旧版本冲突处理,帮助用户安全解决安装问题并正确恢复会员权益。

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。

    即将离开本站
    您即将前往第三方网站,请确认是否继续?