Rumah >Java >Bagaimana untuk mendapatkan jumlah ketinggian pandangan

Bagaimana untuk mendapatkan jumlah ketinggian pandangan

PHPz
PHPzke hadapan
2024-02-06 08:35:07669semak imbas
Kandungan soalan

Saya perlu mendapatkan jumlah ketinggian paparan untuk menjana PDF untuk mengetahui berapa banyak halaman yang perlu dilukis.

Saya perlu menjana PDF menggunakan kandungan skrin, yang mempunyai ScrollView yang mengandungi data daripada pangkalan data.

Saya mencipta projek ujian untuk ini, lihat kod di bawah.

Walaupun saya menukar XML untuk menambah lebih banyak imej, kod ini sentiasa memberi saya nombor yang sama:

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

            }
        });

Ini adalah kod PDF yang saya hasilkan:

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

Ini ialah fail XML saya:

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

@editor: Berikut adalah pautan kepada apa yang saya telah cuba: Android: Jumlah ketinggian ScrollView

Bagaimana untuk mengetahui apabila susun atur dilukis?

@Edit2: Berikut ialah tutorial untuk membuat PDF (ia hanya menghasilkan 1 halaman, jadi kod untuk menjana lebih banyak halaman adalah apa yang saya dapati terletak di sekeliling) https://www.youtube.com/watch?v=-JC1PI-dSeE


Jawapan Betul


Kod ini sentiasa memberi anda nombor yang sama kerana anda memberitahu nombor yang hendak diberikan dan menetapkan nombor itu kepada Anda memberitahunya saiz yang diberikan.

Apabila anda menetapkan Measurespec kepada TEPAT setiap docs

Jadi anda memaksa saiz paparan kepada saiz yang salah yang dikira berdasarkan saiz skrin.

Apabila melukis paparan PDF, anda boleh menetapkan halaman PDF kepada saiz yang menyeronokkan yang sepadan dengan skrin anda, atau anda boleh menetapkannya kepada saiz kertas standard, seperti A4

Jika anda memilih lebar bukan standard, maka anda juga boleh menggunakan ketinggian bukan standard dan hanya mempunyai satu halaman. Kemudian, jika pengguna ingin mencetaknya, mereka perlu membahagikannya kepada halaman yang mempunyai berbilang lebar dan tinggi. Dari perspektif pengguna, tiada faedah menggunakan berbilang halaman jika anda hanya melihat PDF pada skrin

Saya rasa lebih baik untuk mengekalkan saiz halaman standard PDF, dan kemudian menganggap PDF sebagai skrin peleraian rendah yang berasingan, tanpa mengira saiz skrin fizikal peranti (mereka boleh menatal halaman ke atas, bawah, kiri, dan kanan)

Apabila anda mengukur satu paparan, anda mengukur keseluruhan paparan dan semua subviewnya, anda tidak boleh mengukur kepingan (apa yang anda mahu lihat pada halaman kedua dan ketiga).

Terdapat dua cara utama untuk membuat PDF berbilang halaman daripada paparan.

  1. Lukis segala-galanya dan kemudian potong dan potong merentasi berbilang halaman, menggunakan kaedah ini, anda mungkin mempunyai item dipisahkan antara halaman, seperti separuh atas beberapa baris teks pada satu halaman dan separuh atas beberapa baris pada halaman lain Bahagian bawah menjadikannya tidak boleh dibaca. Ini bukan pendekatan yang baik.

  2. Lelaran pada subview paparan induk, ukur setiap subview dan tambahkannya pada reka letak satu halaman. Dengan cara ini anda boleh mendapatkan saiz setiap subview dan kemudian mengira saiz terkumpul semua paparan yang telah anda tambahkan untuk melihat sama ada ia terlalu besar untuk saiz halaman anda. Jika terlalu besar, anda akan menutup halaman PDF dan mula meletakkan ke halaman baharu. Ini bermakna item tidak dibahagikan merentas halaman (yang lebih baik).

https://www.php.cn/link/ea89621bee7c88b2c5be6681c8ef4906 ialah contoh lengkap cara menjana PDF berbilang halaman daripada skrin boleh tatal dengan mengukur subview individu (dalam kes ini, skrin boleh tatal ialah paparan kitar semula, tetapi anda boleh mengulangi item anak paparan tatal dengan cara yang sama).

Sila ambil perhatian bahawa resolusi halaman A4 adalah sangat rendah, jadi saiz fon biasa (atau saiz projek lain) untuk skrin fizikal mungkin terlalu besar, jadi anda perlu mengubah saiz reka letak ini seperti biasa untuk saiz skrin yang berbeza) . Terdapat satu lagi cara untuk mengubah saiz halaman PDF untuk peleraian rendah, melukisnya kepada berbilang saiz halaman PDF, dan kemudian menetapkan skala pada kanvas PDF untuk menskalakannya semula kepada saiz yang betul, cth sebesar, Kemudian skala semuanya kembali kepada separuh saiz apabila melukis ke halaman PDF.

Walaupun masalah yang mungkin anda hadapi ialah Paparan Teks anda mungkin mengandungi lebih banyak teks dalam blok daripada yang boleh dimuatkan pada satu halaman, ini sepatutnya memerlukan pemprosesan tambahan untuk mencipta dua Paparan Teks dan bukannya satu.

Atas ialah kandungan terperinci Bagaimana untuk mendapatkan jumlah ketinggian pandangan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam