IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> 谈谈安卓的Bitmap与Drawable -> 正文阅读

[移动开发]谈谈安卓的Bitmap与Drawable

前言

搞安卓有些时间了,对图片老是存在一些疑惑:给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方法设置Drawable
        setBackground(d);

        mBackgroundResource = resid;
    }

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

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

    public void setBackground(Drawable background) {
        //1、调用setBackgroundDrawable
        setBackgroundDrawable(background);
    }
    /**
     * @deprecated use {@link #setBackground(Drawable)} instead
     */
    @Deprecated
    public 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 赋值给background
        final 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渲染到画布上的。
  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-02-28 15:41:20  更:2022-02-28 15:42:32 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 16:08:27-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码