100ASK_IMX6ULL-PRO 数码相框扩展项目:支持打开阅读 TXT 文件

news/2024/11/29 21:05:33/文章来源:https://www.cnblogs.com/libq8/p/18568297

背景说明

本篇内容基于百问网嵌入式Linux项目数码相框与文件浏览器和嵌入式Linux电子书阅读器

需求:在文件浏览器界面中支持双击打开TXT类型文件,进入新界面进行文本阅读和翻页控制。

实现思路说明

浏览器界面中响应双击操作,识别TXT类型文件成功后进入阅读器界面。可参考项目中图片类型(BMP,JPG,PNG)文件的处理逻辑

else if (isTextFileSupported(tPageParams.strCurPictureFile)){// 支持文本文件的编码格式DBG_PRINTF("点击打开文件 %s\n", tPageParams.strCurPictureFile);tPageParams.iPageID = ID("browse");Page("reading")->Run(&tPageParams);ShowBrowsePage(&g_tBrowsePageMenuIconsLayout);
}

核心内容:阅读器界面的设计与实现

参考项目数码相框与文件浏览器中界面框架的设计(主界面和浏览器界面),主要包含:

  • UI 部分:通过Layout布局设计按钮和内容显示区域
  • 事件处理:捕获输入事件并响应,完成业务逻辑

业务逻辑的设计实现参考 嵌入式Linux电子书阅读器:

  • 内容显示:在指定区域内显示文本文字,直到满页或者文件尾记为一页。

  • 按钮响应:

    • “返回”:退出阅读器界面,跳转到浏览器界面
    • “上一页”:刷新显示文本内容逻辑上前面的部分,区域满屏记为上一页。当前为第一页则不响应处理。
    • “下一页”:刷新显示文本内容逻辑上后面的部分,区域满屏或者达到文件尾记为下一页。

内容显示:

static int ShowTextInReadingPage(PT_VideoMem ptVideoMem, char *strFileName)
{int iError;// 打开文本文件strncpy(g_tFileMap.strFileName, strFileName, 256);g_tFileMap.strFileName[255] = '\0';iError = MapFile(&g_tFileMap);if (iError){DBG_PRINTF("MapFile %s error!\n", strFileName);return 0;}// 确认文件编码g_ptEncodingOprForFile = SelectEncodingOprForFile(g_tFileMap.pucFileMapMem);if (!g_ptEncodingOprForFile){DBG_PRINTF("SelectEncodingOprForFile %s error!\n", strFileName);UnMapFile(&g_tFileMap);return 0;}// 第一个显示字符紧接在文件头后面g_pucLcdFirstPosAtFile = g_tFileMap.pucFileMapMem + g_ptEncodingOprForFile->iHeadLen;// 在打开的文件中标记索引位置,在显示设备上逐行逐个显示字符// 自动记录当前的进度,重新打开时恢复unsigned char *pucTextFileMemCurPos;if (g_ptCurPage){pucTextFileMemCurPos = g_ptCurPage->pucLcdFirstPosAtFile;	// 上一次阅读界面的第一个字符}else{pucTextFileMemCurPos = g_pucLcdFirstPosAtFile;				// 文本文件中的第一个字符}iError = ShowOnePage(pucTextFileMemCurPos, ptVideoMem);return 0;
}

函数ShowOnePage实现的功能:

  • 逐个获取文件中的字符

    • 处理特殊字符,如换行

    • 对于文字字符,通过字符文件获取矢量位图,调整位置后显示到 LCD 设备上

      • 项目已支持相关接口: GetCodeFrmBuf通过字符文件获取矢量位图,MergeOneFontToVideoMem显示单个字符到 LCD 设备上
  • 到达文件尾部或者满页,则完成一页显示

翻页控制

记录显示的每一页:

typedef struct PageDesc {int iPage;unsigned char *pucLcdFirstPosAtFile;unsigned char *pucLcdNextPageFirstPosAtFile;struct PageDesc *ptPrePage;struct PageDesc *ptNextPage;
} T_PageDesc, *PT_PageDesc;

通过链表管理显示页面,实现逻辑上的翻页显示:

static void RecordPage(PT_PageDesc ptPageNew)
{PT_PageDesc ptPage;if (!g_ptPages){g_ptPages = ptPageNew;}else{ptPage = g_ptPages;while (ptPage->ptNextPage){ptPage = ptPage->ptNextPage;}ptPage->ptNextPage   = ptPageNew;ptPageNew->ptPrePage = ptPage;}
}

效果展示

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

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

相关文章

