Heim  >  Artikel  >  So ermitteln Sie die Gesamthöhe einer Ansicht

So ermitteln Sie die Gesamthöhe einer Ansicht

PHPz
PHPznach vorne
2024-02-06 08:35:07606Durchsuche
Frageninhalt

Ich muss die Gesamthöhe der Ansicht ermitteln, um ein PDF zu erstellen, um zu wissen, wie viele Seiten gezeichnet werden müssen.

Ich muss mithilfe von Bildschirminhalten ein PDF generieren, das über eine ScrollView mit Daten aus einer Datenbank verfügt.

Ich habe hierfür ein Testprojekt erstellt, siehe Code unten.

Selbst wenn ich das XML ändere, um weitere Bilder hinzuzufügen, gibt mir dieser Code immer die gleiche Nummer:

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();

            }
        });

Das ist mein generierter PDF-Code:

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
        }
    }

Das ist meine XML-Datei:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical"
    android:id="@+id/rootview">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="16dp"
        android:text="Learn to Create PDF"
        android:textStyle="bold"
        android:textColor="@color/black"/>


    <Button
        android:id="@+id/btnCreatePdf"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Create PDF" />

    <Button
        android:id="@+id/btnXMLToPDF"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Convert XML View to PDF" />

    <ScrollView
        android:layout_width="wrap_content"
        android:layout_height="match_parent">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center"
                android:padding="30px"
                android:text="1"
                android:textColor="@color/black" />

            <ImageView
                android:id="@+id/image"
                android:layout_width="wrap_content"
                android:layout_height="360px"
                android:src="@drawable/logo_om"
                android:visibility="visible" />

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center"
                android:padding="30px"
                android:text="2"
                android:textColor="@color/black"/>

            <ImageView
                android:layout_width="wrap_content"
                android:layout_height="360px"
                android:src="@drawable/logo_om"
                android:visibility="visible" />

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center"
                android:padding="30px"
                android:text="3"
                android:textColor="@color/black"/>


            <ImageView
                android:layout_width="wrap_content"
                android:layout_height="360px"
                android:src="@drawable/logo_om"
                android:visibility="visible" />

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center"
                android:padding="30px"
                android:text="4"
                android:textColor="@color/black"/>

            <ImageView
                android:layout_width="wrap_content"
                android:layout_height="360px"
                android:src="@drawable/logo_om"
                android:visibility="visible" />

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center"
                android:padding="30px"
                android:text="5"
                android:textColor="@color/black" />

            <ImageView
                android:layout_width="wrap_content"
                android:layout_height="360px"
                android:src="@drawable/logo_om"
                android:visibility="visible" />

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center"
                android:padding="30px"
                android:text="FINAL DO DOCUMENTO" />

        </LinearLayout>

    </ScrollView>


</LinearLayout>

@Herausgeber: Hier sind die Links zu dem, was ich versucht habe: Android: Gesamthöhe von ScrollView

Wie erkennt man, wann ein Layout gezeichnet wird?

@Edit2: Hier ist ein Tutorial zum Erstellen eines PDFs (es generiert nur eine Seite, daher habe ich den Code zum Generieren weiterer Seiten gefunden) https://www.youtube.com/watch?v=-JC1PI-dSeE


Richtige Antwort


Der Code gibt Ihnen immer die gleiche Nummer, weil Sie ihm sagen, welche Nummer er vergeben soll, und die Nummer festlegen. Sie sagen es ihm die angegebene Größe.

Wenn Sie Measurespec auf EXACTLY per docs

setzen

Sie erzwingen also, dass die Ansichtsgröße auf der Grundlage der Bildschirmgröße falsch berechnet wird.

Beim Zeichnen einer PDF-Ansicht können Sie die PDF-Seite auf eine angenehme Größe einstellen, die zu Ihrem Bildschirm passt, oder Sie können sie auf ein Standardpapierformat wie A4 einstellen

