当前位置:

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

8.1.2 Android中的13种Drawable小结 Part 2

本文目录

    本节引言: 这一节接着往下看 Android 里的 Drawable 资源。上一节已经过了一遍: ColorDrawable;NinePatchDrawable; ShapeDrawable;GradientDrawable!也就是这四种 Drawable。 接下来要继续展开另外五个 Drawabl

    本节引言:

    这一节接着往下看 Android 里的 Drawable 资源。上一节已经过了一遍:
    ColorDrawable;
    NinePatchDrawable;
    ShapeDrawable;
    GradientDrawable!
    也就是这四种 Drawable。
    接下来要继续展开另外五个 Drawable,分别是:
    BitmapDrawable;
    InsertDrawable;
    ClipDrawable;
    RotateDrawable;
    AnimationDrawable!
    老规矩,先把这 13 种 Drawable 的导图贴出来:

    好的,开始本节内容~

    1.BitmapDrawable

    对Bitmap的一种封装,可以设置它包装的bitmap在BitmapDrawable区域中的绘制方式,有: 平铺填充,拉伸填或保持图片原始大小!以<bitmap>为根节点! 可选属性如下:

    • src:图片资源~
    • antialias:是否支持抗锯齿
    • filter:是否支持位图过滤,支持的话可以是图批判显示时比较光滑
    • dither:是否对位图进行抖动处理
    • gra vity:若位图比容器小,可以设置位图在容器中的相对位置
    • tileMode:指定图片平铺填充容器的模式,设置这个的话,gra vity属性会被忽略,有以下可选值: disabled(整个图案拉伸平铺),clamp(原图大小), repeat(平铺),mirror(镜像平铺)

    对应的效果图:

    ①XML定义BitmapDrawable:

      
    

    ②实现相同效果的Ja va代码:

    BitmapDrawable bitDrawable = new BitmapDrawable(bitmap);  
    bitDrawable.setDither(true);  
    bitDrawable.setTileModeXY(TileMode.MIRROR,TileMode.MIRROR);  

    2.InsetDrawable

    表示把一个Drawable嵌入到另外一个Drawable的内部,并且在内部留一些间距, 类似与Drawable的padding属性,但padding表示的是Drawable的内容与Drawable本身的边距! 而InsetDrawable表示的是两个Drawable与容器之间的边距,当控件需要的背景比实际的边框 小的时候,比较适合使用InsetDrawable,比如使用这个可以解决我们自定义Dialog与屏幕之间 的一个间距问题,相信做过的朋友都知道,即使我们设置了layout_margin的话也是没用的,这个 时候就可以用到这个InsetDrawable了!只需为InsetDrawable设置一个insetXxx设置不同 方向的边距,然后为设置为Dialog的背景即可!

    相关属性如下:

    • 1.drawable:引用的Drawable,如果为空,必须有一个Drawable类型的子节点!
    • 2.visible:设置Drawable是否额空间
    • 3.insetLeft,insetRight,insetTop,insetBottm:设置左右上下的边距

    ①XML中使用:

      
     

    在Ja va代码中使用:

    InsetDrawable insetDrawable = new InsetDrawable(getResources()  
            .getDrawable(R.drawable.test1), 10, 10, 10, 10); 

    使用效果图:

    3.ClipDrawable

    Clip可以译为剪的意思,我们可以把ClipDrawable理解为从位图上剪下一个部分; Android中的进度条就是使用ClipDrawable来实现的,他根据设置level的值来决定剪切 区域的大小,根节点是<clip>

    相关属性如下:

    • clipOrietntion:设置剪切的方向,可以设置水平和竖直2个方向
    • gra vity:从那个位置开始裁剪
    • drawable:引用的drawable资源,为空的话需要有一个Drawable类型的子节点 ps:这个Drawable类型的子节点:就是在加上这样的语句: 这样...

    使用示例:

    核心:通过代码修改ClipDrawable的level的值!Level的值是0~10000!

    运行效果图:

    代码实现:

    ①定义一个ClipDrawable的资源xml:

    
     

    ②在activity_main主布局文件中设置一个ImageView,将src设置为clipDrawable! 记住是src哦,如果你写成了blackground的话可是会报空指针的哦!!!!

    
    
      

    ③MainActivity.ja va通过setLevel设置截取区域大小:

    public class MainActivity extends AppCompatActivity {
    private ImageView img_show;
        private ClipDrawable cd;
        private Handler handler = new Handler() {
            @Override
            public void handleMessage(Message msg) {
                if (msg.what == 0x123) {
                    cd.setLevel(cd.getLevel() + 500);
                }
            }
        };
    @Override
        protected void onCreate(Bundle sa vedInstanceState) {
            super.onCreate(sa vedInstanceState);
            setContentView(R.layout.activity_main);
            img_show = (ImageView) findViewById(R.id.img_show);
            // 核心实现代码
            cd = (ClipDrawable) img_show.getDrawable();
            final Timer timer = new Timer();
            timer.schedule(new TimerTask() {
                @Override
                public void run() {
                    handler.sendEmptyMessage(0x123);
                    if (cd.getLevel() >= 10000) {
                        timer.cancel();
                    }
                }
            }, 0, 300);
        }
    }

    好的,有点意思,妹子图别问我拿,百度上一堆哈~

    4.RotateDrawable

    用来对Drawable进行旋转,也是通过setLevel来控制旋转的,最大值也是:10000

    相关属性如下:

    • fromDegrees:起始的角度,,对应最低的level值,默认为0
    • toDegrees:结束角度,对应最高的level值,默认360
    • pivotX:设置参照点的x坐标,取值为0~1,默认是50%,即0.5
    • pivotY:设置参照点的Y坐标,取值为0~1,默认是50%,即0.5 ps:如果出现旋转图片显示不完全的话可以修改上述两个值解决!
    • drawable:设置位图资源
    • visible:设置drawable是否可见!

    角度图如下:

    使用示例:

    运行效果图:

    代码实现:

    在第三点的clipDrawable上做一点点修改即可!

    ①定义一个rotateDrawable资源文件:

    
      

    ②activity_main.xml中修改下src指向上述drawable即可,MainActivity只需要把ClipDrawable 改成rotateDrawable即可!

    public class MainActivity extends AppCompatActivity {
    private ImageView img_show;
        private RotateDrawable cd;
        private Handler handler = new Handler() {
            @Override
            public void handleMessage(Message msg) {
                if (msg.what == 0x123) {
                    if (cd.getLevel() >= 10000)
                        Toast.makeText(MainActivity.this, "转完了~",
                                Toast.LENGTH_LONG).show();
                    cd.setLevel(cd.getLevel() + 400);
                }
            }
        };
    @Override
        protected void onCreate(Bundle sa vedInstanceState) {
            super.onCreate(sa vedInstanceState);
            setContentView(R.layout.activity_main);
            img_show = (ImageView) findViewById(R.id.img_show);
            // 核心实现代码
            cd = (RotateDrawable) img_show.getDrawable();
            final Timer timer = new Timer();
            timer.schedule(new TimerTask() {
                @Override
                public void run() {
                    handler.sendEmptyMessage(0x123);
                    if (cd.getLevel() >= 10000) {
                        timer.cancel();
                    }
                }
            }, 0, 100);
        }
    }

    5.AnimationDrawable

    这一节要说的最后一个 Drawable,是 AnimationDrawable。它的作用很直接,就是在 Android 里做帧动画:把一组 Drawable 按照既定顺序一帧一帧播放出来。Android 的动画体系其实相当丰富,传统补间动画也包括平移、缩放等各种效果,不过这里先只聚焦 AnimationDrawable 这种帧动画实现方式。至于 alpha、scale、translate、rotate 这些内容,后面放到动画章节里再展开细讲。

    我们这里使用<animation-list>作为根节点

    相关属性方法:

    oneshot:设置是否循环播放,false为循环播放!!! duration:帧间隔时间,通常我们会设置为300毫秒 我们获得AniamtionDrawable实例后,需要调用它的start()方法播放动画,另外要注意 在OnCreate()方法中调用的话,是没有任何效果的,因为View还没完成初始化,我们可以 用简单的handler来延迟播放动画!当然还有其他的方法,可见下述链接: Android AnimationDrawable运行的几种方式 使用AnimationDrawable来实现帧动画真的是非常方便的~

    使用示例:

    运行效果图:

    代码实现:

    ①先定义一个AnimationDrawable的xml资源文件:

    
    
    
    
        
        
        
        
     

    ②activity_main.xml设置下src,然后MainActivity中:

    public class MainActivity extends AppCompatActivity {
    private ImageView img_show;
        private AnimationDrawable ad;
    @Override
        protected void onCreate(Bundle sa vedInstanceState) {
            super.onCreate(sa vedInstanceState);
            setContentView(R.layout.activity_main);
            img_show = (ImageView) findViewById(R.id.img_show);
            // 核心实现代码
            ad = (AnimationDrawable) img_show.getDrawable();
            Handler handler = new Handler();
            handler.postDelayed(new Runnable() {
                @Override
                public void run() {
                    ad.start();
                }
            }, 300);
        }
    }

    嘿嘿,超简单有木有,以后在一些需要用到帧动画的地方,直接上AnimationDrawable, 当然,只适合于不需要进行控制的帧动画,比如上面这个就是超表下拉刷新时候的进度条素材 做成的一个简单帧动画!根据自己的需求自行拓展~

    本节小结:

    本节又介绍了另外的五个Drawable,很有趣是吧,还不快快将他们应用到你的实际开发当中~ 嘻嘻,就说这么多,谢谢!另外刚刚有读者私信我说以前的文章别删行不行,嗯,这里说下 只删除一些重复的,比如和这个雷同的那几节~当然我也会备份!删除的文章都会备份的~ 所以放心!

    本文内容来源于网友投稿,如有侵权请联系删除。
    作者最新文章
    系统应用 Android
    相关文章 更多
    docker容器自动重启怎么解决 排查原因与修复方法
    docker容器自动重启怎么解决 排查原因与修复方法

    遇到Docker容器频繁自动重启?本文提供从查看容器日志、解读退出代码到配置Restart Policy的完整排查与修复方案,确保服务稳定性。

    Linux设置静态路由命令与永久生效教程
    Linux设置静态路由命令与永久生效教程

    学习如何在Linux中使用命令行添加临时静态路由,并通过修改网络配置文件实现重启后依然有效的永久静态路由设置,涵盖CentOS和Ubuntu的不同配置方法。

    摄像头连接电脑后怎么打开查看实时画面教程
    摄像头连接电脑后怎么打开查看实时画面教程

    摄像头连接电脑后不知如何查看画面?本教程演示如何使用Windows自带的“相机”应用快速调取实时视频流,无需下载额外软件,步骤简单直观,适用于大多数USB及内置摄像头。

    如何在 windows 11 关闭自动关机
    如何在 windows 11 关闭自动关机

    针对 Windows 11 电脑在无人操作时自动关机或重启的问题,本文详解如何通过任务计划程序禁用更新重启任务,并调整电源睡眠策略,从根源解决非预期的自动关机现象。

    android页面跳转屏幕方向改变变量如何解决
    android页面跳转屏幕方向改变变量如何解决

    详解Android应用中处理屏幕旋转导致Activity重建时的变量保存方法,包括使用onSaveInstanceState捆绑包和Jetpack ViewModel架构组件的最佳实践。

    电脑摄像头怎么测试人脸识别功能及效果判断方法
    电脑摄像头怎么测试人脸识别功能及效果判断方法

    详细讲解在Windows电脑上测试摄像头人脸识别功能的步骤,包括开启Windows Hello、录入面部数据、不同环境下的效果验证及常见问题排查,帮助用户确认设备兼容性与识别准确率。

    docker 容器无法启动的配置检查命令及排查方法
    docker 容器无法启动的配置检查命令及排查方法

    当 Docker 容器启动后立即退出时,不要盲目重启。本文详解如何通过 docker logs 查看标准输出错误,利用 docker inspect 检查挂载与网络配置,并修正入口点脚本权限问题,提供一套高效的因果排查流程。

    安卓手机投屏到电脑win10怎么设置教程
    安卓手机投屏到电脑win10怎么设置教程

    详解如何利用Windows 10自带功能将安卓手机画面投射至电脑屏幕,涵盖开启步骤、连接技巧及延迟分析,适合临时演示与多屏协作场景。

    移动硬盘解除加密怎么操作?详细步骤教程
    移动硬盘解除加密怎么操作?详细步骤教程

    详细介绍如何在Windows系统中为移动硬盘解除BitLocker加密,包括解锁驱动器、关闭加密功能及监控解密进度的完整操作流程,帮助用户安全移除数据保护。

    android下载文件夹在哪里打开及查找方法
    android下载文件夹在哪里打开及查找方法

    想知道Android手机的下载文件夹在哪里?本文提供多种简单方法,教你如何通过系统文件管理器、第三方应用或电脑连接,快速定位并打开Download文件夹,轻松管理下载的文件。

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

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

    Windows
    Windows

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

    macOS软件
    macOS软件

    正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

    Mac软件 更多
    photoshop
    photoshop
    Windows、macOS 、 iPad

    Photoshop 2026 是 Adobe 推出的专业图像处理与视觉设计软件,支持 Windows、macOS 和 iPad 等平台,广泛应用于摄影修图、电商设计、平面海报、数字绘画及视觉合成等创作场景。

    Blender
    Blender
    Windows、macOS 和 Linux

    Blender 是一款免费开源、跨平台的专业 3D 创作软件,集建模、动画、渲染、视频编辑与视觉合成等功能于一体,广泛应用于影视动画、游戏设计和建筑可视化等领域。软件支持 Cycles 物理渲染器与 Eevee 实时渲染引擎,并提供多边形建模、骨骼绑定、物理模拟等专业工具。Blender 兼容 Windows、macOS 和 Linux 系统,安装包轻巧、运行流畅,依托活跃的全球开发者社区持续更新,是从初学者到专业创作者都值得选择的正版 3D 创作工具。

    灵活计算器
    灵活计算器
    macOS/iOS/Android

    灵活计算器是一款笔记式算数应用,支持实时计算、动态关联和云端同步功能。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

    WINDOWS 更多
    3dmax(3ds max)
    3dmax(3ds max)
    Windows

    Autodesk 3ds Max 是一款专业的三维建模、动画与渲染软件,广泛应用于建筑可视化、游戏开发、影视动画、广告设计和产品展示等领域。

    photoshop
    photoshop
    Windows、macOS 、 iPad

    Photoshop 2026 是 Adobe 推出的专业图像处理与视觉设计软件,支持 Windows、macOS 和 iPad 等平台,广泛应用于摄影修图、电商设计、平面海报、数字绘画及视觉合成等创作场景。

    Blender
    Blender
    Windows、macOS 和 Linux

    Blender 是一款免费开源、跨平台的专业 3D 创作软件,集建模、动画、渲染、视频编辑与视觉合成等功能于一体,广泛应用于影视动画、游戏设计和建筑可视化等领域。软件支持 Cycles 物理渲染器与 Eevee 实时渲染引擎,并提供多边形建模、骨骼绑定、物理模拟等专业工具。Blender 兼容 Windows、macOS 和 Linux 系统,安装包轻巧、运行流畅,依托活跃的全球开发者社区持续更新,是从初学者到专业创作者都值得选择的正版 3D 创作工具。