0

0

如何获取视图的总高度

PHPz

PHPz

发布时间:2024-02-06 08:35:07

|

706人浏览过

|

来源于stackoverflow

转载

问题内容

我需要获取视图的总高度来生成 pdf,以了解需要绘制的页数。

我需要使用屏幕内容生成 PDF,其中有一个包含来自数据库的数据的 ScrollView。

我为此创建了一个测试项目,请参阅下面的代码。

即使我更改 XML 添加更多图像,此代码也总是给我相同的数字:

ViewTreeObserver vto2 = layout.getViewTreeObserver();
        vto2.addOnGlobalLayoutListener (new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
                    layout.getViewTreeObserver()
                            .removeOnGlobalLayoutListener(this);
                } else {
                    layout.getViewTreeObserver()
                            .removeGlobalOnLayoutListener(this);
                }
                int width  = layout.getMeasuredWidth();
                int height = layout.getMeasuredHeight();

            }
        });

这是我的生成 PDF 代码:

public void convertXmlToPdf() {

        PdfDocument document = new PdfDocument();
        DisplayMetrics displayMetrics = new DisplayMetrics();

        int viewWidth = 1080;
        int viewHeight = 1920;

        int numPagina = 1;
        View view = LayoutInflater.from(this).inflate(R.layout.main_activity, null);

        view.measure(View.MeasureSpec.makeMeasureSpec(displayMetrics.widthPixels, View.MeasureSpec.EXACTLY),
                View.MeasureSpec.makeMeasureSpec(displayMetrics.heightPixels * numPagina, View.MeasureSpec.EXACTLY));
        view.getMeasuredHeight();

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
            this.getDisplay().getRealMetrics(displayMetrics);
        } else
            this.getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
        if(ViewCompat.isLaidOut(view)) {
            view.getHeight();
        }
        view.layout(0, 0, displayMetrics.widthPixels, displayMetrics.heightPixels);

        Display display = getWindowManager().getDefaultDisplay();
        Point m_size = new Point();
        display.getSize(m_size);

        int m_height = m_size.y;

        **double totalPages = Math.ceil(Double.parseDouble(m_height + "") / Double.parseDouble(viewHeight + "")); //TODO <----- i can't get the real height number here**
//        double totalPages = 4;

        do {
            view = LayoutInflater.from(this).inflate(R.layout.main_activity, null);

            if(numPagina == 1) {
                view.measure(View.MeasureSpec.makeMeasureSpec(displayMetrics.widthPixels, View.MeasureSpec.EXACTLY),
                        View.MeasureSpec.makeMeasureSpec(displayMetrics.heightPixels * numPagina, View.MeasureSpec.EXACTLY));
            } else {
                view.measure(View.MeasureSpec.makeMeasureSpec(displayMetrics.widthPixels, View.MeasureSpec.EXACTLY),
                        View.MeasureSpec.makeMeasureSpec(displayMetrics.heightPixels * numPagina + (displayMetrics.heightPixels * numPagina - displayMetrics.heightPixels), View.MeasureSpec.EXACTLY)); //If i don't do this the next pages don't start from where they need
            }
            view.layout(0, 0, displayMetrics.widthPixels, displayMetrics.heightPixels);
            // Create a new PdfDocument instance

            view.getMeasuredHeight();

            PdfDocument.PageInfo pageInfo = new PdfDocument.PageInfo.Builder(displayMetrics.widthPixels, displayMetrics.heightPixels, numPagina).create();

            // Start a new page
            PdfDocument.Page page = document.startPage(pageInfo);

            // Get the Canvas object to draw on the page
            Canvas canvas = page.getCanvas();

            // Create a Paint object for styling the view
            Paint paint = new Paint();
            paint.setColor(Color.BLACK);

            // Draw the view on the canvas
            view.draw(canvas);

            // Finish the page
            document.finishPage(page);
            numPagina++;
        } while (numPagina <= totalPages);


        // Specify the path and filename of the output PDF file
        File downloadsDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
        String fileName = "exampleXML.pdf";
        File filePath = new File(downloadsDir, fileName);

        try {
            // Save the document to a file
            FileOutputStream fos = new FileOutputStream(filePath);
            document.writeTo(fos);
            document.close();
            fos.close();
            // PDF conversion successful
            Toast.makeText(this, "XML to PDF Conversion Successful", Toast.LENGTH_LONG).show();
        } catch (IOException e) {
            e.printStackTrace();
            // Error occurred while converting to PDF
        }
    }

这是我的 XML 文件:




    


    

@编辑: 这是我尝试过的链接: Android:ScrollView的总高度

如何判断布局何时绘制?

@Edit2:这是创建 PDF 的教程(它只生成 1 页,因此生成更多页面的代码是我在周围找到的) https://www.youtube.com/watch?v=-JC1PI-dSeE


正确答案


代码总是给你相同的数字,因为你告诉它要给出什么数字,并将数字固定为你告诉它给出的大小。

当您根据文档将 Measurespec 设置为 EXACTLY 时

因此,您将视图尺寸强制设置为根据屏幕尺寸计算出的不正确尺寸。

在绘制 PDF 视图时,您可以将 PDF 页面设置为与屏幕相匹配的有趣尺寸,也可以将其设置为标准纸张尺寸,例如A4

微信公众平台开发入门教程 中文WORD版
微信公众平台开发入门教程 中文WORD版

由于微信的大热,为了更好的方便使用微信的用户查询一些信息,这篇文章是入门级的微信公众平台开发教程,需要的朋友可以参考下 这篇入门教程将引导你完成如下任务: 创建百度云平台应用启用微信公众平台开发模式获取订阅、文字、图片、语音、视频消息回复文本、图文及音乐消息程序开发

下载

如果您选择非标准宽度,那么您也可以使用非标准高度并且只有一页。然后,如果用户想要打印它,他们将不得不将其分成多个宽度和高度的页面。从用户的角度来看,如果只是在屏幕上查看 PDF,那么使用多个页面没有任何好处

我认为最好坚持使用 PDF 的标准页面大小,然后将 PDF 视为一个单独的低分辨率屏幕,与设备的物理屏幕尺寸无关(他们可以上下左右滚动页面)和右)

当您测量单个视图时,您正在测量整个视图及其所有子视图,您无法测量切片(您想要在第二页和第三页上看到的内容)。

从视图创建多页 PDF 有两种主要方法。

  1. 绘制所有内容,然后切片和切块到多个页面,使用这种方法,您可能会拥有在页面之间分割的项目,例如一页上某些文本行的上半部分和另一页上的下半部分使其无法阅读。这不是一个好方法。

  2. 迭代父视图的子视图,测量每个子视图,然后将它们添加到单个页面的布局中。通过这种方式,您可以获得每个子视图的大小,然后可以计算已添加的所有视图的累积大小,以查看它是否对于您的页面大小来说太大。如果太大,您将关闭 PDF 页面并开始布局到新页面。这意味着项目不会跨页面拆分(这样好多了)。

https://www.php.cn/link/ea89621bee7c88b2c5be6681c8ef4906 是一个完整的示例,说明如何通过测量各个子视图,从可滚动屏幕生成多页 PDF(在本例中,可滚动屏幕是一个回收视图,但您可以以类似的方式迭代滚动视图的子项目)。

请注意,A4 页面的分辨率非常低,因此物理屏幕的正常字体大小(或其他项目大小)可能会太大,因此您需要像通常情况下那样调整这些大小不同屏幕尺寸的布局)。还有另一种方法可以调整 PDF 页面的低分辨率,将其绘制为 PDF 页面大小的倍数,然后在 PDF 画布上设置比例以将其缩放回正确的大小,例如绘制到两倍大的布局,然后在绘制到 PDF 页面时将所有内容缩放回一半大小。

虽然您可能遇到的问题是您的 Textview 可能在一个块中包含的文本多于一页所能容纳的文本,但这些应该需要额外的处理,以创建两个 Textview 而不是一个。

相关专题

更多
pdf怎么转换成xml格式
pdf怎么转换成xml格式

将 pdf 转换为 xml 的方法:1. 使用在线转换器;2. 使用桌面软件(如 adobe acrobat、itext);3. 使用命令行工具(如 pdftoxml)。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1852

2024.04.01

xml怎么变成word
xml怎么变成word

步骤:1. 导入 xml 文件;2. 选择 xml 结构;3. 映射 xml 元素到 word 元素;4. 生成 word 文档。提示:确保 xml 文件结构良好,并预览 word 文档以验证转换是否成功。想了解更多xml的相关内容,可以阅读本专题下面的文章。

2080

2024.08.01

xml是什么格式的文件
xml是什么格式的文件

xml是一种纯文本格式的文件。xml指的是可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。想了解更多相关的内容,可阅读本专题下面的相关文章。

923

2024.11.28

go语言 数组和切片
go语言 数组和切片

本专题整合了go语言数组和切片的区别与含义,阅读专题下面的文章了解更多详细内容。

45

2025.09.03

数据库三范式
数据库三范式

数据库三范式是一种设计规范,用于规范化关系型数据库中的数据结构,它通过消除冗余数据、提高数据库性能和数据一致性,提供了一种有效的数据库设计方法。本专题提供数据库三范式相关的文章、下载和课程。

332

2023.06.29

如何删除数据库
如何删除数据库

删除数据库是指在MySQL中完全移除一个数据库及其所包含的所有数据和结构,作用包括:1、释放存储空间;2、确保数据的安全性;3、提高数据库的整体性能,加速查询和操作的执行速度。尽管删除数据库具有一些好处,但在执行任何删除操作之前,务必谨慎操作,并备份重要的数据。删除数据库将永久性地删除所有相关数据和结构,无法回滚。

2068

2023.08.14

vb怎么连接数据库
vb怎么连接数据库

在VB中,连接数据库通常使用ADO(ActiveX 数据对象)或 DAO(Data Access Objects)这两个技术来实现:1、引入ADO库;2、创建ADO连接对象;3、配置连接字符串;4、打开连接;5、执行SQL语句;6、处理查询结果;7、关闭连接即可。

346

2023.08.31

MySQL恢复数据库
MySQL恢复数据库

MySQL恢复数据库的方法有使用物理备份恢复、使用逻辑备份恢复、使用二进制日志恢复和使用数据库复制进行恢复等。本专题为大家提供MySQL数据库相关的文章、下载、课程内容,供大家免费下载体验。

251

2023.09.05

php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

7

2025.12.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号