mysql数据库聚合与拆分

1. 背景在用户使用的时候会有统计数据的情况,在多表联查的时候分类时会有,同一个类型出现多次,然后任务需区是出现一次类型名 2. 聚合查询 GROUP_CONCAT(聚合字段) group_by(聚合字段)SELECT report.serialNumber as 病人编号, GROUP_CONCAT(label.lableName) AS &q…

GIS与数字孪生融合:打造智能3D空域管理平台

在数字化转型的浪潮中,地理信息系统(GIS)技术正以其独特的空间分析能力,为城市规划和管理带来革命性的变化。今天,我们将探讨一个前沿话题:基于GIS技术的数字孪生3D空域规划与飞行信息管理平台。 什么是数字孪生?数字孪生,简而言之,就是物理世界中的实体在数字世界中的…

iOS内购——自动续订型会员

原文链接:https://blog.csdn.net/HMOnlyou/article/details/139446159 一、内购支付流程 用户选择商品,发起购买操作,支付完成(会从AppleID账号关联的支付宝/微信 /银行卡完成扣款); 拿到APP本地生成的票据信息发送到苹果服务器验证有效性。1)APP端可以直接向苹果服务器…

微信小游戏sdk接入支付和登录,解决了wx原生不支持ios支付的痛点

本文介绍了微信小游戏sdk登录支付的接入。支付又分为 android支付和 ios支付。由于微信小游戏内不支持ios支付, 通过引入客服会话的方式实现。 侧重于服务器方向,对于复杂的验证签名、解密算法部分提供了Go版本的代码支持【原创】前情提要 微信小游戏是小程序的一种。 项目接入…

vxe-form table 表单修改数据校验错误提示的样式

官网:https://vxeui.com<template><div><vxe-formv-bind="formOptions"@submit="submitEvent"@reset="resetEvent"></vxe-form></div> </template><script> import { VxeUI } from vxe-pc-uiexport …

vxe-form table 设置表单上下布局

官网:https://vxeui.com<template><div><vxe-formv-bind="formOptions"@submit="submitEvent"@reset="resetEvent"></vxe-form></div> </template><script> import { VxeUI } from vxe-pc-uiexport …

LeetCode19 删除链表的倒数第 N 个结点

删除链表的倒数第 N 个结点LeetCode19 删除链表的倒数第 N 个结点 题目链接:LeetCode19 描述 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。示例输入:head = [1,2,3,4,5], n = 2 输出:[1,2,3,5]思路定义fast指针和slow指针,初始值为虚拟头结点 fast首先…

法律咨询行业知识库构建:数字化与智能工具的应用

在法律咨询行业中,构建高效、准确的知识库对于提升服务质量、优化客户体验至关重要。随着数字化转型的推进,数字化知识库已成为法律咨询行业发展的重要方向。本文将探讨法律咨询行业知识库构建的重要性、挑战,并介绍如何利用“HelpLook”工具实现数字化知识库的构建。 一、法…

功能齐全的jquery图片查看器插件

lightgallery.js是一款功能齐全的jquery图片查看器插件。该jquery图片查看器插件采用响应式设计,提供图片查看,图片轮播,图片放大等功能。它的特点还有:演示 下载以模态窗口的形式全屏展示图片。 显示图片的标题。 可以实现图片的懒加载。 可以自动播放图片,并提供进度条…

【转】cesium之添加天地图

转自 https://www.cnblogs.com/s313139232/p/16351468.html 公共参数:var token = 7b56038c276128a86a5b946404bf4df4;// 服务域名var tdtUrl = https://t{s}.tianditu.gov.cn/;// 服务负载子域var subdomains=[0,1,2,3,4,5,6,7];添加矢量底图:let layer1 = new Cesium.WebMa…

数据集编排加速介绍

1. 模型训练&存储的基本概念 1.1 M-P神经元模型 在生物神经网络中,每个神经元与其他神经元相连,当它“兴奋”时,就会向相连的神经元发送化学物质,从而改变这些神经元内的电位;如果某神经元的电位超过了一个“阈值”,那么它就会被激活,即“兴奋”起来,向其他神经元发…

鸿蒙NEXT开发案例:亲戚关系计算器

【引言】 在快节奏的现代生活中,人们往往因为忙碌而忽略了与亲戚间的互动,特别是在春节期间,面对众多的长辈和晚辈时,很多人会感到困惑,不知道该如何正确地称呼每一位亲戚。针对这一问题,我们开发了一款基于鸿蒙NEXT平台的“亲戚关系计算器”应用,旨在帮助用户快速、准确…