Wenn Sie eine nicht standardmäßige Breite wählen, können Sie auch eine nicht standardmäßige Höhe verwenden und nur eine Seite haben. Wenn der Benutzer es dann drucken wollte, musste er es in Seiten mit mehreren Breiten und Höhen aufteilen. Aus Benutzersicht bietet die Verwendung mehrerer Seiten keinen Vorteil, wenn Sie das PDF nur auf dem Bildschirm anzeigen

Ich denke, es ist besser, bei der Standardseitengröße des PDF zu bleiben und das PDF dann als separaten Bildschirm mit niedriger Auflösung zu behandeln, unabhängig von der physischen Bildschirmgröße des Geräts (sie können die Seite nach oben, unten, links und rechts scrollen). )

Wenn Sie eine einzelne Ansicht messen, messen Sie die gesamte Ansicht und alle ihre Unteransichten. Sie können keine Slices messen (was Sie auf der zweiten und dritten Seite sehen möchten).

Es gibt zwei Möglichkeiten, mehrseitige PDFs aus Ansichten zu erstellen.

  1. Zeichnen Sie alles und schneiden Sie es dann in Scheiben und Würfel auf mehrere Seiten. Mit dieser Methode können Sie Elemente auf mehrere Seiten aufteilen, z. B. die obere Hälfte einiger Textzeilen auf einer Seite und die obere Hälfte einiger Zeilen auf einer anderen Seite. Der untere Teil macht es unlesbar. Das ist kein guter Ansatz.

  2. Durchlaufen Sie die Unteransichten der übergeordneten Ansicht, messen Sie jede Unteransicht und fügen Sie sie dem Layout einer einzelnen Seite hinzu. Auf diese Weise können Sie die Größe jeder Unteransicht ermitteln und dann die kumulative Größe aller von Ihnen hinzugefügten Ansichten berechnen, um festzustellen, ob sie für Ihre Seitengröße zu groß ist. Wenn es zu groß ist, schließen Sie die PDF-Seite und beginnen mit dem Layout auf einer neuen Seite. Dies bedeutet, dass Elemente nicht auf mehrere Seiten aufgeteilt werden (was viel besser ist).

https://www.php.cn/link/ea89621bee7c88b2c5be6681c8ef4906 ist ein vollständiges Beispiel dafür, wie man aus einem scrollbaren Bildschirm ein mehrseitiges PDF generiert, indem man einzelne Unteransichten misst (in diesem Fall ist der scrollbare Bildschirm eine Recycling-Ansicht). Sie können jedoch auf ähnliche Weise über die untergeordneten Elemente der Bildlaufansicht iterieren.

Bitte beachten Sie, dass A4-Seiten eine sehr niedrige Auflösung haben, sodass die normale Schriftgröße (oder eine andere Projektgröße) für den physischen Bildschirm möglicherweise zu groß ist. Daher müssen Sie die Größe dieser Layouts wie gewohnt für andere Bildschirmgrößen anpassen. Es gibt eine andere Möglichkeit, die Größe einer PDF-Seite für eine niedrige Auflösung zu ändern: Zeichnen Sie sie auf ein Vielfaches der PDF-Seitengröße und stellen Sie dann den Maßstab auf der PDF-Leinwand ein, um sie wieder auf die richtige Größe zu skalieren, z. B. auf ein Layout, das doppelt so groß ist so groß. Skalieren Sie dann beim Zeichnen auf der PDF-Seite alles auf die halbe Größe zurück.

Während das Problem, auf das Sie möglicherweise stoßen, darin besteht, dass Ihre Textansicht möglicherweise mehr Text in einem Block enthält, als auf eine Seite passt, sollten diese eine zusätzliche Verarbeitung erfordern, um zwei Textansichten anstelle einer zu erstellen.

Das obige ist der detaillierte Inhalt vonSo ermitteln Sie die Gesamthöhe einer Ansicht. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen