Android原生PDF功能实现,kotlin开发windows程序

本文详细介绍了在Android平台上实现PDF目录树及预览缩略图的功能。首先,利用RecyclerView或ListView实现PDF目录树,展示了如何处理树形控件的折叠效果和目录文本的偏移。接着,讨论了PDF预览缩略图的实现,包括如何将PDF页面转换为图片、内存管理策略以及优化滑动体验的方法。此外,还提供了关键代码示例。
摘要由CSDN通过智能技术生成


<com.github.barteksc.pdfviewer.PDFView
android:id="@+id/pdfView"
android:layout_width=“match_parent”
android:layout_height=“match_parent”
android:layout_below="@+id/rl_top"/>

7、PDF目录树的实现

目录树的数据(目录名称、页码…),已在上个页面获取了,所以此页面只需考虑目录树控件的实现。

注意:之所以没在这个页面单独获取目录树的数据,主要考虑到android-pdfview、pdfium内存占用太大了,不想再次创建Pdf的相关对象。

7.1、PDF目录树效果图

7.2、树形控件如何实现?

安卓默认没有树形控件,不过我们可以使用RecyclerView或ListView实现。
如上图所示:

列表每一行为一条目录数据,主要包括:名称、页码;
如果有子目录,则出现箭头图片,该项可折叠、展开,箭头方向随之改变;
子目录的名称文本随目录树级别递增向右偏移;

当前Demo实现方式为RecyclerView,应该如何实现上面的效果?
可在adapter中处理页面效果、事件效果:
1、列表项内容展示

1、使用垂直线性布局管理器;
2、每个item包含:箭头图片(如果有子目录,则显示)、命令名称文本、页码文本;

2、折叠效果

1、控制adapter数据集合的内容即可,如果某节点折叠了,就把对应的子目录数据删除即可,
反之,加上,再notifyDataSetChanged通知数据源改变;
2、除此之外,还需有一个状态来标记当前节点是展开还是折叠,用于控制箭头图片方向的显示;

3、目录文本向右偏移效果

可通过目录树层级 * 固定左侧间隔(如: 20dp),然后为目录的textview控件设置偏移即可;

目录树层级树如何获取? 可选方案:
1、递归集合自动获取(需要遍历,效率低一点,如果是可编辑的目录结构,建议选择)
2、创建数据的时候,直接写死(因当前demo的PDF目录结构不会被编辑,所以直接选择这个方案吧)

7.3、代码实现:

树形控件的数据对象TreeNodeData:

/**

  • 树形控件数据类(会用于页面间传输,所以需实现Serializable 或 Parcelable)
  • 作者:齐行超
  • 日期:2019.08.07
    */
    public class TreeNodeData implements Serializable {
    //名称
    private String name;
    //页码
    private int pageNum;
    //是否已展开(用于控制树形节点图片显示,即箭头朝向图片)
    private boolean isExpanded;
    //展示级别(1级、2级…,用于控制树形节点缩进位置)
    private int treeLevel;
    //子集(用于加载子节点,也用于判断是否显示箭头图片,如集合不为空,则显示)
    private List subset;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public int getPageNum() {
return pageNum;
}

public void setPageNum(int pageNum) {
this.pageNum = pageNum;
}

public boolean isExpanded() {
return isExpanded;
}

public void setExpanded(boolean expanded) {
isExpanded = expanded;
}

public int getTreeLevel() {
return treeLevel;
}

public void setTreeLevel(int treeLevel) {
this.treeLevel = treeLevel;
}

public List getSubset() {
return subset;
}

public void setSubset(List subset) {
this.subset = subset;
}
}

树形控件适配器 : TreeAdapter

/**

  • 树形控件适配器
  • 作者:齐行超
  • 日期:2019.08.07
    */
    public class TreeAdapter extends RecyclerView.Adapter<TreeAdapter.TreeNodeViewHolder> {
    //上下文
    private Context context;
    //数据
    public List data;
    //展示数据(由层级结构改为平面结构)
    public List displayData;
    //treelevel间隔(dp)
    private int maginLeft;
    //委托对象
    private TreeEvent delegate;

/**

  • 构造函数
  • @param context 上下文
  • @param data 数据
    */
    public TreeAdapter(Context context, List data) {
    this.context = context;
    this.data = data;
    maginLeft = UIUtils.dip2px(context, 20);
    displayData = new ArrayList<>();

//数据转为展示数据
dataToDiaplayData(data);
}

/**

  • 数据转为展示数据
  • @param data 数据
    */
    private void dataToDiaplayData(List data) {
    for (TreeNodeData nodeData : data) {
    displayData.add(nodeData);
    if (nodeData.isExpanded() && nodeData.getSubset() != null) {
    dataToDiaplayData(nodeData.getSubset());
    }
    }
    }

/**

  • 数据集合转为可显示的集合
    */
    private void reDataToDiaplayData() {
    if (this.data == null || this.data.size() == 0) {
    return;
    }
    if(displayData == null){
    displayData = new ArrayList<>();
    }else{
    displayData.clear();
    }
    dataToDiaplayData(this.data);
    notifyDataSetChanged();
    }

@Override
public TreeNodeViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(context).inflate(R.layout.tree_item, null);
return new TreeNodeViewHolder(view);
}

