前言

搞安卓有些时间了,对图片老是存在一些疑惑:给View设置背景的原理是啥?啥是Drawable呢?Bitmap又是啥呢 ?Bitmap与Drawable有啥区别呢?整天看着这些熟悉有陌生的名词,当面对这些问题时却发现自己能说出来的却很少,,,, 今天就来谈谈自己的发现。

康康Drawable

首先用一句话来总结下Drawable吧:Drawable是对安卓中所有可绘制图像的抽象,也就是说安卓中的图像是以Drawable形式存在的。

为啥说安卓中的图像是以Drawable形式存在的?

这点就要从View展示图片的原理来验证了~ 安卓中的所有UI最终都是以View的形式展示出来的,所以可以先看下安卓的View如何展示背景的。

总结了下有如下常见两种方式:

  • setBackgroundResource(@DrawableRes int resid)
  • setBackground(Drawable background)
    public void setBackgroundResource(@DrawableRes int resid) {if (resid != 0 && resid == mBackgroundResource) {return;}Drawable d = null;if (resid != 0) {//  吧资源id代表的图片转化为Drawable对象d = mContext.getDrawable(resid);}// 调用setBackground方法设置DrawablesetBackground(d);mBackgroundResource = resid;}

可见View#setBackgroundResource源码十分简单,吧资源id代表的图片转化为Drawable对象,然后调用自身的setBackground设置Drawable对象。

原来setBackgroundResource最终会调用setBackground鸭~ 那就继续探究呗

    public void setBackground(Drawable background) {//1、调用setBackgroundDrawablesetBackgroundDrawable(background);}/*** @deprecated use {@link #setBackground(Drawable)} instead*/@Deprecatedpublic void setBackgroundDrawable(Drawable background) {···// 避免相同background重复设置if (background == mBackground) {return;}···     // 作为成员变量保存份mBackground = background;// 2、重新绘制,走draw方法。invalidate(true);invalidateOutline();}public void draw(Canvas canvas) {···//3、走drawBackground方法drawBackground(canvas);···
}private void drawBackground(Canvas canvas) {// 4、取之前保存的成员变量mBackground 赋值给backgroundfinal Drawable background = mBackground;if (background == null) {return;}···if ((scrollX | scrollY) == 0) {// 5、使用Drawable#draw 在canvas上渲染background.draw(canvas);} else {canvas.translate(scrollX, scrollY);// 5、使用Drawable#draw 在canvas上渲染background.draw(canvas);canvas.translate(-scrollX, -scrollY);}}

可见给View设置一个背景图,背景图首先会被转化为Drawable,最终调用Drawable#draw吧drawable渲染在画布上。

Drawable有哪些分类

前面说了“Drawable是对安卓中所有可绘制图像的抽象” 那么Drawable既然是一个抽象定义那么他有哪些实现呢?

Drawable是可以绘制的东西,常见的xml如布局、矢量图像、普通图片等等都是属于Drawable的范畴,接下来康康安卓中Drawable有哪些常见的具体的实现:

  • ShapeDrawable
  • BitmapDrawable
  • NinePatchDrawable
  • StateListDrawable
  • LayerDrawable
  • LevelListDrawable
  • TransactionDrawable
  • InsetDrawable
  • ScaleDrawable
  • ClipDrawable

安卓中提供了好多Drawable的具体实现类,在开发中我们或许最常见的就是碰到过ShapeDrawable、BitmapDrawable:

如上ShapeDrawable我们通常使用xml来进行实现,然后作为bg设置给View,如下这个以shape为根节点的xml文件作为bg设置给view时,xml文件就会被转化为ShapeDrawable对象。

BitmapDrawable 也是最常见的,当安卓的图片以View为载体展示时就会被转化为BitmapDrawable对象,然后被渲染到Canvas上。如直接给吧图片作为背景设置给View。

有时候需要在代码中获得BitmapDrawable 对象还可以这样做:

//R.drawable.my_image 一张具体的图片val myImage: Drawable = ResourcesCompat.getDrawable(context.resources, R.drawable.my_image, null)

其他的就不多谈了后续会专门总结下各种Drawable~

Bitmap

Bitmap存储的是像素点,代表具体的一张图片信息。安卓中对图片的裁剪、缩放等一系列的操作需要把图片文件以Bitmap的形式加载到内存中进行操作。

Bitmap和Drawable也是有联系的,安卓通过View展示一张具体的图片时会把Bitmap转化为BitmapDrawable,然后View通过Canvas来渲染BitmapDrawable到画布上。

图片的操作

安卓中操作图片需要使用到Bitmap相关的api,这里可以先了解下~

  • Bitmap#createBitmap:提供了一系列静态重载方法,主要是从已有的bitmap中创建新的Bitmap
  • BitmapFactory.decodeXXX:提供了一系列decodeXXX方法,可以根据目标文件创建Bitmap对象。一般Bitmap对象都是从这些方法生成的。
  • BitmapFactory.Options:Bitmap的采样缩放时会用到。

总结

  • Drawable是可以绘制的东西,如xml如布局、矢量图,普通图片等都属于安卓Drawable的范畴,Drawable不仅仅包括图片。
  • Bitmap位图是特定类型的Drawable,它是图片,如:PNG,JPEG等.
  • Bitmap 储存的是像素信息,Bitmap可转化为BitmapDrawable 是BitmapDrawable Drawable的一种。
  • 安卓中对图片的操作都是以bitmap的形式,对图片的显示都是以Drawable的形式。View最终是通过Canvas来吧Drawable渲染到画布上的。

谈谈安卓的Bitmap与Drawable相关推荐

  1. Bitmap,byte[],Drawable相互转化

    1.Drawable就是一个可画的对象.其可能是一张位图(BitmapDrawable),也可能是一个图形(ShapeDrawable).还有可能是一个图层(LayerDrawable),我们依据绘图 ...

  2. Android中Bitmap和Drawable

    一.相关概念 1.Drawable就是一个可画的对象,其可能是一张位图(BitmapDrawable),也可能是一个图形(ShapeDrawable),还有可能是一个图层(LayerDrawable) ...

  3. android bitmap对比,Android Bitmap和Drawable的对比

    Android Bitmap和Drawable的对比 Bitmap - 称作位图,一般位图的文件格式后缀为bmp,当然编码器也有很多如RGB565.RGB888.作为一种逐像素的显示对象执行效率高,但 ...

  4. (转)Android Bitmap 与 Drawable之间的转换

    转换Bitmap to Drawable Bitmap bitmap = new Bitmap (...); Drawable drawable = new BitmapDrawable(bitmap ...

  5. Android中Bitmap和Drawable详解

    一.相关概念 1.Drawable就是一个可画的对象,其可能是一张位图(BitmapDrawable),也可能是一个图形(ShapeDrawable),还有可能是一个图层(LayerDrawable) ...

  6. Bitmap 和Drawable 的区别

    Bitmap - 称作位图,一般位图的文件格式后缀为bmp,当然编码器也有很多如RGB565.RGB888.作为一种逐像素的显示对象执行效率高,但是缺点也很明显存储效率低.我们理解为一种存储对象比较好 ...

  7. Bitmap和Drawable的互相转换

    刚好之前的项目实用到.怕遗忘了.就先记录下来.然后会用到的时候直接来这copy使用就好了. 1.Bitmap ---->Drawable: public static Drawable bitm ...

  8. Android中Bitmap和Drawable 总结

    一.相关概念 1.Drawable就是一个可画的对象,其可能是一张位图(BitmapDrawable),也可能是一个图形(ShapeDrawable),还有可能是一个图层(LayerDrawable) ...

  9. byte[],Bitmap,YuvImage,Drawable 旋转、缩放、相互转化

    1.byte[](YuvImage )->Bitmap 在相机开发中,Camera获取到摄像头每一帧的图像数据byte[],有时候需要把它转为Bitmap @Overridepublic voi ...

最新文章

  1. ConstraintLayout 实现水平方向 权重 效果
  2. Word无法使用超链接,提示:“由于本机的限制...”
  3. Linux运行hadoop命令,将hadoop程序打成jar包,在linux下以命令行方式运行(例如单词计算程序)...
  4. Gym 101933 A(dp)
  5. HashMap 详解
  6. 如何将目录下几百个lib加入到vs项目属性下的链接器
  7. 赠与大学毕业生_出售,赠与或交易iPhone之前应该做什么
  8. wex5中win8或者win10操作系统studio中新建.w向导或其他的编辑窗口显示不全
  9. 关于android系统集成其他传感器
  10. 洛谷P2568 GCD(莫比乌斯反演)
  11. springmvc的一些优化设置
  12. 『OpenCV3』Harris角点特征_API调用及python手动实现
  13. 常用的C语言学习网站
  14. adb命令检测手机bl有无上锁_用adb命令解bl锁
  15. Linux下安装rarlinux
  16. 简单的流媒体服务器(EasyDarwin的安装搭建)
  17. Unity StanderShader系列1---ForwardBase源码解析
  18. layui iframe弹出层高度自适应,并垂直居中
  19. C语言实验——逆置正整数
  20. MWorks建模、仿真、分析优化平台

热门文章

  1. 互联网人的工资能有多高?
  2. Android事件传递机制详解
  3. 学习环境搭建(一)服务器安装
  4. 计算机管理员用户被禁用,Windows 10 账户没有了管理员权限或唯一的管理员账户被禁用了,怎么办!...
  5. Linux服务器之间设置共享目录
  6. mint linux使用教程,Linux:Linux Mint系统的安装
  7. c语言数组出界,C++有什么办法检查数组越界
  8. Numpy——bool运算
  9. 克隆clone和new对象的区别,为什么要克隆?如何实现clone
  10. 以《荷塘月色》编写教案