我正在使用 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);
}
}
您可以简单地使用 github 上的这个 PDF 查看器。 它基于相同的“barsteksc”pdf 查看器,具有跳转到任何页面的功能。
它是MagicalPdfViewer,您可以使用'jumpTo(pageNo)'方法简单地跳转到特定页面。它还为您提供了使用相同方法为特定页面设置动画的选项,只需将“true”作为第二个参数传递即可。
此外,如果您传递'-1'和'大于pageNo'之类的值,它会分别自动滚动到第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>