当前位置: 首页 > news >正文

Glide支持通过url加载本地图标

序言

glide可以在load的时候传入一个资源id来加载本地图标,但是在开发过程中。还得区分数据类型来分别处理。这样的使用成本比较大。希望通过自定义ModelLoader实现通过自定义的url来加载Drawab。降低使用成本

实现

在这里插入图片描述
一共四个类

类名作用
GlideIcon通过自定义url的编码和提取值的作用
GlideIconModelLoader自定义的ModelLocader实现自定义的url到drawable的获取过程
LocalFetcher获取drawab
MyGlideModule用来注册自定义的配置

GlideIcon

package com.zhuguohui.app.lib.glide;import android.util.Log;import com.zhuguohui.app.lib.app.BaseApp;/*** <pre>* Created by zhuguohui* Date: 2024/6/5* Time: 13:43* Desc:* </pre>*/
public class GlideIcon {static String ICON_START = "GlideIcon://";public static boolean isIcon(String url) {return url != null && url.startsWith(ICON_START);}public static String get(int drawableId) {return ICON_START + drawableId;}public static int getValue(String url) throws Exception {if (isIcon(url)) {String resourceName = url.substring(ICON_START.length());return Integer.parseInt(resourceName);}throw new IllegalArgumentException(url + " is not a glideIcon");}
}

GlideIconModeLoader

package com.zhuguohui.app.lib.glide;import android.graphics.drawable.Drawable;import com.bumptech.glide.load.Key;
import com.bumptech.glide.load.Options;
import com.bumptech.glide.load.model.ModelLoader;
import com.bumptech.glide.load.model.ModelLoaderFactory;
import com.bumptech.glide.load.model.MultiModelLoaderFactory;import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;/*** <pre>* Created by zhuguohui* Date: 2024/6/5* Time: 13:38* Desc:* </pre>*/
public class GlideIconModeLoader implements ModelLoader<String, Drawable> {static class KeyImpl implements Key {String url;public KeyImpl(String url) {this.url = url;}@Overridepublic void updateDiskCacheKey(MessageDigest messageDigest) {messageDigest.update(url.getBytes(StandardCharsets.UTF_8));}}@Overridepublic LoadData<Drawable> buildLoadData(String s, int width, int height, Options options) {return new LoadData<>(new KeyImpl(s), new LocalFetcher(s));}@Overridepublic boolean handles(String s) {return GlideIcon.isIcon(s);}public static ModelLoaderFactory<String, Drawable> factory=new ModelLoaderFactory<String, Drawable>() {@Overridepublic ModelLoader<String, Drawable> build(MultiModelLoaderFactory multiFactory) {return new GlideIconModeLoader();}@Overridepublic void teardown() {}};
}

LocalFetcher

package com.zhuguohui.app.lib.glide;import android.graphics.drawable.Drawable;import com.bumptech.glide.Priority;
import com.bumptech.glide.load.DataSource;
import com.bumptech.glide.load.data.DataFetcher;
import com.zhuguohui.app.lib.app.BaseApp;import java.io.InputStream;
import java.util.BitSet;/*** <pre>* Created by zhuguohui* Date: 2024/6/5* Time: 11:22* Desc:* </pre>*/
public class LocalFetcher implements DataFetcher<Drawable> {String url;public LocalFetcher(String url) {this.url = url;}@Overridepublic void loadData(Priority priority, DataCallback<? super Drawable> callback) {try {int id = GlideIcon.getValue(url);callback.onDataReady(BaseApp.app().getResources().getDrawable(id));} catch (Exception e) {callback.onLoadFailed(e);}}@Overridepublic void cleanup() {}@Overridepublic void cancel() {}@Overridepublic Class<Drawable> getDataClass() {return Drawable.class;}@Overridepublic DataSource getDataSource() {return DataSource.MEMORY_CACHE;}
}

MyGlideModule

package com.zhuguohui.app.lib.glide;import android.content.Context;
import android.graphics.drawable.Drawable;
import android.util.Log;import com.bumptech.glide.Glide;
import com.bumptech.glide.Registry;
import com.bumptech.glide.annotation.GlideModule;
import com.bumptech.glide.module.AppGlideModule;import java.io.InputStream;/*** <pre>* Created by zhuguohui* Date: 2024/6/5* Time: 11:11* Desc:* </pre>*/
@GlideModule
public class MyGlideModule extends AppGlideModule {@Overridepublic void registerComponents(Context context, Glide glide, Registry registry) {super.registerComponents(context, glide, registry);registry.prepend(String.class, Drawable.class, GlideIconModeLoader.factory);}}

使用

注册

需要再gralde中导入下面两个依赖, 特别是 注解处理器没有这个无法注册

    //glide --startapi 'com.github.bumptech.glide:glide:4.16.0'annotationProcessor 'com.github.bumptech.glide:compiler:4.11.0'//glide --end

代码中

直接这样用就行了

  String imageUrl = GlideIcon.get(R.mipmap.icon_xiaoxi_xitong);

位置

MyGlideModule 这个类可以在lib module中。

注意

bug

在使用 .transition(DrawableTransitionOptions.with(factory)) 实现淡入淡出的过程中发现第一次显示的时候无法显示本地图片。后来查了一下这是glide的bug。后面有空再来处理。

        Glide.with(getContext()).load(url)
//                .transition(DrawableTransitionOptions.with(factory)).apply(options).into(imageView);

经过检测上面的bug是因为使用了第三方库
CircleImageView

在这里插入图片描述

相关文章:

Glide支持通过url加载本地图标

序言 glide可以在load的时候传入一个资源id来加载本地图标&#xff0c;但是在开发过程中。还得区分数据类型来分别处理。这样的使用成本比较大。希望通过自定义ModelLoader实现通过自定义的url来加载Drawab。降低使用成本 实现 一共四个类 类名作用GlideIcon通过自定义url的…...

网络安全形势与WAF技术分享

我一个朋友的网站&#xff0c;5月份时候被攻击了&#xff0c;然后他找我帮忙看看&#xff0c;我看他的网站、网上查资料&#xff0c;不看不知道&#xff0c;一看吓一跳&#xff0c;最近几年这网络安全形势真是不容乐观&#xff0c;在网上查了一下资料&#xff0c;1、中国信息通…...

【实战JVM】-实战篇-06-GC调优

文章目录 1 GC调优概述1.1 调优指标1.1.1 吞吐量1.1.2 延迟1.1.3 内存使用量 2 GC调优方法2.1 发现问题2.1.1 jstat工具2.1.2 visualvm插件2.1.3 PrometheusGrafana2.1.4 GC Viewer2.1.5 GCeasy 2.2 常见GC模式2.2.1 正常情况2.2.2 缓存对象过多2.2.3 内存泄漏2.2.4 持续FullGC…...

深入解析智慧互联网医院系统源码:医院小程序开发的架构到实现

本篇文章&#xff0c;小编将深入解析智慧互联网医院系统的源码&#xff0c;重点探讨医院小程序开发的架构和实现&#xff0c;旨在为相关开发人员提供指导和参考。 一、架构设计 智慧互联网医院系统的架构设计是整个开发过程的核心&#xff0c;直接影响到系统的性能、扩展性和维…...

获取 Bean 对象更加简单的方式

获取 bean 对象也叫做对象装配&#xff0c;是把对象取出来放到某个类中&#xff0c;有时候也叫对象注⼊。 对象装配&#xff08;对象注⼊&#xff09;即DI 实现依赖注入的方式有 3 种&#xff1a; 1. 属性注⼊ 2. 构造⽅法注⼊ 3. Setter 注⼊ 属性注入 属性注⼊是使⽤ Auto…...

ChatGPT基本原理

技术背景与基础&#xff1a; 深度学习&#xff1a;ChatGPT建立在深度学习技术之上&#xff0c;通过复杂的神经网络结构模拟人类的语言处理过程。深度学习使得ChatGPT能够处理海量的文本数据&#xff0c;并从中提取出复杂的语言模式和规律。GPT架构&#xff1a;ChatGPT基于GPT&a…...

几种更新 npm 项目依赖的实用方法

几种更新 npm 项目依赖的实用方法 引言1. 使用 npm update 命令2. 使用 npm-check-updates 工具3. 使用 npm outdated 命令4. 直接手动更新 package.json 文件5. 直接安装最新版本6. 使用自动化工具结语 引言 在软件开发的过程中&#xff0c;我们知道依赖管理是其中一个至关重…...

Python爬虫之简单学习BeautifulSoup库,学习获取的对象常用方法,实战豆瓣Top250

BeautifulSoup是一个非常流行的Python库&#xff0c;广泛应用于网络爬虫开发中&#xff0c;用于解析HTML和XML文档&#xff0c;以便于从中提取所需数据。它是进行网页内容抓取和数据挖掘的强大工具。 功能特性 易于使用: 提供简洁的API&#xff0c;使得即使是对网页结构不熟悉…...

SAP-BASIS15-查看系统状态

...

前端怎么debugger排查线上问题

前端怎么debugger排查线上问题 1.问题背景2.问题详细说明3.处理方案a.开发环境怎么找&#xff0c;步骤一样的&#xff1a;b.生产环境怎么找&#xff0c;步骤一样的&#xff1a;还有一种情况就是你的子盒子是使用csshover父盒子出来的&#xff0c; 4.demo地址&#xff1a; 1.问题…...

LabVIEW源程序安全性保护综合方案

LabVIEW源程序安全性保护综合方案 一、硬件加密保护方案 选择和安装硬件设备 选择加密狗和TPM设备&#xff1a;选择Sentinel HASP加密狗和支持TPM&#xff08;可信平台模块&#xff09;的计算机主板。 安装驱动和开发工具&#xff1a;安装Sentinel HASP加密狗的驱动程序和开发…...

JS包装类:循环中为什么建议用变量存储str.length进行循环判断?

前言 在Javascript通常我们在遍历一个字符串的时候通常使用的方式是 var str "abcdefg"; for(let i0;i<str.length;i){}但在最近的学习中&#xff0c;有人建议我最好应该是下面这样执行。 var str "abcdefg"; for(let i0,len str.length;i<len;i)…...

Android Audio实战——音量默认值修改(一)

在前面的文章《音频配置加载》中我们知道了,Audio 的一些配置信息是由硬件驱动保存到 audio_policy_configuration.xml 文件中,音量的一些默认值也会如此。但是在一些车载设备开发中,需要适配不同车型的需求,一套代码通常要适配多个车型,这就需要在 FW 层进行一些默认值的…...

解决uni-app progress控件不显示问题

官方代码&#xff1a; <view class"progress-box"><progress :percent"80" show-info activeColor"red" stroke-width"10" /> </view> 进度条并不在页面中显示&#xff0c;那么我们需要给进度条加上宽高style"…...

使用C++版本的opencv dnn 部署onnx模型

使用OpenCV的DNN模块在C中部署ONNX模型涉及几个步骤&#xff0c;包括加载模型、预处理输入数据、进行推理以及处理输出。 构建了yolo类&#xff0c;方便调用 yolo.h 文件 #ifndef YOLO_H #define YOLO_H #include <fstream> #include <sstream> #include <io…...

python中实现队列功能

【小白从小学Python、C、Java】 【考研初试复试毕业设计】 【Python基础AI数据分析】 python中实现队列功能 选择题 以下代码最后一次输出的结果是&#xff1f; from collections import deque queue deque() queue.append(1) queue.append(2) queue.append(3) print(【显示】…...

自然资源-关于城镇开发边界局部优化的政策思路梳理

自然资源-关于城镇开发边界局部优化的政策思路梳理 国土空间规划的核心之一是要统筹划定“三区三线”&#xff0c;三条控制线中的城镇开发边界的划定与优化工作&#xff0c;一直是国土空间规划改革的重要组成部分&#xff0c;其有助于遏制城市盲目扩张&#xff0c;强化底线约束…...

ElementUI的Table组件在无数据情况下让“暂无数据”文本居中显示

::v-deep .el-table__empty-block {width: 100%;min-width: 100%;max-width: 100%; }...

SAP-BASIS14-安装语言包

...

ant design的upload组件踩坑记录

antd版本 v4.17.0 1.自定义了onpreview和onchange事件&#xff0c;上传文件后&#xff0c;文件显示有preview的icon但是被禁用&#xff0c;无法调用onpreview事件。 问题展现&#xff1a; 苦苦查找原因&#xff0c;问题出在了这里&#xff0c;当文件没有url的时候&#xff0c…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面

代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口&#xff08;适配服务端返回 Token&#xff09; export const login async (code, avatar) > {const res await http…...

JDK 17 新特性

#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持&#xff0c;不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的&#xff…...

OpenLayers 分屏对比(地图联动)

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能&#xff0c;和卷帘图层不一样的是&#xff0c;分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...

精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南

精益数据分析&#xff08;97/126&#xff09;&#xff1a;邮件营销与用户参与度的关键指标优化指南 在数字化营销时代&#xff0c;邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天&#xff0c;我们将深入解析邮件打开率、网站可用性、页面参与时…...

dify打造数据可视化图表

一、概述 在日常工作和学习中&#xff0c;我们经常需要和数据打交道。无论是分析报告、项目展示&#xff0c;还是简单的数据洞察&#xff0c;一个清晰直观的图表&#xff0c;往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server&#xff0c;由蚂蚁集团 AntV 团队…...

听写流程自动化实践,轻量级教育辅助

随着智能教育工具的发展&#xff0c;越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式&#xff0c;也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建&#xff0c;…...

AI,如何重构理解、匹配与决策?

AI 时代&#xff0c;我们如何理解消费&#xff1f; 作者&#xff5c;王彬 封面&#xff5c;Unplash 人们通过信息理解世界。 曾几何时&#xff0c;PC 与移动互联网重塑了人们的购物路径&#xff1a;信息变得唾手可得&#xff0c;商品决策变得高度依赖内容。 但 AI 时代的来…...

LeetCode - 199. 二叉树的右视图

题目 199. 二叉树的右视图 - 力扣&#xff08;LeetCode&#xff09; 思路 右视图是指从树的右侧看&#xff0c;对于每一层&#xff0c;只能看到该层最右边的节点。实现思路是&#xff1a; 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...

Linux离线(zip方式)安装docker

目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1&#xff1a;修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本&#xff1a;CentOS 7 64位 内核版本&#xff1a;3.10.0 相关命令&#xff1a; uname -rcat /etc/os-rele…...

SQL慢可能是触发了ring buffer

简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...