极力推荐文章:欢迎收藏

Android 干货分享

阅读五分钟,每日十点,和您一起终身学习,这里是程序员Android

DrawableAndroid 中图像显示的常用方法。

概念:Drawable 是指可在屏幕上绘制的图形,已经通过getDrawable(int)等API检索或者应用到具有 android:drawableandroid:icon 等属性的其他 XML 资源的图形。

本篇文章主要介绍 Android 开发中的部分知识点,通过阅读本篇文章,您将收获以下内容:

  1. Drawable 分类
  2. Bitmap 位图 BitmapDrawable
  3. 可拉伸图(*.9.png) NinePatchDrawable。
  4. 图层 LayerDrawable
  5. 不同状态图(选择器) StateListDrawable
  6. 级别列表 LevelListDrawable
  7. 转换图像 TransitionDrawable
  8. 插入可绘制对象
  9. 剪裁可绘制对象 ClipDrawable
  10. 缩放可绘制对象 ScaleDrawable
  11. 形状可绘制对象 ShapeDrawable
  12. Drawable与 Bitmap 常用方法总结

1.Drawable 简介

继承关系如下:

[java.lang.Object]
   ↳
android.graphics.drawable.Drawable

Drawable 分类如下:

  1. Bitmap 位图 BitmapDrawable
  2. 可拉伸图(*.9.png) NinePatchDrawable。
  3. 图层 LayerDrawable
  4. 不同状态图(选择器) StateListDrawable
  5. 级别列表 LevelListDrawable
  6. 转换图像 TransitionDrawable
  7. 插入可绘制对象
  8. 剪裁可绘制对象 ClipDrawable
  9. 缩放可绘制对象 ScaleDrawable
  10. 形状可绘制对象 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中创建位图资源文件

注意一下属性使用方法:

  1. antialias

    启用、停用抗锯齿

  2. dither

    当位图的像素配置与屏幕不同时(例如:RGB 8888 位图和 RGB 565 屏幕),启用或停用位图抖动。

3. `filter `
启用或停用位图过滤。当位图收缩或拉伸以使其外观平滑时使用过滤。
  1. 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 代码实现方法

2. 可拉伸图(*.9.png) NinePatchDrawable。

NinePatch 是一种 PNG 图像,在其中可定义当视图中的内容超出正常图像边界时 Android 缩放的可拉伸区域。此类图像通常指定为至少有一个尺寸设置为 "wrap_content" 的视图的背景,而且当视图扩展以适应内容时,九宫格图像也会扩展以匹配视图的大小。Android 的标准 Button 小部件使用的背景就是典型的九宫格图像,其必须拉伸以适应按钮内的文本(或图像)。

    1. 常规使用方法同其他图片引用方式
    1. 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>均使用各种属性来描述应用作可绘制对象的图形的状态。

在每个状态变更期间,将从上到下遍历状态列表,并使用第一个与当前状态匹配的项目 —此选择并非基于“最佳匹配”,而是选择符合状态最低条件的第一个项目。

此方法非常常用,比如状态选择器

    1. 常规使用方法同其他图片引用方式
    1. 选择器 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 代码中使用

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 代码中使用

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 中定义的一般形状。

  1. 绘制直线
<?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 常用方法总结

至此,本篇已结束,如有不对的地方,欢迎您的建议与指正。同时期待您的关注,感谢您的阅读,谢谢!