@Override
public void onBindViewHolder(TreeNodeViewHolder holder, int position) {
final TreeNodeData data = displayData.get(position);
//设置图片
if (data.getSubset() != null) {
holder.img.setVisibility(View.VISIBLE);
if (data.isExpanded()) {
holder.img.setImageResource(R.drawable.arrow_h);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android应用开发揭秘   Windows操作系统的诞生成就了微软的霸主地位,也造就了PC时代的繁荣。然而,以Android和iPhone手机为代表   的智能移动设备的发明却敲响了PC时代的丧钟!移动互联网时代(3G时代)已经来临,谁会成为这些移动设备上的主   宰?毫无疑问,它就是Android——PC时代的Windows!   移动互联网还是一个新生的婴儿,各种移动设备上的操作系统群雄争霸!与Sym‘Dian、i P}lone OS、Wiridows Mobile   相比,Androjd有着天生的优势一完全开放和免费,对广大开发者和手机厂商而言,这是何等的诱人!此外,在Google   和以其为首的Android手机联盟的大力支持和推广下,Android不仅得到了全球开发者社区的关注,而且一大批世界一流   的手机厂商都已经或准备采用Android。   拥抱Android开发。拥抱移动开发的未来!   如果你在思考下面这些问题,也许本书就是你想要的!   Android开发与传统的J2ME开发有何相似与不同?   如何通过Shared Preferences、Files、Network和SQLite等方式高效实现Android数据的存储?又如何通过Content Providers轻松地实现Androld数据的共享?   如何使用Open Core、MediaPlayer、MediaRecorder方便快速地开发出包含音频和视频等流媒体的丰富多媒体应用?   如何利用Android 2.0新增的蓝牙特性开发包含蓝牙功能的应用?又如何使用蓝牙APL来完善应用的网络功能?   如何解决Android网络通信中的乱码问题?   在Android中如何使用语音服务和Google Map Apl? Android如何访问摄象头、传感器等硬件的APl?   如何时行Widget开发?如何用各种Android组件来打造漂亮的UI界面?   Android如何解析XML数据?又如何提高解析速度和减少对内存、CPU资源的消耗?   如何使用OpenGL ES在Android平台上开发出绚丽的3D应用?在Android平台上如何更好地设计和实现游戏引擎?   如何对Android应用进行优化?如何进行程序性能测试?如何实现UI、zipalign和图片优化?如何通过NDK利用C、C++以及通过ASE利用Python等脚本语言Android开发应用?   国内首本基于Android 2.0的经典著作,5大专业社区一致鼎力推荐!
作 者: 李文琴,李翠霞 编 出版时间: 2014 丛编项: 普通高等学校计算机教育“十二五”规划教材 内容简介   本书作为Android课程的教材,系统全面地介绍了Android应用开发所涉及的各类知识。全书共分为21章,内容包括搭建Android开发环境,Android模拟器与工具,用户界面设计,Android常用组件,深入理解Activity,Intent和BroadcastReceiver广播,用户资源的使用,Android事件处理,通知、对话框与警告,Android程序调试,图像与动画处理技术,利用OpenGL实现3D图形,多媒体应用开发Android数据存储技术,Content Provider实现数据共享,线程与消息处理,Service应用,网络通信技术,综合案例—家庭理财通,课程设计—猜猜鸡蛋放在哪只鞋子里,课程设计—简易涂鸦板。全书每章内容都与实例紧密结合,有助于学生理解知识,应用知识,达到学以致用的目的。本书附有配套DVD光盘,光盘中提供了本书所有实例、综合实例、实验、综合案例和课程设计的源代码,制作精良的电子课件PPT及教学录像,其中,源代码全部经过了精心测试,能够在Windows XP、Windows 2003、Windows 7、Windows 8系统下编译和运行。本书可作为应用型本科计算机专业、软件学院、高职软件专业及相关专业的教材,同时也可作为Android爱好者以及初、中级Android应用开发人员的参考工具书。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值