android pdf框架-10,相册浏览
MupdfViewer 这是最后apk,源码在前面的文章已经贴过了本站下载地址,只是不是最新的.可能不少是旧的内容.
subsampling-scale-image-view这是一个大图片的分块加载的实现.比较不错的.滑动方面我觉得使用flinger的效果比它要流畅,惯性要好.
也有人把这个作成pdf渲染器.但翻页就不好了.
现在的手机相册现在可能使用的是opengl实现的.
本项目中的,自定义flinger在滚动惯性上比其它要强一些.惯性太高,也会看到加载过程,反而会让人觉得慢...
多数的pdf阅读器都会用缓存.下文说到把块的缓存去了,原因之一是无法处理被回收的问题.另一个,缓存如果直接在主线程读取,因为它是同步的,会造成页面卡顿,滚动过程尤其明显.barteksc就是这样的,把它从scroller换成flinger实现滚动,就会明显感觉到卡顿,尤其在放大倍数提升到10倍后,对于barteksc,的10倍还不如我这边缩放4倍大,因为它是以最大的图片去计算的.
所以从这方面来说,我对改造后的效果还是挺满意的.
相册有很多,几乎全部是单张图片的浏览. 并不方便连续的浏览.
需求可能是这样的:
我在微博下了一些长图片,每一张在相册中查看当然可以,能放大,但是比较麻烦.
如果要生成pdf,会占了不少空间,而且照片会增加,比如拍照,会持续拍,总不能一直生成pdf,当然可以使用追加式的.
在浏览目录时,长按菜单,出现相册功能.按时间倒序排列查看.与pdf一样,所有的照片默认是同一个宽.不像barteksc它们都是保留原始宽,这样滑动后,可能容易内容滑出去了.这不是一个阅读器的好的体验方式.因为中间有一张特别宽的图片,会导致内容经常滑出去.
在pdf程序写好以后,我发现,既然生成的pdf可以,我也可以用pdf的浏览方式去查看相册.
相册图片解码速度比pdf还是要快不少的.目前没有针对三星这种拍照方向不对的照片处理.国内已经很少有三星手机了.
由于原来的pdfpage实现的接口,document等接口,添加一种实现即可.
class AlbumViewerActivity extends BaseViewerActivity {protected ProgressDialog progressDialog;@Overrideprotected DecodeService createDecodeService() {return new DecodeServiceBase(new AlbumContext());}protected void loadDocument(String path) {progressDialog=new ProgressDialog(this);progressDialog.setMessage("Loading");progressDialog.show();AppExecutors.Companion.getInstance().diskIO().execute(() -> {decodeService.open(path);AppExecutors.Companion.getInstance().mainThread().execute(() -> {progressDialog.dismiss();documentView.showDocument();});});}
}
对activity作一次重构,把加载文档放到异步线程中,因为这不是加载pdf文档,是加载一个目录下的所有图片,有可能比较耗时.
加一个context
class AlbumContext implements CodecContext {public CodecDocument openDocument(String fileName) {return AlbumDocument.openDocument(fileName);}public void setContentResolver(ContentResolver contentResolver) {}public void recycle() {}
}
然后就是文档
class AlbumDocument implements CodecDocument {ArrayList<File> files;int count = 0;private static FileFilter createFileFilter() {return pathname -> {if (pathname.isHidden()) {return false;}if (pathname.isDirectory())return false;String fname = pathname.getName().toLowerCase(Locale.ROOT);return AdapterUtils.INSTANCE.isImage(fname);};}public static AlbumDocument openDocument(String fname) {File[] fileArray = new File(fname).listFiles(createFileFilter());ArrayList<File> files = new ArrayList<>(fileArray != null ? Arrays.asList(fileArray) : Collections.<File>emptyList());Collections.sort(files, (o1, o2) -> {if (o1 == null && o2 == null) {return 0;}if (o1.isDirectory() && o2.isFile()) return -1;if (o1.isFile() && o2.isDirectory()) return 1;if (o1.lastModified() - o2.lastModified() > 0) {return -1;} else if (o1.lastModified() - o2.lastModified() < 0) { //jdk7以上需要对称,自反,传递性.return 1;} else {return 0;}});AlbumDocument document = new AlbumDocument(files);return document;}public AlbumDocument(ArrayList<File> files) {this.files = files;if (null != files) {count = files.size();}}public CodecPage getPage(int pageNumber) {return AlbumPage.createPage(files.get(pageNumber).getAbsolutePath(), pageNumber);}public int getPageCount() {return count;}@Overrideprotected void finalize() throws Throwable {recycle();super.finalize();}public synchronized void recycle() {}@Overridepublic Outline[] loadOutline() {return new Outline[0];}
}
要过滤出支持解码的图片类型,svg目前不行.
最关键的还是解码部分. 这里对每一块解码都可能重新生成一个decoder,可以优化一下.
class AlbumPage implements CodecPage {private long pageHandle = -1;int pageWidth;int pageHeight;private BitmapRegionDecoder decoder;private String path;static AlbumPage createPage(String fname, int pageno) {AlbumPage pdfPage = new AlbumPage(pageno, fname);return pdfPage;}public AlbumPage(long pageno, String fname) {this.pageHandle = pageno;this.path = fname;}public int getWidth() {if (pageWidth == 0) {decodeBound();}return pageWidth;}private void decodeBound() {BitmapFactory.Options options = new BitmapFactory.Options();options.inJustDecodeBounds = true;BitmapFactory.decodeFile(path, options);pageWidth = options.outWidth;pageHeight = options.outHeight;}public int getHeight() {相关文章:
android pdf框架-10,相册浏览
MupdfViewer 这是最后apk,源码在前面的文章已经贴过了本站下载地址,只是不是最新的.可能不少是旧的内容. subsampling-scale-image-view这是一个大图片的分块加载的实现.比较不错的.滑动方面我觉得使用flinger的效果比它要流畅,惯性要好. 也有人把这个作成pdf渲染器.但翻页就…...
基于SSM的高校普法系统(有报告)。Javaee项目。ssm项目。
演示视频: 基于SSM的高校普法系统(有报告)。Javaee项目。ssm项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结构,通过Spring Spri…...
数据结构刷题篇 之 【力扣二叉树基础OJ】详细讲解(含每道题链接及递归图解)
有没有一起拼用银行卡的,取钱的时候我用,存钱的时候你用 1、相同的树 难度等级:⭐ 直达链接:相同的树 2、单值二叉树 难度等级:⭐ 直达链接:单值二叉树 3、对称二叉树 难度等级:⭐⭐ 直达…...
Jackson 2.x 系列【6】注解大全篇二
有道无术,术尚可求,有术无道,止于术。 本系列Jackson 版本 2.17.0 源码地址:https://gitee.com/pearl-organization/study-jaskson-demo 文章目录 注解大全2.11 JsonValue2.12 JsonKey2.13 JsonAnySetter2.14 JsonAnyGetter2.15 …...
在低成本loT mcu上实现深度神经网络端到端自动部署-深度神经网络、物联网、边缘计算、DNN加速——文末完整资料
目录 前言 DNN 量化神经网络 并行超低功耗计算范式 面向内存的部署 结果 原文与源码下载链接 REFERENCES 前言 在物联网极端边缘的终端节点上部署深度神经网络( Deep Neural Networks,DNNs )是支持普适深度学习增强应用的关键手段。基于低成本MCU的终端节点…...
【linux】基础IO |文件操作符
需要掌握:操作文件,本质:进程操作文件。进程和文件的关系 向文件中写入,本质上向硬件中写入->用户没有权利直接写入->操作系统是硬件的管理者,我们可以通过操作系统往硬件写入->操作系统必须提供系统调用&…...
探索 2024 年 Web 开发最佳前端框架
前端框架通过简化和结构化的网站开发过程改变了 Web 开发人员设计和实现用户界面的方法。随着 Web 应用程序变得越来越复杂,交互和动画功能越来越多,这是开发前端框架的初衷之一。 在网络的早期,网页相当简单。它们主要以静态 HTML 为特色&a…...
解决: MAC ERROR [internal] load metadata for docker.io/library/openjdk:17
错误信息: ERROR [internal] load metadata for docker.io/library/openjdk:17 ERROR: failed to solve: openjdk:17: error getting credentials - err: exit status 1, out: 解决方法: running this command rm ~/.docker/config.json before …...
View事件分发
MotionEvent 1.简介 MotionEvent 是Android系统中一个非常重要的类,它代表了屏幕上发生的触摸事件。当用户在屏幕上触摸、滑动或者长按时,都会生成一个MotionEvent对象,这个对象包含了触摸动作的各种信息。 2.事件类型 ACTION_DOWN&#x…...
监听页面的使用时间
如果是比较新的vue架构(推荐,参考若依) 监听create()和destory()两个函数,写通用的js调用函数,在路由守卫的时候使用,就可以获取到每个页面停留时间 如果是比…...
【 yolo红外微小无人机-直升机-飞机-飞鸟目标检测】
yolo无人机-直升机-飞机-飞鸟目标检测 1. 小型旋翼无人机目标检测2. yolo红外微小无人机-直升机-飞机-飞鸟目标检测3. yolo细分类型飞机-鸟类-无人机检测4. yolo红外大尺度无人机检测5. 小型固定翼无人机检测6. 大型固定翼无人机检测7. yolo航空俯视场景下机场飞机检测 1. 小型…...
Redis与数据库的一致性
Redis与数据库的数据一致性 在使用Redis作为应用缓存来提高数据的读性能时,经常会遇到Redis与数据库的数据一致性问题。简单来说,就是同一份数据同时存在于Redis和数据库,如何在数据更新的时候,保证两边数据的一致性。首先&#…...
使用maxwell实时同步mysql数据到kafka
一、软件环境: 操作系统:CentOS release 6.5 (Final) java版本: jdk1.8 zookeeper版本: zookeeper-3.4.11 kafka 版本: kafka_2.11-1.1.0.tgz maxwell版本:maxwell-1.16.0.tar.gz 注意 : 关闭所有机器的防火墙,同时注意…...
知识图谱与大数据:区别、联系与应用
目录 前言1 知识图谱1.1 定义1.2 特点1.3 应用 2 大数据2.1 定义2.2 应用 3. 区别与联系3.1 区别3.2 联系 结语 前言 在当今信息爆炸的时代,数据成为了我们生活和工作中不可或缺的资源。知识图谱和大数据是两个关键概念,它们在人工智能、数据科学和信息…...
Nagios工具
一 nagios 相关概念 Nagios 是一款开源的免费网络监视工具,能有效监控 Windows、Linux 和 Unix 的主机状态,交换机路由器等网络设置,打印机等。在系统或服务状态异常时发出邮件或短信报警第 一时间通知网站运维人员,在状态恢复后…...
微信小程序全局数据共享
文章目录 安装MobX相关的包根目录创建store文件夹,添加store.js文件绑定到页面中绑定到组件 mobx-miniprogram和mobx-miniprogram-bindings实现全局数据共享 mobx-miniprogram用来创建Store实例对象 mobx-miniprogram-bindings用来把Store中的共享数据或方法&…...
算法训练营第24天|回溯算法理论基础 LeetCode 77.组合
终于把二叉树做完了!开始新的篇章,回溯! 回溯算法理论基础 回溯算法题目分类: 1.组合 2.分割 3.子集 4.排列 5.棋盘问题 什么是回溯? 回溯叫做回溯搜索法,是一种搜索方式。回溯是递归的副产品&…...
pip永久修改镜像地址
修改命令: pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple/ 效果: 会在C:\Users\PC(用户名)\AppData\Roaming\pip目录下新增或修改文件pip.ini 文件内容: [global] index-url https://pypi.tuna.tsinghua.e…...
RK3588平台开发系列讲解(硬件篇-功能外设2)
USB2.0/USB3.0 电路 RK3588 芯片内置两个USB3.0 OTG控制器(内嵌2个USB2.0 OTG,下图绿色处),1个USB3.0 HOST 控制器,2个USB2.0 HOST控制器。 这些控制器与PHY的内部复用图如下: USB3.0 OTG0 控制器支持SS/H…...
SpringBoot学习记录
SpringBoot是用于加速Spring开发的。 我们先来看看如何使用SpringBoot来创建一个基于Web的程序,可以发现相较于SpringMVC其有巨大改变。 3.开发控制器类 GetMapping("/{id}")public String getById(PathVariable Integer id){System.out.println("…...
NaViL-9B效果实测:支持中英文混排表格图像的行列结构识别与内容提取
NaViL-9B效果实测:支持中英文混排表格图像的行列结构识别与内容提取 1. 模型介绍 NaViL-9B是新一代原生多模态大语言模型,专为处理复杂视觉-语言任务设计。与常规视觉模型不同,它不仅能够理解图片内容,还能精准解析表格、文档等…...
2024 0xGame Web安全挑战:从SQLite注入到RCE实战解析
1. SQLite注入基础与实战技巧 SQLite作为轻量级数据库,在CTF题目中经常出现。与MySQL注入相比,SQLite少了information_schema等常用表,但核心注入逻辑相通。以2024 0xGame的ez_sql题为例,我们来看具体操作: 闭合方式差…...
从Kinect到奥比中光:为什么我的深度学习项目选了Gemini 2L?附Python SDK踩坑实录
从Kinect到奥比中光:为什么我的深度学习项目选了Gemini 2L?附Python SDK踩坑实录 深度视觉技术正在重塑人机交互的边界。当我的团队启动一个需要实时三维重建的农业机器人项目时,我们面临着一个关键抉择:在众多深度相机品牌中&…...
java毕业设计基于springboot+vue的电影院座位管理系统
前言 该系统旨在实现电影院座位的高效管理,包括座位预订、售票、座位状态实时监控等功能。通过该系统,电影院可以提高售票效率,优化座位使用率,同时为顾客提供便捷的购票体验。 一、项目介绍 开发语言:Java 框架&…...
功能关键词 AI 短剧爆发:Sora、Pixverse、可灵视频重构影视行业(中外模型对比)
c.myliang.cn深耕 AI 内容创作与 SEO 优化多年,聚焦 2026 年百度 SEO/GEO 关键词布局,结合 AI 短剧行业爆发趋势,帮影视从业者快速掌握 Sora、Pixverse、可灵视频等中外模型实操技巧,适配百度算法与行业需求,低成本打造…...
Typora式优雅写作体验:基于PyTorch模型的智能Markdown内容助手
Typora式优雅写作体验:基于PyTorch模型的智能Markdown内容助手 1. 重新定义写作工具 想象一下这样的场景:你正在用Markdown写一篇技术文档,刚敲下几个关键词,编辑器就自动补全了整个段落;当你纠结某个表达是否恰当时…...
Matlab粒子动画:3D爱心生成与动态模拟
1. 从零开始理解Matlab粒子动画 第一次看到3D爱心在屏幕上跳动时,那种震撼感至今难忘。作为理工科学生,我们常常用Matlab处理枯燥的数据,但很少有人知道它还能创作出如此浪漫的视觉效果。这就像用计算器弹钢琴——工具本身没有情感࿰…...
大疆L1点云数据导出后,用CloudCompare做可视化与简单分析的完整流程
大疆L1点云数据从导出到分析:CloudCompare实战全流程指南 当你从DJI Terra中导出L1激光雷达的LAS文件时,真正的数据价值挖掘才刚刚开始。作为测绘工程师或三维建模从业者,如何将这些原始点云转化为可操作的洞察?本文将带你用开源神…...
Cats Blender插件终极指南:如何在几分钟内将任何3D模型优化为VRChat角色
Cats Blender插件终极指南:如何在几分钟内将任何3D模型优化为VRChat角色 【免费下载链接】cats-blender-plugin :smiley_cat: A tool designed to shorten steps needed to import and optimize models into VRChat. Compatible models are: MMD, XNALara, Mixamo, …...
OpenCV处理RTSP流太慢?试试把视频帧存成二进制文件吧!一个提升IO效率的实战技巧
OpenCV处理RTSP流性能优化:二进制帧存储实战指南 在实时视频分析系统中,我们常常遇到这样的困境:OpenCV能够快速解码RTSP流,但后续的处理环节(如算法推理、视频录制)却跟不上节奏。这种"解码快、消费慢…...
