如何使用按钮单击或音量按钮自动滚动 pdfView

问题描述 投票:0回答:2

我正在使用 barteksc pdf 查看器库在我的应用程序中加载 pdf。

pdfView = findViewById(R.id.pdfView);
            pdfView.fromAsset(getResources().getString(R.string.pdfname))
                    .enableDoubletap(true)
                    .enableSwipe(true)
                    .defaultPage(pageNumber)
                    .onPageChange(mainreading.this)
                    .pageFitPolicy(FitPolicy.WIDTH)
                    .pageFling(true)
                    .linkHandler(null)
                    .enableAnnotationRendering(true)
                    .swipeHorizontal(true)
                    .scrollHandle(new DefaultScrollHandlenew(mainreading.this))
                    .enableAntialiasing(true)
                    .load();
        }

我希望 pdf 在用户单击音量增大和减小按钮开始停止时自动开始滚动。我尝试使用以下代码,同时使用 handler.performClick(); 将其包装在处理程序中但它在上下滚动时显示黑屏。

    scrollbutton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            pdfView.scrollTo(0, pdfView.getScrollY() + 24);
        }
    });

例子: https://play.google.com/store/apps/details?id=com.emptysheet.pdfreader_autoscroll&hl=en&gl=US

我想做成这样。谁能帮忙。

也尝试过这个。但它在一些滚动后显示空白页。

@Override
public boolean dispatchKeyEvent(KeyEvent event) {
    int action = event.getAction();
    int keyCode = event.getKeyCode();
    switch (keyCode) {
        case KeyEvent.KEYCODE_VOLUME_UP:
            if (action == KeyEvent.ACTION_DOWN) {
                pdfView.scrollTo(0, pdfView.getScrollY() -24);
            }
            return true;
        case KeyEvent.KEYCODE_VOLUME_DOWN:
            if (action == KeyEvent.ACTION_DOWN) {
                pdfView.scrollTo(0, pdfView.getScrollY() + 24);
            }
            return true;
        default:
            return super.dispatchKeyEvent(event);
    }
}
android-studio autoscroll pdf-viewer
2个回答
0
投票

您可以简单地使用 github 上的这个 PDF 查看器。 它基于相同的“barsteksc”pdf 查看器,具有跳转到任何页面的功能。

它是MagicalPdfViewer,您可以使用'jumpTo(pageNo)'方法简单地跳转到特定页面。它还为您提供了使用相同方法为特定页面设置动画的选项,只需将“true”作为第二个参数传递即可。

此外,如果您传递'-1'和'大于pageNo'之类的值,它会分别自动滚动到第0页和最后一页。

试一试,如果你得到你想要的,请告诉我。


0
投票
    import android.content.Context
    import android.graphics.Bitmap
    import android.graphics.Canvas
    import android.graphics.pdf.PdfRenderer
    import android.os.Bundle
    import android.os.Handler
    import android.os.Looper
    import android.os.ParcelFileDescriptor
    import android.view.View
    import android.widget.LinearLayout
    import android.widget.ScrollView
    import androidx.appcompat.app.AppCompatActivity
    import com.app.pie.R
    import java.io.File
    import java.io.FileOutputStream
    
    class PDFAutoScrollActivity : AppCompatActivity() {
    
        private lateinit var scrollView: ScrollView
        private lateinit var pdfRenderer: PdfRenderer
        private lateinit var pdfPageViews: MutableList<PdfPageView>
    
        private val scrollSpeed = 3
        private val scrollDelay = 2000
        private val scrollInterval = 10
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_pdf_auto_scroll)
    
            scrollView = findViewById(R.id.scrollView)
    
            val assetManager = applicationContext.assets
            val fileName = "sample_five.pdf" // Replace with the actual file name
            val file = File(cacheDir, fileName)
            if (!file.exists()) {
                val inputStream = assetManager.open(fileName)
                val outputStream = FileOutputStream(file)
                inputStream.copyTo(outputStream)
                inputStream.close()
                outputStream.close()
            }
    
            pdfRenderer =
                PdfRenderer(ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY))
    
            pdfPageViews = mutableListOf()
            val parentLinearLayout = LinearLayout(this)
            parentLinearLayout.orientation = LinearLayout.VERTICAL
            for (pageIndex in 0 until pdfRenderer.pageCount) {
                val pdfPage = pdfRenderer.openPage(pageIndex)
                val displayMetrics = resources.displayMetrics
                val screenWidth = displayMetrics.widthPixels
    
                val pdfPageWidth = pdfPage.width
                val pdfPageHeight = pdfPage.height
                val scaleFactor = screenWidth.toFloat() / pdfPageWidth.toFloat()
                val scaledHeight = (scaleFactor * pdfPageHeight).toInt()
                val pdfBitmap = Bitmap.createBitmap(screenWidth, scaledHeight, Bitmap.Config.ARGB_8888)
                pdfPage.render(pdfBitmap, null, null, PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY)
                pdfPage.close()
                val pdfPageView = PdfPageView(this, pdfBitmap)
                val layoutParams = LinearLayout.LayoutParams(
                    LinearLayout.LayoutParams.MATCH_PARENT,
                    scaledHeight
                )
                val linearLayout = LinearLayout(this)
                linearLayout.orientation = LinearLayout.VERTICAL
                linearLayout.addView(pdfPageView, layoutParams)
                pdfPageViews.add(pdfPageView)
                parentLinearLayout.addView(linearLayout)
            }
    
            scrollView.addView(parentLinearLayout)
            scrollView.isSmoothScrollingEnabled = true
            scrollView.postDelayed({
                startAutoScrolling()
            }, scrollDelay.toLong())
        }
    
        private fun startAutoScrolling() {
            val totalHeight = pdfPageViews.sumBy { it.height }
            val maxScrollY = totalHeight - scrollView.height
            val scrollRunnable = object : Runnable {
                var scrollY = 0
    
                override fun run() {
                    scrollY += scrollSpeed
                    if (scrollY >= maxScrollY) {
                        scrollY = maxScrollY
                    }
                    scrollView.scrollTo(0, scrollY)
                    if (scrollY < maxScrollY) {
                        scrollView.postDelayed(this, scrollInterval.toLong())
                    } else {
                        scrollView.scrollTo(0, 0)
                        Handler(Looper.getMainLooper()).postDelayed({
                            // Code to be executed after a delay
                            scrollY = 0
                            scrollView.postDelayed(this, scrollInterval.toLong())
                        }, 2000)
                    }
                }
            }
            scrollView.postDelayed(scrollRunnable, scrollDelay.toLong())
        }
    
        override fun onDestroy() {
            super.onDestroy()
            pdfRenderer.close()
        }
    
        class PdfPageView(context: Context, private val pdfBitmap: Bitmap) : View(context) {
            override fun onDraw(canvas: Canvas) {
                super.onDraw(canvas)
                canvas.drawBitmap(pdfBitmap, 0f, 0f, null)
            }
        }
    
    }

layout activity_pdf_auto_scroll

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:id="@+id/scrollView"
    android:background="@color/white"
    android:fillViewport="true"
    android:layout_height="match_parent"
    tools:context=".activity.PDFAutoScrollActivity">
</ScrollView>
© www.soinside.com 2019 - 2024. All rights reserved.