Drawable 使用详解的更多相关文章

  1. Android自定义drawable(Shape)详解

    在Android开发过程中,经常需要改变控件的默认样式, 那么通常会使用多个图片来解决.不过这种方式可能需要多个图片,比如一个按钮,需要点击时的式样图片,默认的式样图片. 这样就容易使apk变大. 那 ...

  2. Android Drawable - Shape Drawable使用详解(附图)

    TIPS shape图形 –简单介绍 shape图形 –如何画? shape图形 –参数详细解析 shape图形 –如何用? shape图形 –实际开发应用场景 shape图形简单介绍 用xml实现一 ...

  3. Drawable实战解析:Android XML shape 标签使用详解(apk瘦身,减少内存好帮手)

    Android XML shape 标签使用详解   一个android开发者肯定懂得使用 xml 定义一个 Drawable,比如定义一个 rect 或者 circle 作为一个 View 的背景. ...

  4. Selector、shape详解,注意这两种图像资源都以XML方式存放在drawable不带分辨率的文件夹中

    Selector.shape详解(一) Selector的结构描述: <?xml version="1.0" encoding="utf-8"?> ...

  5. Xamarin.Android通知详解

    一.发送通知的机制 在日常的app应用中经常需要使用通知,因为服务.广播后台活动如果有事件需要通知用户,则需要通过通知栏显示,而在Xamarin.Android下的通知需要获取Notification ...

  6. 详解Paint的setXfermode(Xfermode xfermode)

    一.setXfermode(Xfermode xfermode) Xfermode国外有大神称之为过渡模式,这种翻译比较贴切但恐怕不易理解,大家也可以直接称之为图像混合模式,因为所谓的“过渡”其实就是 ...

  7. Android图片缓存之Bitmap详解

    前言: 最近准备研究一下图片缓存框架,基于这个想法觉得还是先了解有关图片缓存的基础知识,今天重点学习一下Bitmap.BitmapFactory这两个类. 图片缓存相关博客地址: Android图片缓 ...

  8. Android之TextView的样式类Span的使用详解

           Android中的TextView是个显示文字的的UI类,在现实中的需求中,文字有各式各样的样式,TextView本身没有属性去设置实现,我们可以通过Android提供的 Spannab ...

  9. Xamarin android 之Activity详解

    序言: 上篇大概的讲解了新建一个android的流程.今天为大家带来的是Activity详解,因为自己在开发过程中就遇到 好几次坑,尴尬. 生命周期 和Java里头一样一样的,如图 图片来源于网上哈, ...

随机推荐

  1. C# 位运算及实例计算

    前言: 平时在实际工作中很少用到这个,虽然都是一些比较基础的东西,但一旦遇到了,又不知所云.刚好最近接触了一些相关这方面的项目,所以也算是对 这些内容重新温习实践了一遍.所以这篇不仅作为个人备忘,也分 ...

  2. 用户点击获取验证码之后我们会发送一条信息到用户手机,然后就会出现一个倒计时按钮,很像支付宝手机付款效果了,下面我给大家分享两个js效果

    js代码  代码如下 复制代码 <div class="input">    <input type="button" id="bt ...

  3. LeetCode刷题------------------------------LeetCode使用介绍

    临近毕业了,对技术有种热爱的我也快步入码农行业了,以前虽然在学校的ACM学习过一些算法,什么大数的阶乘,dp,背包等,但是现在早就忘在脑袋后了,哈哈,原谅我是一枚菜鸡,为了锻炼编程能力还是去刷刷Lee ...

  4. 法国神器"mimikatz"简化版,一键导出结果

    神器之所以称之为神器.那是闹着玩的? 法国神器"mimikatz",那是相当的好使!!! GitHub:https://github.com/gentilkiwi/mimikatz ...

  5. 006.SQLServer AlwaysOn可用性组高可用部署

    一 数据库镜像部署准备 1.1 数据库镜像支持 有关对 SQL Server 2012 中的数据库镜像的支持的信息,请参考:https://docs.microsoft.com/zh-cn/previ ...

  6. Docker学习第二天

    CentOS 系列安装 Docker Docker 支持 CentOS6 及以后的版本. CentOS6 对于 CentOS6,可以使用 EPEL 库安装 Docker,命令如下 [root@MSJT ...

  7. 基于IdentityServer4的OIDC实现单点登录(SSO)原理简析

    写着前面 IdentityServer4的学习断断续续,兜兜转转,走了不少弯路,也花了不少时间.可能是因为没有阅读源码,也没有特别系统的学习资料,相关文章很多园子里的大佬都有涉及,有系列文章,比如: ...

  8. TCP传输协议中如何解决丢包问题

    TCP在不可靠的网络上实现可靠的传输,必然会有丢包.TCP是一个“流”协议,一个详细的包将会被TCP拆分为好几个包上传,也是将会把小的封裝成大的上传,这就是说TCP粘包和拆包难题. 但是许多人有不同的 ...

  9. vim 复制大块内容。 y,p(是单个y,而不是yy)

    vim 复制大块内容. y,p(是单个y,而不是yy)

  10. Flume框架的学习使用

    Flume框架的学习使用 Flume简介 Flume提供一个分布式的,可靠的,对大数据量的日志进行高效收集.聚集.移动的服务. Flume基于流失架构,容错性强,也很灵活简单 Flume,kafka用 ...