Drawable 使用详解 drawabletop
suiw9 2024-10-29 16:43 18 浏览 0 评论
阅读五分钟,每日十点,和您一起终身学习,这里是程序员Android
Drawable 是Android 中图像显示的常用方法。
概念:Drawable是指可在屏幕上绘制的图形,已经通过getDrawable(int)等API检索或者应用到具有 android:drawable 和 android:icon 等属性的其他XML 资源的图形。
本篇文章主要介绍 Android 开发中的部分知识点,通过阅读本篇文章,您将收获以下内容:
- Drawable 分类
- Bitmap 位图 BitmapDrawable
- 可拉伸图(*.9.png) NinePatchDrawable。
- 图层 LayerDrawable
- 不同状态图(选择器) StateListDrawable
- 级别列表 LevelListDrawable
- 转换图像 TransitionDrawable
- 插入可绘制对象
- 剪裁可绘制对象 ClipDrawable
- 缩放可绘制对象 ScaleDrawable
- 形状可绘制对象 ShapeDrawable
- Drawable与 Bitmap 常用方法总结
1.Drawable 简介
继承关系如下:
[java.lang.Object]
?
android.graphics.drawable.Drawable
Drawable 分类如下:
- Bitmap 位图 BitmapDrawable
- 可拉伸图(*.9.png) NinePatchDrawable。
- 图层LayerDrawable
- 不同状态图(选择器) StateListDrawable
- 级别列表LevelListDrawable
- 转换图像 TransitionDrawable
- 插入可绘制对象
- 剪裁可绘制对象 ClipDrawable
- 缩放可绘制对象 ScaleDrawable
- 形状可绘制对象 ShapeDrawable
资源引用:
在 Java中:
R.drawable.filename
在XML 中:
@[package:]drawable/filename
1. Bitmap 位图 BitmapDrawable
位图图像。Android支持以下三种格式的位图文件:.png(首选)、.jpg(可接受)、.gif(不建议)。这些文件保存到 res/drawable/目录中
在构建过程中,可通过aapt工具自动优化位图文件,对图像进行无损压缩。例如,不需要超过 256色的真彩色PNG 可通过调色板转换为 8位 PNG。这样产生的图像质量相同,但所需内存更少。因此请注意,此目录中的图像二进制文件在构建时可能会发生变化。如果您计划将图像解读为比特流以将其转换为位图,请改为将图像放在res/raw/文件夹中,在那里它们不会进行优化
使用方法如下:
1.常规位图
- XML 布局中使用方法
<ImageView android:id="@+id/img_round" android:layout_width="80dp" android:layout_height="80dp" android:src="@drawable/gril" />
- Java 代码中使用方法
getResources().getDrawable(R.drawable.xml_bitmap)
2.XML 位图
- 在XML中创建位图资源文件
注意一下属性使用方法:
- antialias
- 启用、停用抗锯齿
- dither
- 当位图的像素配置与屏幕不同时(例如:RGB 8888位图和 RGB 565屏幕),启用或停用位图抖动。
- filter
- 启用或停用位图过滤。当位图收缩或拉伸以使其外观平滑时使用过滤。
- mipmap
- 启用或停用mipmap提示
5.tileMode
定义平铺模式。当平铺模式启用时,位图会重复。重力在平铺模式启用时将被忽略
xml_bitmap 位图实现
<?xml version="1.0" encoding="utf-8"?> <bitmap xmlns:android="http://schemas.android.com/apk/res/android" android:antialias="true" android:dither="true" android:filter="false" android:gravity="center_vertical|clip_vertical" android:mipMap="true" android:src="@drawable/gril" android:tileMode="repeat" > <!-- antialias 启用、停用抗锯齿 dither 当位图的像素配置与屏幕不同时(例如:ARGB 8888 位图和 RGB 565 屏幕),启用或停用位图抖动。 filter 启用或停用位图过滤。当位图收缩或拉伸以使其外观平滑时使用过滤。 mipmap 启用或停用 mipmap 提示 tileMode 定义平铺模式。当平铺模式启用时,位图会重复。重力在平铺模式启用时将被忽略 --> </bitmap>
- 引用XML位图资源方法
<ImageView android:id="@+id/img_drawable_bitmap" android:layout_width="match_parent" android:layout_height="50dp" android:src="@drawable/xml_bitmap" />
- java 代码实现方法
- java 代码使用位图的方法
2. 可拉伸图(*.9.png) NinePatchDrawable。
NinePatch是一种 PNG 图像,在其中可定义当视图中的内容超出正常图像边界时 Android 缩放的可拉伸区域。此类图像通常指定为至少有一个尺寸设置为 "wrap_content" 的视图的背景,而且当视图扩展以适应内容时,九宫格图像也会扩展以匹配视图的大小。Android 的标准 Button小部件使用的背景就是典型的九宫格图像,其必须拉伸以适应按钮内的文本(或图像)。
- 常规使用方法同其他图片引用方式
- XML .9.png 图片同Bitmap XML的使用方式
<nine-patch xmlns:android="http://schemas.android.com/apk/res/android" android:src="@drawable/main_bg_green" android:dither="false"> </nine-patch>
3. 图层 LayerDrawable
LayerDrawable 是管理其他可绘制对象阵列的可绘制对象。列表中的每个可绘制对象按照列表的顺序绘制,列表中的最后一个可绘制对象绘于顶部。每个可绘制对象由单一 <layer-list>元素内的 <item>元素表示。
<?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android" > <item android:id="@+id/bird001" android:drawable="@drawable/bird0001_risk"> </item> <item android:id="@+id/bird002" android:drawable="@drawable/bird0002_risk" android:left="50dp" android:top="50dp"> </item> <item android:id="@+id/bird003" android:drawable="@drawable/bird0003_risk" android:left="100dp" android:top="100dp"> </item> </layer-list>
4. 不同状态图(选择器) StateListDrawable
StateListDrawable是在 XML中定义的可绘制对象,它根据对象的状态,使用多个不同的图像来表示同一个图形。例如,Button 小部件可以是多种不同状态(按下、聚焦或这两种状态都不是)中的其中一种,而且可以利用状态列表可绘制对象为每种状态提供不同的背景图片。
您可以在 XML 文件中描述状态列表。每个图形由单一 <selector>元素内的 <item>元素表示。每个<item>均使用各种属性来描述应用作可绘制对象的图形的状态。
在每个状态变更期间,将从上到下遍历状态列表,并使用第一个与当前状态匹配的项目 —此选择并非基于“最佳匹配”,而是选择符合状态最低条件的第一个项目。
此方法非常常用,比如状态选择器
- 常规使用方法同其他图片引用方式
- 选择器 XML的使用方式
状态选择器
5. 级别列表 LevelListDrawable
管理大量备选可绘制对象的可绘制对象,每个可绘制对象都分配有最大的备选数量。使用setLevel()设置可绘制对象的级别值会加载级别列表中android:maxLevel 值大于或等于传递到方法的值的可绘制对象资源。
资源引用:
在 Java 中:
R.drawable.filename
在 XML 中:
@[package:]drawable/filename
<?xml version="1.0" encoding="utf-8"?> <level-list xmlns:android="http://schemas.android.com/apk/res/android" > <item android:drawable="@drawable/gril" android:maxLevel="100" android:minLevel="10"/> </level-list>
可通过 setLevel()或 setImageLevel() 更改级别。
6. 转换图像 TransitionDrawable
TransitionDrawable 是可在两种可绘制对象资源之间交错淡出的可绘制对象。
每个可绘制对象由单一<transition>元素内的 <item> 元素表示。不支持超过两个项目。要向前转换,请调用 startTransition()。要向后转换,则调用 reverseTransition()。
- xml 布局声明
<?xml version="1.0" encoding="utf-8"?> <transition xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/bird0001_risk" /> <item android:drawable="@drawable/bird0002_risk" /> </transition>
- java 代码中使用
java代码中TransitionDrawable使用方法
7. 插入可绘制对象
在 XML文件中定义的以指定距离插入其他可绘制对象的可绘制对象。当视图需要小于视图实际边界的背景时,此类可绘制对象很有用。
<?xml version="1.0" encoding="utf-8"?> <inset xmlns:android="http://schemas.android.com/apk/res/android" android:drawable="@drawable/gril" android:insetBottom="10dp" android:insetLeft="10dp" android:insetRight="10dp" android:insetTop="10dp" android:visible="true" > </inset>
8. 剪裁可绘制对象 ClipDrawable
在 XML文件中定义的对其他可绘制对象进行裁剪(根据其当前级别)的可绘制对象。您可以根据级别以及用于控制其在整个容器中位置的重力,来控制子可绘制对象的裁剪宽度和高度。通常用于实现进度栏之类的项目。
- xml 初始化剪裁样式
<?xml version="1.0" encoding="utf-8"?> <clip xmlns:android="http://schemas.android.com/apk/res/android" android:clipOrientation="vertical" android:drawable="@drawable/gril" android:gravity="center" > </clip>
- java 代码中使用
ClipDrawable java 代码中使用方法
9. 缩放可绘制对象 ScaleDrawable
在 XML文件中定义的更改其他可绘制对象大小
<?xml version="1.0" encoding="utf-8"?> <scale xmlns:android="http://schemas.android.com/apk/res/android" android:drawable="@drawable/gril" android:scaleGravity="center" android:scaleHeight="10%" android:scaleWidth="10%" > </scale>
10. 形状可绘制对象 ShapeDrawable
在 XML 中定义的一般形状。
- 绘制直线
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="line" > <gradient android:angle="45" android:centerX="0.5" android:centerY="0.5" android:centerColor="@android:color/holo_green_dark" android:endColor="@android:color/holo_orange_light" android:gradientRadius="5dp" android:startColor="@android:color/holo_purple" android:type="linear" android:useLevel="true"/>" <padding android:left="5dp" android:top="5dp" android:right="5dp" android:bottom="5dp" /> <size android:width="1dp" android:height="1dp" /> <solid android:color="@android:color/holo_orange_light" /> <stroke android:width="5dp" android:color="@android:color/darker_gray" android:dashWidth="5dp" android:dashGap="5dp" /> </shape>
2.绘制圆角矩形
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <!-- 圆角--> <corners android:radius="5dp" /> <!--描边--> <stroke android:width="1dp" android:color="@android:color/holo_blue_light" /> </shape>
12. Drawable与 Bitmap 常用方法总结
由于涉及内容比较多,已经另起文章讲述。
Drawable与 Bitmap 常用方法总结
相关推荐
- 5款Syslog集中系统日志常用工具对比推荐
-
一、为何要集中管理Syslog?Syslog由Linux/Unix系统及其他网络设备生成,广泛分布于整个网络。因其包含关键信息,可用于识别网络中的恶意活动,所以必须对其进行持续监控。将Sys...
- 跨平台、多数据库支持的开源数据库管理工具——DBeaver
-
简介今天给大家推荐一个开源的数据库管理工具——DBeaver。它支持多种数据库系统,包括Mysql、Oracle、PostgreSQL、SLQLite、SQLServer等。DBeaver的界面友好...
- 强烈推荐!数据库管理工具:Navicat Premium 16.3.2 (64位)
-
NavicatPremium,一款集数据迁移、数据库管理、SQL/查询编辑、智能设计、高效协作于一体的全能数据库开发工具。无论你是MySQL、MariaDB、MongoDB、SQLServer、O...
- 3 年 Java 程序员还玩不转 MongoDB,网友:失望
-
一、什么场景使用MongoDB?...
- 拯救MongoDB管理员的GUI工具大赏:从菜鸟到极客的生存指南
-
作为一名在NoSQL丛林中披荆斩棘的数据猎人,没有比GUI工具更称手的瑞士军刀了。本文将带你围观五款主流MongoDB管理神器的特性与暗坑,附赠精准到扎心的吐槽指南一、MongoDBCompass:...
- mongodb/redis/neo4j 如何自己打造一个 web 数据库可视化客户端?
-
前言最近在做neo4j相关的同步处理,因为产线的可视化工具短暂不可用,发现写起来各种脚本非常麻烦。...
- solidworks使用心得,纯干货!建议大家收藏
-
SolidWorks常见问题...
- 统一规约-关乎数字化的真正实现(规范统一性)
-
尽管数字化转型的浪潮如此深入人心,但是,对于OPCUA和TSN的了解却又甚少,这难免让人质疑其可实现性,因为,如果缺乏统一的语义互操作规范,以及更为具有广泛适用的网络与通信,则数字化实际上几乎难以具...
- Elasticsearch节点角色配置详解(Node)
-
本篇文章将介绍如下内容:节点角色简介...
- 产前母婴用品分享 篇一:我的母婴购物清单及单品推荐
-
作者:DaisyH8746在张大妈上已经混迹很久了,有事没事看看“什么值得买”已渐渐成了一种生活习惯,然而却从来没有想过自己要写篇文章发布上来,直到由于我产前功课做得“太过认真”(认真到都有点过了,...
- 比任何人都光彩照人的假期!水润、紧致的肌肤护理程序
-
图片来源:谜尚愉快的假期临近了。身心振奋的休假季节。但是不能因为这种心情而失去珍贵的东西,那就是皮肤健康。炙热的阳光和强烈的紫外线是使我们皮肤老化的主犯。因此,如果怀着快乐的心情对皮肤置之不理,就会使...
- Arm发布Armv9边缘AI计算平台,支持运行超10亿参数端侧AI模型
-
中关村在线2月27日消息,Arm正式发布Armv9边缘人工智能(AI)计算平台。据悉,该平台以全新的ArmCortex-A320CPU和领先的边缘AI加速器ArmEthos-U85NPU为核心...
- 柔性——面向大规模定制生产的数字化实现的基本特征
-
大规模定制生产模式的核心是柔性,尤其是体现在其对定制的要求方面。既然是定制,并且是大规模的定制,对于制造系统的柔性以及借助于数字化手段实现的柔性,就提出了更高的要求。面向大规模定制生产的数字化业务管控...
- 创建PLC内部标准——企业前进的道路
-
作者:FrankBurger...
- 标准化编程之 ----------- 西门子LPMLV30测试总结
-
PackML乃是由OMAC开发且被ISA所采用的自动化标准TR88.00.02,能够更为便捷地传输与检索一致的机器数据。PackML的主要宗旨在于于整个工厂车间倡导通用的“外观和感觉”,...
你 发表评论:
欢迎- 一周热门
-
-
Linux:Ubuntu22.04上安装python3.11,简单易上手
-
宝马阿布达比分公司推出独特M4升级套件,整套升级约在20万
-
MATLAB中图片保存的五种方法(一)(matlab中保存图片命令)
-
别再傻傻搞不清楚Workstation Player和Workstation Pro的区别了
-
Linux上使用tinyproxy快速搭建HTTP/HTTPS代理器
-
如何提取、修改、强刷A卡bios a卡刷bios工具
-
Element Plus 的 Dialog 组件实现点击遮罩层不关闭对话框
-
日本组合“岚”将于2020年12月31日停止团体活动
-
SpringCloud OpenFeign 使用 okhttp 发送 HTTP 请求与 HTTP/2 探索
-
tinymce 号称富文本编辑器世界第一,大家同意么?
-
- 最近发表
-
- 5款Syslog集中系统日志常用工具对比推荐
- 跨平台、多数据库支持的开源数据库管理工具——DBeaver
- 强烈推荐!数据库管理工具:Navicat Premium 16.3.2 (64位)
- 3 年 Java 程序员还玩不转 MongoDB,网友:失望
- 拯救MongoDB管理员的GUI工具大赏:从菜鸟到极客的生存指南
- mongodb/redis/neo4j 如何自己打造一个 web 数据库可视化客户端?
- solidworks使用心得,纯干货!建议大家收藏
- 统一规约-关乎数字化的真正实现(规范统一性)
- Elasticsearch节点角色配置详解(Node)
- 产前母婴用品分享 篇一:我的母婴购物清单及单品推荐
- 标签列表
-
- dialog.js (57)
- importnew (44)
- windows93网页版 (44)
- yii2框架的优缺点 (45)
- tinyeditor (45)
- qt5.5 (60)
- windowsserver2016镜像下载 (52)
- okhttputils (51)
- android-gif-drawable (53)
- 时间轴插件 (56)
- docker systemd (65)
- slider.js (47)
- android webview缓存 (46)
- pagination.js (59)
- loadjs (62)
- openssl1.0.2 (48)
- velocity模板引擎 (48)
- pcre library (47)
- zabbix微信报警脚本 (63)
- jnetpcap (49)
- pdfrenderer (43)
- fastutil (48)
- uinavigationcontroller (53)
- bitbucket.org (44)
- python websocket-client (47)