Android `android.graphics.drawable` 包深度解析:架构与设计模式

Android android.graphics.drawable 包深度解析:架构与设计模式

目录

  1. 引言
  2. Drawable 概述
  3. Drawable 的架构
    • Drawable 类层次结构
    • Drawable 的核心方法
  4. Drawable 的设计模式
    • 装饰者模式
    • 工厂模式
    • 状态模式
  5. 常用 Drawable 子类解析
    • BitmapDrawable
    • ShapeDrawable
    • LayerDrawable
    • StateListDrawable
    • TransitionDrawable
  6. 自定义 Drawable
  7. Drawable 的性能优化
  8. 总结

引言

在 Android 开发中,android.graphics.drawable 包是一个非常重要的组成部分,它提供了各种用于绘制图形和图像的工具类。Drawable 是 Android 中用于表示可绘制资源的基础类,广泛应用于 UI 元素的背景、图标、按钮状态等场景。本文将深入探讨 android.graphics.drawable 包的架构、设计模式以及常用子类的实现原理,帮助开发者更好地理解和使用 Drawable。

Drawable 概述

Drawable 是一个抽象类,它代表了一种可以在 Canvas 上绘制的图形或图像。Drawable 可以是一个简单的位图、一个形状、一个图层列表,或者是一个复杂的动画。Drawable 的主要作用是将图形或图像的绘制逻辑封装起来,使得开发者可以方便地在不同的 UI 组件中使用。

Drawable 的一个重要特点是它可以与 View 组件紧密结合。通过 View.setBackground(Drawable) 方法,开发者可以轻松地将一个 Drawable 设置为 View 的背景。此外,Drawable 还可以通过 ImageView.setImageDrawable(Drawable) 方法设置为 ImageView 的内容。

Drawable 的架构

Drawable 类层次结构

Drawable 类的层次结构非常丰富,包含了多个子类和接口。以下是 Drawable 类的主要子类和接口:

  • BitmapDrawable: 用于绘制位图。
  • ShapeDrawable: 用于绘制几何形状。
  • LayerDrawable: 用于将多个 Drawable 叠加在一起。
  • StateListDrawable: 用于根据 View 的状态切换不同的 Drawable。
  • TransitionDrawable: 用于在两个 Drawable 之间进行平滑过渡。
  • AnimationDrawable: 用于播放帧动画。
  • VectorDrawable: 用于绘制矢量图形。

此外,Drawable 类还实现了 Drawable.Callback 接口,用于在 Drawable 发生变化时通知相关的 View。

Drawable 的核心方法

Drawable 类提供了多个核心方法,用于控制 Drawable 的绘制、状态和属性。以下是 Drawable 类的一些重要方法:

  • draw(Canvas canvas): 在指定的 Canvas 上绘制 Drawable。
  • setBounds(int left, int top, int right, int bottom): 设置 Drawable 的绘制边界。
  • setAlpha(int alpha): 设置 Drawable 的透明度。
  • setColorFilter(ColorFilter colorFilter): 设置 Drawable 的颜色过滤器。
  • getIntrinsicWidth()getIntrinsicHeight(): 获取 Drawable 的固有宽度和高度。
  • setState(int[] stateSet): 设置 Drawable 的状态,例如按下、选中等。
  • getConstantState(): 获取 Drawable 的常量状态,用于优化 Drawable 的复制和共享。

Drawable 的设计模式

装饰者模式

装饰者模式是 Drawable 类中最常用的设计模式之一。装饰者模式允许开发者在不改变原有对象结构的情况下,动态地扩展对象的功能。在 Drawable 类中,LayerDrawableTransitionDrawable 都是装饰者模式的典型应用。

例如,LayerDrawable 可以将多个 Drawable 叠加在一起,形成一个复合的 Drawable。每个 Drawable 都可以独立地设置其透明度、颜色过滤器等属性,而不会影响其他 Drawable。这种设计使得开发者可以灵活地组合不同的 Drawable,实现复杂的 UI 效果。

Drawable[] layers = new Drawable[2];
layers[0] = new BitmapDrawable(bitmap1);
layers[1] = new BitmapDrawable(bitmap2);
LayerDr

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/65416.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

顶顶通呼叫中心中间件的三种呼叫方式(mod_cti基于FreeSWITCH)

顶顶通呼叫中心共有三种呼叫方式: 手拨呼叫点击呼叫自动外呼 联系我们 有意向了解呼叫中心中间件的用户,可以点击该链接添加工作人员:https://blog.csdn.net/H4_9Y/article/details/136148229 手拨呼叫 手拨呼叫属于常规的呼叫方式&…

C 语言中 strlen 函数的深入剖析

目录 一、strlen 函数的基本介绍 二、strlen 函数的工作原理 三、strlen 函数的使用注意事项 四、strlen 与其他字符串处理函数的结合使用 五、strlen 在实际编程中的应用场景 六、总结 在 C 语言的编程世界里,strlen函数是一个经常被使用但又容易被误解的重要…

Redis 实战篇 ——《黑马点评》(上)

《引言》 在进行了前面关于 Redis 基础篇及其客户端的学习之后,开始着手进行实战篇的学习。因内容很多,所以将会分为【 上 中 下 】三篇记录学习的内容与在学习的过程中解决问题的方法。Redis 实战篇的内容我写的很详细,为了能写的更好也付出…

文档解析丨高效准确的PDF解析工具,赋能企业非结构化数据治理

在数据为王的时代浪潮中,企业数据治理已成为组织优化运营、提高竞争力的关键。随着数字化进程的加速,企业所积累的数据量呈爆炸式增长,数据类型也愈发多样化,这些数据构成了现代企业数据资产的重要组成部分。 然而,传…

支持最新 mysql9的workbench8.0.39 中文汉化教程来了

之前在 B 站上发布了 mysql8 workbench 汉化教程,一年多来帮助很多初学者解决了不熟悉英文的烦恼。 汉化视频可以访问: 2024最新版mysql8.0.39中文版mysql workbench汉化 中文升级 旧版汉化报错解决_哔哩哔哩_bilibili MySql Workbench汉化_哔哩哔哩_…

02-18.python入门基础一基础算法

(一)排序算法 简述: 在 Python 中,有多种常用的排序算法,下面为你详细介绍几种常见的排序算法及其原理、实现代码、时间复杂度以及稳定性等特点,并对比它们适用的场景。 冒泡排序(Bubble Sor…

机器学习详解(11):分类任务的模型评估标准

模型评估是利用不同的评估指标来了解机器学习模型的性能,以及其优势和劣势的过程。评估对于确保机器学习模型的可靠性、泛化能力以及在新数据上的准确预测能力至关重要。 文章目录 1 介绍2 评估准则3 分类指标3.1 准确率 (Accuracy)3.2 精确率 (Precision)3.3 召回率…

【Mac】终端改色-让用户名和主机名有颜色

效果图 配置zsh 1.打开终端,进入.zshrc配置 cd ~ vim .zshrc2.添加如下配置并保存 # 启用命令行颜色显示 export CLICOLOR1 ## 加载颜色支持 autoload -U colors && colors # 配置 zsh 提示符 PROMPT"%{$fg_bold[red]%}%n%{$reset_color%}%{$fg_bol…

【Artificial Intelligence篇】智行未来:AI 在日常出行领域的崛起征程

目录 ​编辑 一、引言: 二、AI 在日常出行中的关键技术应用: 2.1自动驾驶技术: 2.2智能交通管理: 2.3出行辅助系统: 三、AI 在日常出行领域的发展现状: 四、AI 在日常出行领域的未来前景&#xff…

指针之矢:C 语言内存幽境的精准飞梭

一、内存和编码 指针理解的2个要点: 指针是内存中一个最小单元的编号,也就是地址平时口语中说的指针,通常指的是指针变量,是用来存放内存地址的变量 总结:指针就是地址,口语中说的指针通常指的是指针变量。…

springboot478基于vue全家桶的pc端仿淘宝系统(论文+源码)_kaic

摘 要 随着我国经济的高速发展与人们生活水平的日益提高,人们对生活质量的追求也多种多样。尤其在人们生活节奏不断加快的当下,人们更趋向于足不出户解决生活上的问题,网上购物系统展现了其蓬勃生命力和广阔的前景。与此同时,为解…

Html——12. 定义样式和引入样式

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>定义样式和引入样式文件&#xff08;CSS文件&#xff09;</title><style type"text/css">body{font-size: 40px;}</style><link rel"s…

Gitlab17.7+Jenkins2.4.91实现Fastapi/Django项目持续发布版本详细操作(亲测可用)

一、gitlab设置&#xff1a; 1、进入gitlab选择主页在左侧菜单的下面点击管理员按钮。 2、选择左侧菜单的设置&#xff0c;选择网络&#xff0c;在右侧选择出站请求后选择允许来自webhooks和集成对本地网络的请求 3、webhook设置 进入你自己的项目选择左侧菜单的设置&#xff…

pathlib:面向对象的文件系统路径

pathlib:面向对象的文件系统路径 pathlib官方介绍: Python3.4内置的标准库&#xff0c;Object-oriented filesystem paths&#xff08;面向对象的文件系统路径&#xff09; 文章目录 pathlib:面向对象的文件系统路径1. 使用示例1.1 最常用&#xff1a;获取项目目录1.2 遍历一…

条款19 对共享资源使用std::shared_ptr

目录 一、std::shared_ptr 二、std::shared_ptr性能问题 三、control block的生成时机 四、std::shared_ptr可能存在的问题 五、使用this指针作为std::shared_ptr构造函数实参 六、std::shared_ptr不支持数组 一、std::shared_ptr<T> shared_ptr的内存模型如下图&…

巩义网站建设:如何打造一个成功的企业网站

巩义网站建设是企业发展中至关重要的一环。一个成功的企业网站不仅仅是一个展示产品和服务的平台&#xff0c;更是企业形象和品牌的代表。在建设企业网站时&#xff0c;首先要考虑用户体验。网站的设计应简洁明了&#xff0c;易于导航&#xff0c;让用户能够快速找到他们需要的…

【Maven】聚合与继承

目录 1. 聚合工程 2. 聚合工程开发 3. 继承关系 4. 继承关系开发 5. 聚合与继承的区别 1. 聚合工程 什么叫聚合&#xff1f; 聚合&#xff1a;将多个模块组织成一个整体&#xff0c;同时进行项目构建的过程称为聚合 聚合工程&#xff1a;通常是一个不具有业务功能的”空…

猛将:如何在众多信仰中找到属于自己的力量?

Hi&#xff0c;我是蒙&#xff0c;欢迎来到猛将潜意识&#xff0c;带你运用潜意识快速成长&#xff0c;重塑人生&#xff01; 潜意识有猛将&#xff0c;人生再无阻挡&#xff01; 每日一省写作274/1000天 信仰是什么&#xff1f;我们生活在一个信仰流派繁多的时代&#xff0c;…

jwt在express中token的加密解密实现方法

在我们前面学习了 JWT认证机制在Node.js中的详细阐述 之后&#xff0c;今天来详细学习一下token是如何生成的&#xff0c;secret密钥的加密解密过程是怎么样的。 安装依赖 express&#xff1a;用于创建服务器jsonwebtoken&#xff1a;用于生成和验证JWTbody-parser&#xff1…

RDFS—RDF模型属性扩展解析

目录 前言1. 什么是RDFS&#xff1f;1.1 RDFS的核心概念1.2 RDFS与RDF的区别 2. RDFS的基础概念2.1 类&#xff08;Class&#xff09;2.2 属性&#xff08;Property&#xff09;2.3 关系&#xff08;Relation&#xff09;2.4 定义域&#xff08;Domain&#xff09;2.5 值域&…