【Android】自定义换肤框架04之Skinner框架设计

到上一章为止,我们已经完整讲解了换肤所用到的所有技术点

这一章,我们来梳理下,如何从整体和细节上,进行代码设计

毕竟,我们不止是简单实现功能,要做到功能清晰,使用灵活

文章目录

          • 核心组件
          • 使用约定
          • 关于SkinnerProvider
          • 设计过程中要注意的细节
          • End

核心组件
  • SkinnerResources,用于代替默认Resources,根据皮肤和模式加载资源

  • SkinnerInflaterFactory,用于代替默认LayoutInflater创建View

  • SkinnerProvider,用于对已创建的View进行换肤,主要是根据Attribute和Skin设置对应Resource

  • SkinnerProvidersFactory,管理默认SkinnerProvider,和自定义SkinnerProvider

  • SkinnerKit,提供SkinnerSDK对外调用接口,主要是init/install/load

  • SkinnerValues,定义SkinnerValues常量

  • SkinnerCompatActivity,非必须组件

    提供createContentView/initContentView/reloadContentView等生命周期方法,方便换肤后重载布局

使用约定
  • 支持skin和mode两种属性搭配使用,比如同一种皮肤,有深色模式和浅色模式
  • 需要换肤的资源,名称以_skinnable结尾的资源,不符合此条件的资源,意味着不需要跟随换肤变化
  • 同一个皮肤需要支持多种模式时,在res下面添加新的以_skinnable_mode的资源即可,框架会根据mode自动切换
  • 默认只对background,src,textColor三个最常用的属性进行换肤,其它属性可通过自定义Provider配置
关于SkinnerProvider
  • 目前所有换肤框架,均无法做到对所有控件,所有属性,进行自动换肤,这是Android自身技术限制所致
  • 不同换肤框架最大的区别就是在于,如何适配所有控件,所有属性
  • SkinnerProvider的设计初衷,在于将换肤适配代码,与xml/view/activity完全解耦
  • 这样大家不管是集成Skinner框架,还是以后移除Skinner框架,对项目代码都没什么改动
  • 自定义SkinnerProvider,请参考BasicAttributeSkinner#hookView方法
  • 自定义Provider需要通过SkinnerProvidersFactory注册,并且在xml中通过skin:provider属性表明使用哪个provider
  • 多个Provider通过空格隔开即可
设计过程中要注意的细节
  • 当皮肤包不存在,资源不存在,或反射被禁用时,要能自动切换到默认的Resource
  • 支持在使用过程中换肤,重新调用setContentView后生效
  • 支持自动保存和加载上次的皮肤设置
  • 如果同一套skin有多个mode的话,最好是新建一个res-mode文件夹来存放资源,方便管理
  • provider根据需要来使用,一是提升性能,二是防止多个provider功能有交集
End

本期到此为止,下一章我们给出最终教程和源码

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

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

相关文章

探索InitializingBean:Spring框架中的隐藏宝藏

​🌈 个人主页:danci_ 🔥 系列专栏:《设计模式》《MYSQL》 💪🏻 制定明确可量化的目标,坚持默默的做事。 ✨欢迎加入探索MYSQL索引数据结构之旅✨ 👋 Spring框架的浩瀚海洋中&#x…

Java里的Arrary详解

DK 中提供了一个专门用于操作数组的工具类,即Arrays 类,位于java.util 包中。该类提供了一些列方法来操作数组,如排序、复制、比较、填充等,用户直接调用这些方法即可不需要自己编码实现,降低了开发难度。 java.util.…

用PlantUML和语雀画UML类图

概述 首先阐述一下几个简单概念: UML:是统一建模语言(Unified Modeling Language)的缩写,它是一种用于软件工程的标准化建模语言,旨在提供一种通用的方式来可视化软件系统的结构、行为和交互。UML由Grady…

用于实时语义分割的可重参数化双分辨率网络

文章目录 摘要一、引言II、相关工作III、方法IV. 实验V、结论摘要 https://arxiv.org/pdf/2406.12496 语义分割在自动驾驶和医学图像等应用中发挥着关键作用。尽管现有的实时语义分割模型在准确性和速度之间取得了令人称赞的平衡,但其多路径块仍然影响着整体速度。为了解决这…

洛谷 P2141 [NOIP2014 普及组] 珠心算测验

本文由Jzwalliser原创,发布在CSDN平台上,遵循CC 4.0 BY-SA协议。 因此,若需转载/引用本文,请注明作者并附原文链接,且禁止删除/修改本段文字。 违者必究,谢谢配合。 个人主页:blog.csdn.net/jzw…

pyrender 离线渲染包安装教程

pyrender 离线渲染包安装教程 安装 安装 官方安装教程:https://pyrender.readthedocs.io/en/latest/install/index.html#installmesa 首先 pip install pyrenderclang6.0安装 下载地址:https://releases.llvm.org/download.html#6.0.0 注意下好是叫:clangllvm-6…

名企面试必问30题(二十三)—— 工作中难以和同事、上司相处,你该怎么办?

回答方向一 如果在工作中遇到与同事、上司难以相处的情况,我首先会保持冷静和积极的心态,不让情绪影响到工作。我会反思自己的行为和态度,分析产生矛盾或难以相处的原因。 如果是因为工作方式、方法上存在差异,我会主动找同事或上…

通信协议_C#实现自定义ModbusRTU主站

背景知识:modbus协议介绍 相关工具 mbslave:充当从站。虚拟串口工具:虚拟出一对串口。VS2022。 实现过程以及Demo 打开虚拟串口工具: 打开mbslave: 此处从站连接COM1口。 Demo实现 创建DLL库,创建ModbusRTU类,进行实现: using Syste…

VMware虚拟机搭建CentOS7环境

相关资料 安装VMware 双击VMware-workstation(16.1.1软件安装包.exe安装文件,点下一步 激活码文件复制激活码激活安装linux 1、点击创建虚拟机

SLAM(Simultaneous Localization and Mapping)算法

SLAM(Simultaneous Localization and Mapping)算法,即同时定位与地图构建算法,是一种通过传感器数据实时估计机器人自身位置和构建环境地图的技术。该算法广泛应用于机器人、自动驾驶、增强现实(AR)、无人机…

【MySQL基础篇】多表查询

1、多表关系 概述:项目开发中,在进行数据库表结构操作设计时,会根据业务需求及业务模板之间的关系,分析并设计表结构,由于业务之间相互关联,所以各个表结构之间也存在着各种联系,基本上分为三种…

从FasterTransformer源码解读开始了解大模型(2.1)代码通读03

从FasterTransformer源码解读开始了解大模型(2.2)代码解读03-forward函数 写在前面的话 本篇的内容继续解读forward函数,从650行开始进行解读 零、输出Context_embeddings和context_cum_log_probs的参数和逻辑 从653行开始,会…

架构师学习理解和总结

1.架构设计理念 2.架构方法论 2.1需求分析 2.1.1常见需求层次 2.1.2 常见需求结果 2.1.3 需求与架构关系 2.2 领域分析 2.3 关键需求 2.4 概念架构设计 2.5 细化架构设计 2.6 架构设计验证 3.架构设计工具 3.1 DDD领域建模 3.2 41视图分析法 3.3 UML设计工具 4.架构师知…

【PYG】pytorch中size和shape有什么不同

一般使用tensor.shape打印维度信息,因为简单直接 在 PyTorch 中,size 和 shape 都用于获取张量的维度信息,但它们之间有细微的区别。下面是它们的定义和用法: size: size 是一个方法(size())和…

系统化学习 H264视频编码(01)基础概念

说明:我们参考黄金圈学习法(什么是黄金圈法则?->模型 黄金圈法则,本文使用:why-what)来学习音H264视频编码。本系列文章侧重于理解视频编码的知识体系和实践方法,理论方面会更多地讲清楚 音视频中概念的…

Swift 中的方法调用机制

Swift 方法调用详解:与 Objective-C 的对比、V-Table 机制、Witness Table 机制 在 iOS 开发中,Swift 和 Objective-C 是两种常用的编程语言。尽管它们都能用于开发应用程序,但在方法调用的底层机制上存在显著差异。本文将详细介绍 Swift 的…

Calicoctl工具学习 —— 筑梦之路

官方文档: Calico Documentation | Calico Documentation 插件方式安装 calicoctl 工具 curl -o kubectl-calico -O -L "https://github.com/projectcalico/calicoctl/releases/download/v3.20.0/calicoctl"cp kubectl-calico /usr/bin/kubectl-calic…

05:C语言函数

C语言函数 1、函数的三要素1.1、函数定义1.2、函数声明1.3、函数调用 函数是C语言代码的基本组成部分,它是一个小的模块,整个程序由很多个功能独立的模块(函数)组成。这就是程序设计的基本分化方法。 之前接触过的函数&#xff1a…

实验2 Aprori关联挖掘算法

目 录 一、实验目的... 1 二、实验环境... 1 三、实验内容... 1 3.1 connect_string()函数解析... 1 3.2 find_rule()函数解析纠错... 2 3.3 关联规则挖掘... 4 四、心得体会... 7 一、实验目的 (1)理解Aprori关联挖掘算法的程序编写; &…

PYTHON自学笔记(一)vscode配置

安装python 自行官网下载 安装vscode 自行官网下载 环境变量设置 把python和scripts的文件路径,添加到环境变量的path中,如图: 此项不弄,在命令行模式中系统不会认为你装了python和pip,你的输入相关命令shell不会…