From c03e2b2cb1ca8a183e121d43659f00edaf2a0b1d Mon Sep 17 00:00:00 2001 From: ocean <503259349@qq.com> Date: Thu, 25 Sep 2025 16:14:41 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E8=B7=B3=E8=BD=AC=E9=A1=B5?= =?UTF-8?q?=E9=9D=A2=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pro/app/model/FileActionEvent.kt | 6 + .../pro/app/ui/act/PdfViewActivity.kt | 44 +++++-- .../pro/app/ui/act/SplitPdfActivity.kt | 2 +- .../app/ui/dialog/GotoPageDialogFragment.kt | 113 ++++++++++++++++++ .../app/ui/dialog/ListMoreDialogFragment.kt | 8 ++ .../app/ui/dialog/ViewModelDialogFragment.kt | 8 +- .../pro/app/viewmodel/PdfViewModel.kt | 24 ++++ app/src/main/res/drawable/goto_page.xml | 12 ++ app/src/main/res/drawable/share.xml | 5 +- app/src/main/res/layout/activity_pdf_view.xml | 7 -- app/src/main/res/layout/dialog_goto_page.xml | 82 +++++++++++++ app/src/main/res/layout/dialog_list_more.xml | 38 ++++-- app/src/main/res/values/colors.xml | 1 + app/src/main/res/values/strings.xml | 4 + 14 files changed, 322 insertions(+), 32 deletions(-) create mode 100644 app/src/main/java/com/all/pdfreader/pro/app/ui/dialog/GotoPageDialogFragment.kt create mode 100644 app/src/main/res/drawable/goto_page.xml create mode 100644 app/src/main/res/layout/dialog_goto_page.xml diff --git a/app/src/main/java/com/all/pdfreader/pro/app/model/FileActionEvent.kt b/app/src/main/java/com/all/pdfreader/pro/app/model/FileActionEvent.kt index bb7f878..3ea24df 100644 --- a/app/src/main/java/com/all/pdfreader/pro/app/model/FileActionEvent.kt +++ b/app/src/main/java/com/all/pdfreader/pro/app/model/FileActionEvent.kt @@ -21,6 +21,12 @@ sealed class FileActionEvent { //只做通知,不携带任何数据,使用object。 object NoticeReload : FileActionEvent() + data class SetColorInversion(val b: Boolean) : FileActionEvent() + data class SetPageFling(val b: Boolean) : FileActionEvent() + data class SetSwipeVertical(val b: Boolean) : FileActionEvent() + + data class GotoPage(val number: Int): FileActionEvent() + data class AddBookmark(val success: Boolean) : FileActionEvent() data class UpdateBookmark(val success: Boolean) : FileActionEvent() data class DeleteBookmark(val success: Boolean) : FileActionEvent() diff --git a/app/src/main/java/com/all/pdfreader/pro/app/ui/act/PdfViewActivity.kt b/app/src/main/java/com/all/pdfreader/pro/app/ui/act/PdfViewActivity.kt index f0703e2..12fbe2a 100644 --- a/app/src/main/java/com/all/pdfreader/pro/app/ui/act/PdfViewActivity.kt +++ b/app/src/main/java/com/all/pdfreader/pro/app/ui/act/PdfViewActivity.kt @@ -98,12 +98,6 @@ class PdfViewActivity : BaseActivity(), OnLoadCompleteListener, OnPageChangeList } } - viewModel.fileActionEvent.observeEvent(this) { - logDebug("observeEvent NoticeReload") - val file = File(pdfDocument.filePath) - loadPdfInternal(file, null) - } - viewModel.fileActionEvent.observeEvent(this) { if (it.success) { showToast(getString(R.string.bookmark_add_success)) @@ -136,6 +130,32 @@ class PdfViewActivity : BaseActivity(), OnLoadCompleteListener, OnPageChangeList showToast(getString(R.string.removed_from_favorites)) } } + + viewModel.fileActionEvent.observeEvent(this) { event -> + val file = File(pdfDocument.filePath) + loadPdfInternal(file, null) + } + + viewModel.fileActionEvent.observeEvent(this) { event -> + binding.pdfview.apply { + setNightMode(event.b) + loadPages() + if (event.b) { + setBackgroundColor(getColor(R.color.night_mode_bg_color)) + } else { + setBackgroundColor(getColor(R.color.grey)) + } + } + } + viewModel.fileActionEvent.observeEvent(this) { event -> + val file = File(pdfDocument.filePath) + loadPdfInternal(file, null) + } + viewModel.fileActionEvent.observeEvent(this) { event -> + binding.pdfview.apply { + jumpTo(event.number - 1) + } + } } private fun initView() { @@ -188,7 +208,6 @@ class PdfViewActivity : BaseActivity(), OnLoadCompleteListener, OnPageChangeList //PDF 文档加载完成时回调 override fun loadComplete(nbPages: Int) { - //加载完毕进行一次缩放 binding.pdfview.resetZoomWithAnimation() } @@ -258,17 +277,24 @@ class PdfViewActivity : BaseActivity(), OnLoadCompleteListener, OnPageChangeList onTap(this@PdfViewActivity) // 单击回调 onPageChange(this@PdfViewActivity) // 页面改变回调 scrollHandle(CustomScrollHandle(this@PdfViewActivity)) // 自定义的页数展示 + if (appStore.isPageFling) { pageSnap(true)//页面可在逐页中,可居中展示,非逐页模式,滑动停止后可自动定格在居中位置。 - autoSpacing(true)//开启逐页就开启自动间距 pageFling(true)//逐页 + autoSpacing(true) } else { - spacing(10) + pageSnap(false) pageFling(false) + spacing(10) } swipeHorizontal(!appStore.isVertical) nightMode(appStore.isColorInversion) }.load() + if (appStore.isColorInversion) { + binding.pdfview.setBackgroundColor(getColor(R.color.night_mode_bg_color)) + } else { + binding.pdfview.setBackgroundColor(getColor(R.color.grey)) + } } private fun toggleFullScreen() { diff --git a/app/src/main/java/com/all/pdfreader/pro/app/ui/act/SplitPdfActivity.kt b/app/src/main/java/com/all/pdfreader/pro/app/ui/act/SplitPdfActivity.kt index ecec993..cf5ac5c 100644 --- a/app/src/main/java/com/all/pdfreader/pro/app/ui/act/SplitPdfActivity.kt +++ b/app/src/main/java/com/all/pdfreader/pro/app/ui/act/SplitPdfActivity.kt @@ -98,7 +98,7 @@ class SplitPdfActivity : BaseActivity() { RenameType.NAME, null, item.fileName, onOkClickString = { string -> selectedList[pos].fileName = string selectedPdfAdapter.updateItem(pos) - }).show(supportFragmentManager, "BookmarksDialogFragment") + }).show(supportFragmentManager, "SplitPdfActivity") }, onDeleteClick = { item, pos -> selectedList.remove(item) selectedPdfAdapter.removeItem(pos) diff --git a/app/src/main/java/com/all/pdfreader/pro/app/ui/dialog/GotoPageDialogFragment.kt b/app/src/main/java/com/all/pdfreader/pro/app/ui/dialog/GotoPageDialogFragment.kt new file mode 100644 index 0000000..67ad691 --- /dev/null +++ b/app/src/main/java/com/all/pdfreader/pro/app/ui/dialog/GotoPageDialogFragment.kt @@ -0,0 +1,113 @@ +package com.all.pdfreader.pro.app.ui.dialog + +import android.graphics.Color +import android.os.Bundle +import android.text.Editable +import android.text.TextWatcher +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.Toast +import androidx.core.graphics.drawable.toDrawable +import androidx.fragment.app.DialogFragment +import androidx.fragment.app.activityViewModels +import com.all.pdfreader.pro.app.R +import com.all.pdfreader.pro.app.databinding.DialogGotoPageBinding +import com.all.pdfreader.pro.app.databinding.DialogRenameFileBinding +import com.all.pdfreader.pro.app.model.RenameType +import com.all.pdfreader.pro.app.room.entity.BookmarkEntity +import com.all.pdfreader.pro.app.room.entity.PdfDocumentEntity +import com.all.pdfreader.pro.app.util.AppUtils.showKeyboard +import com.all.pdfreader.pro.app.util.FileUtils +import com.all.pdfreader.pro.app.util.ToastUtils +import com.all.pdfreader.pro.app.viewmodel.PdfViewModel +import java.io.File + +class GotoPageDialogFragment( + private val onOkClick: () -> Unit = {}, +) : DialogFragment() { + + private lateinit var binding: DialogGotoPageBinding + private val viewModel: PdfViewModel by activityViewModels() + private lateinit var pdfDocument: PdfDocumentEntity + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + ): View? { + binding = DialogGotoPageBinding.inflate(layoutInflater) + return binding.root + } + + override fun onStart() { + super.onStart() + dialog?.window?.apply { + // 去掉系统默认的背景 padding + setBackgroundDrawable(Color.TRANSPARENT.toDrawable()) + // 设置宽度为全屏减去 16dp + val margin = resources.getDimensionPixelSize(R.dimen.dialog_margin) // 16dp + val width = resources.displayMetrics.widthPixels - margin * 2 + setLayout(width, ViewGroup.LayoutParams.WRAP_CONTENT) + } + } + + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + viewModel.pdfDocument.value?.let { + pdfDocument = it + initView() + setupOnClick() + } ?: run { + showToast(getString(R.string.file_not)) + dismiss() + } + } + + private fun initView() { + binding.etName.showKeyboard() + binding.tilName.hint = getString(R.string.name_must_be_number, pdfDocument.pageCount) + } + + private fun setupOnClick() { + binding.tvCancel.setOnClickListener { + dismiss() + } + binding.tvConfirm.setOnClickListener { + val text = binding.etName.text.toString() + if (validateEnter(text)) { + val pageNumber = text.trim().toInt() + viewModel.gotoPage(pageNumber) + dismiss() + } + } + binding.etName.addTextChangedListener(object : TextWatcher { + override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {} + override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { + binding.tilName.error = null + } + + override fun afterTextChanged(s: Editable?) {} + }) + } + + private fun validateEnter(inputText: String): Boolean { + // 不允许为空 + if (inputText.isBlank()) { + binding.tilName.error = getString(R.string.name_not_empty) + return false + } + // 去掉首尾空格后转换成数字 + val pageNumber = inputText.trim().toInt() + + // 数字范围校验 + if (pageNumber < 1 || pageNumber > pdfDocument.pageCount) { + binding.tilName.error = getString(R.string.name_out_of_range, pdfDocument.pageCount) + return false + } + return true + } + + private fun showToast(message: String) { + ToastUtils.show(requireActivity(), message) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/all/pdfreader/pro/app/ui/dialog/ListMoreDialogFragment.kt b/app/src/main/java/com/all/pdfreader/pro/app/ui/dialog/ListMoreDialogFragment.kt index 91618a4..a859680 100644 --- a/app/src/main/java/com/all/pdfreader/pro/app/ui/dialog/ListMoreDialogFragment.kt +++ b/app/src/main/java/com/all/pdfreader/pro/app/ui/dialog/ListMoreDialogFragment.kt @@ -84,6 +84,7 @@ class ListMoreDialogFragment(val filePath: String) : BottomSheetDialogFragment() binding.setPasswordBtn.visibility = View.VISIBLE binding.deleteFileBtn.visibility = View.VISIBLE binding.shareBtn.visibility = View.VISIBLE + binding.gotoPageBtn.visibility = View.GONE } RecentlyFrag.FRAG_TAG -> { @@ -91,6 +92,7 @@ class ListMoreDialogFragment(val filePath: String) : BottomSheetDialogFragment() binding.setPasswordBtn.visibility = View.VISIBLE binding.deleteFileBtn.visibility = View.VISIBLE binding.shareBtn.visibility = View.VISIBLE + binding.gotoPageBtn.visibility = View.GONE } FavoriteFrag.FRAG_TAG -> { @@ -98,6 +100,7 @@ class ListMoreDialogFragment(val filePath: String) : BottomSheetDialogFragment() binding.setPasswordBtn.visibility = View.VISIBLE binding.deleteFileBtn.visibility = View.VISIBLE binding.shareBtn.visibility = View.VISIBLE + binding.gotoPageBtn.visibility = View.GONE } PdfViewActivity.FRAG_TAG -> { @@ -105,6 +108,7 @@ class ListMoreDialogFragment(val filePath: String) : BottomSheetDialogFragment() binding.setPasswordBtn.visibility = View.GONE binding.deleteFileBtn.visibility = View.GONE binding.shareBtn.visibility = View.GONE + binding.gotoPageBtn.visibility = View.VISIBLE } } binding.tvFileName.text = pdfDocument.fileName @@ -212,6 +216,10 @@ class ListMoreDialogFragment(val filePath: String) : BottomSheetDialogFragment() startActivity(intent) dismiss() } + binding.gotoPageBtn.setOnClickListener { + GotoPageDialogFragment().show(parentFragmentManager, "GotoPage") + dismiss() + } } private fun updateCollectUi(b: Boolean) { diff --git a/app/src/main/java/com/all/pdfreader/pro/app/ui/dialog/ViewModelDialogFragment.kt b/app/src/main/java/com/all/pdfreader/pro/app/ui/dialog/ViewModelDialogFragment.kt index f5cf851..9c42753 100644 --- a/app/src/main/java/com/all/pdfreader/pro/app/ui/dialog/ViewModelDialogFragment.kt +++ b/app/src/main/java/com/all/pdfreader/pro/app/ui/dialog/ViewModelDialogFragment.kt @@ -82,18 +82,18 @@ class ViewModelDialogFragment() : BottomSheetDialogFragment() { binding.btnHorizontal.setOnClickListener { setSelectedMode(isVertical = false) AppStore(requireActivity()).isVertical = false - viewModel.noticeReloadPdf() + viewModel.setSwipeVertical(false) } binding.btnVertical.setOnClickListener { setSelectedMode(isVertical = true) AppStore(requireActivity()).isVertical = true - viewModel.noticeReloadPdf() + viewModel.setSwipeVertical(true) } binding.switchPageByPage.setOnCheckedChangeListener(object : OnCheckedChangeListener { override fun onCheckedChanged(view: CustomSwitchButton?, isChecked: Boolean) { view?.setChecked(isChecked) appstore.isPageFling = isChecked - viewModel.noticeReloadPdf() + viewModel.setPageFling(appstore.isPageFling) } }) binding.switchColorInversion.setOnCheckedChangeListener(object : OnCheckedChangeListener { @@ -103,7 +103,7 @@ class ViewModelDialogFragment() : BottomSheetDialogFragment() { ) { view?.setChecked(isChecked) appstore.isColorInversion = isChecked - viewModel.noticeReloadPdf() + viewModel.setColorInversion(appstore.isColorInversion) } }) } diff --git a/app/src/main/java/com/all/pdfreader/pro/app/viewmodel/PdfViewModel.kt b/app/src/main/java/com/all/pdfreader/pro/app/viewmodel/PdfViewModel.kt index 2f5f7f6..4d3c641 100644 --- a/app/src/main/java/com/all/pdfreader/pro/app/viewmodel/PdfViewModel.kt +++ b/app/src/main/java/com/all/pdfreader/pro/app/viewmodel/PdfViewModel.kt @@ -196,6 +196,30 @@ class PdfViewModel : ViewModel() { } } + fun setColorInversion(b: Boolean) { + viewModelScope.launch { + _fileActionEvent.postValue(FileActionEvent.SetColorInversion(b)) + } + } + + fun setSwipeVertical(b: Boolean) { + viewModelScope.launch { + _fileActionEvent.postValue(FileActionEvent.SetSwipeVertical(b)) + } + } + + fun setPageFling(b: Boolean) { + viewModelScope.launch { + _fileActionEvent.postValue(FileActionEvent.SetPageFling(b)) + } + } + + fun gotoPage(number: Int){ + viewModelScope.launch { + _fileActionEvent.postValue(FileActionEvent.GotoPage(number)) + } + } + fun removeRecent(filePath: String) { viewModelScope.launch { pdfRepository.updateLastOpenTime(filePath, 0L) diff --git a/app/src/main/res/drawable/goto_page.xml b/app/src/main/res/drawable/goto_page.xml new file mode 100644 index 0000000..dbe1efb --- /dev/null +++ b/app/src/main/res/drawable/goto_page.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/share.xml b/app/src/main/res/drawable/share.xml index dbe1efb..9565144 100644 --- a/app/src/main/res/drawable/share.xml +++ b/app/src/main/res/drawable/share.xml @@ -4,9 +4,6 @@ android:viewportWidth="1024" android:viewportHeight="1024"> - diff --git a/app/src/main/res/layout/activity_pdf_view.xml b/app/src/main/res/layout/activity_pdf_view.xml index 162a781..e929169 100644 --- a/app/src/main/res/layout/activity_pdf_view.xml +++ b/app/src/main/res/layout/activity_pdf_view.xml @@ -80,13 +80,6 @@ android:layout_height="match_parent" android:background="@color/grey" /> - - + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_list_more.xml b/app/src/main/res/layout/dialog_list_more.xml index 4b88f48..d3d78a2 100644 --- a/app/src/main/res/layout/dialog_list_more.xml +++ b/app/src/main/res/layout/dialog_list_more.xml @@ -63,10 +63,10 @@ @@ -123,6 +123,30 @@ android:layout_marginEnd="16dp" android:orientation="horizontal"> + + + + + + + @@ -160,10 +184,10 @@ android:src="@drawable/prompt" /> @@ -183,10 +207,10 @@ android:src="@drawable/share" /> @@ -206,10 +230,10 @@ android:src="@drawable/print" /> diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index ed6df19..ca18380 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -24,4 +24,5 @@ #E43521 #33E43521 #E8EAEE + #A6000000 \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index fad71ba..064738a 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -136,4 +136,8 @@ Please select at least one page Splitting… Search…… + Goto page + Quickly navigate to any page in the file. + Please enter a number(1-%1$d) + Please enter a number between 1 and %1$d \ No newline at end of file