diff --git a/app/src/main/java/com/all/pdfreader/pro/app/sp/AppStore.kt b/app/src/main/java/com/all/pdfreader/pro/app/sp/AppStore.kt
index f1fd920..0aa87fd 100644
--- a/app/src/main/java/com/all/pdfreader/pro/app/sp/AppStore.kt
+++ b/app/src/main/java/com/all/pdfreader/pro/app/sp/AppStore.kt
@@ -20,9 +20,14 @@ class AppStore(context: Context) {
key = DOCUMENT_SORT_TYPE, defaultValue = SortConfig.default().toPreferenceString()
)
+ var isEyeCareMode: Boolean by store.boolean(
+ key = IS_EYE_CARE_MODE, defaultValue = false
+ )
+
companion object {
private const val FILE_NAME = "prp_sp_name"
private const val PERMISSIONS_DIALOG_PROMPT = "permissions_dialog_prompt"
private const val DOCUMENT_SORT_TYPE = "document_sort_type"
+ private const val IS_EYE_CARE_MODE = "is_eye_care_mode"
}
}
\ No newline at end of file
diff --git a/app/src/main/java/com/all/pdfreader/pro/app/ui/act/MainActivity.kt b/app/src/main/java/com/all/pdfreader/pro/app/ui/act/MainActivity.kt
index 3ea4428..9caf22f 100644
--- a/app/src/main/java/com/all/pdfreader/pro/app/ui/act/MainActivity.kt
+++ b/app/src/main/java/com/all/pdfreader/pro/app/ui/act/MainActivity.kt
@@ -52,7 +52,7 @@ class MainActivity : BaseActivity(), PermissionDialogFragment.PermissionCallback
setContentView(binding.root)
initObserve()
ImmersionBar.with(this).statusBarView(binding.view).statusBarDarkFont(true)
- .navigationBarColor(R.color.black).init()
+ .navigationBarColor(R.color.white).init()
setupFragments()
setupNavigation()
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 fc52292..c26127e 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
@@ -3,11 +3,12 @@ package com.all.pdfreader.pro.app.ui.act
import android.content.Context
import android.content.Intent
import android.os.Bundle
+import android.view.MotionEvent
+import android.view.View
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.lifecycleScope
import com.all.pdfreader.pro.app.R
import com.all.pdfreader.pro.app.databinding.ActivityPdfViewBinding
-import com.all.pdfreader.pro.app.model.FileActionEvent
import com.all.pdfreader.pro.app.room.entity.PdfDocumentEntity
import com.all.pdfreader.pro.app.ui.dialog.PdfPasswordProtectionDialogFragment
import com.all.pdfreader.pro.app.ui.view.CustomScrollHandle
@@ -15,11 +16,14 @@ import com.all.pdfreader.pro.app.viewmodel.PdfViewModel
import com.github.barteksc.pdfviewer.listener.OnErrorListener
import com.github.barteksc.pdfviewer.listener.OnLoadCompleteListener
import com.github.barteksc.pdfviewer.listener.OnPageChangeListener
+import com.github.barteksc.pdfviewer.listener.OnTapListener
+import com.gyf.immersionbar.BarHide
+import com.gyf.immersionbar.ImmersionBar
import kotlinx.coroutines.launch
import java.io.File
class PdfViewActivity : BaseActivity(), OnLoadCompleteListener, OnPageChangeListener,
- OnErrorListener {
+ OnErrorListener, OnTapListener {
override val TAG: String = "PdfViewActivity"
companion object {
@@ -37,10 +41,14 @@ class PdfViewActivity : BaseActivity(), OnLoadCompleteListener, OnPageChangeList
private lateinit var pdfDocument: PdfDocumentEntity
private val viewModel by lazy { ViewModelProvider(this)[PdfViewModel::class.java] }
private val repository = getRepository()
+ private var isFullScreen = false
+
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityPdfViewBinding.inflate(layoutInflater)
setContentView(binding.root)
+ ImmersionBar.with(this).statusBarView(binding.view).statusBarDarkFont(true)
+ .navigationBarColor(R.color.white).init()
initObserve()
val filePath = intent.getStringExtra(EXTRA_PDF_HASH)
?: throw IllegalArgumentException("PDF file hash is required")
@@ -48,12 +56,14 @@ class PdfViewActivity : BaseActivity(), OnLoadCompleteListener, OnPageChangeList
viewModel.getPDFDocument(filePath)
}
- private fun initObserve(){
+ private fun initObserve() {
// 观察PDF文档数据
viewModel.pdfDocument.observe(this) { document ->
document?.let {
pdfDocument = it
loadPdf()
+ setupOnClick()
+ toggleEyeCareMode(appStore.isEyeCareMode)
} ?: run {
showToast(getString(R.string.file_not))
finish()
@@ -61,6 +71,16 @@ class PdfViewActivity : BaseActivity(), OnLoadCompleteListener, OnPageChangeList
}
}
+ private fun setupOnClick() {
+ binding.backBtn.setOnClickListener {
+ finish()
+ }
+ binding.eyeCareOverlayBtn.setOnClickListener {
+ appStore.isEyeCareMode = !appStore.isEyeCareMode
+ toggleEyeCareMode(appStore.isEyeCareMode)
+ }
+ }
+
private fun loadPdf() {
logDebug("loadPdf ->${pdfDocument.lastReadPage} ${pdfDocument.readingProgress}")
// 使用传递的文件路径加载PDF
@@ -72,14 +92,14 @@ class PdfViewActivity : BaseActivity(), OnLoadCompleteListener, OnPageChangeList
return
}
// 无密码PDF正常加载
- binding.pdfview.fromFile(file)
- .defaultPage(pdfDocument.lastReadPage) // 从上次阅读页码开始
+ binding.pdfview.fromFile(file).defaultPage(pdfDocument.lastReadPage) // 从上次阅读页码开始
.enableDoubletap(true)// 是否允许双击缩放
- .onLoad(this)
+ .onLoad(this)//加载
.enableAnnotationRendering(true) // 是否渲染注释(如评论、颜色、表单等)
- .onError(this)
- .onPageChange(this)
- .scrollHandle(CustomScrollHandle(this))
+ .onError(this)//错误
+ .onTap(this)//点击
+ .onPageChange(this)//页面改变
+ .scrollHandle(CustomScrollHandle(this))//自定义的页数展示,并且可快速拖动
.load()
} else {
showToast(getString(R.string.file_not) + ": ${pdfDocument.fileName}")
@@ -109,6 +129,11 @@ class PdfViewActivity : BaseActivity(), OnLoadCompleteListener, OnPageChangeList
}
}
+ override fun onTap(e: MotionEvent?): Boolean {
+ toggleFullScreen()
+ return true// 表示我们自己处理了单击事件
+ }
+
//页面切换时回调
override fun onPageChanged(page: Int, pageCount: Int) {
// 保存阅读进度到内存
@@ -139,15 +164,55 @@ class PdfViewActivity : BaseActivity(), OnLoadCompleteListener, OnPageChangeList
}
private fun tryLoadPdfWithPassword(file: File, password: String) {
- binding.pdfview.fromFile(file)
- .password(password) // 使用输入的密码
+ binding.pdfview.fromFile(file).password(password) // 使用输入的密码
.defaultPage(pdfDocument.lastReadPage) // 从上次阅读页码开始
.enableDoubletap(true)// 是否允许双击缩放
- .onLoad(this)
+ .onLoad(this)//加载
+ .onTap(this)//单击
.enableAnnotationRendering(true) // 是否渲染注释(如评论、颜色、表单等)
- .onError(this)
- .onPageChange(this)
- .scrollHandle(CustomScrollHandle(this))
+ .onError(this)//错误
+ .onPageChange(this)//页面改变
+ .scrollHandle(CustomScrollHandle(this))//自定义的页数展示,并且可快速拖动
.load()
}
+
+ private fun toggleFullScreen() {
+ isFullScreen = !isFullScreen
+ updateStatusAndNavigationLayout(isFullScreen)
+ if (isFullScreen) {
+ ImmersionBar.with(this).hideBar(BarHide.FLAG_HIDE_BAR).init()
+ } else {
+ val navColor =
+ if (appStore.isEyeCareMode) R.color.eye_protection_color else R.color.white
+ ImmersionBar.with(this).statusBarView(binding.view).statusBarDarkFont(true)
+ .navigationBarColor(navColor).hideBar(BarHide.FLAG_SHOW_BAR).init()
+ }
+ }
+
+ private fun updateStatusAndNavigationLayout(b: Boolean) {
+ if (b) {
+ // 隐藏顶部和底部
+ binding.statusLayout.visibility = View.GONE
+ binding.navigationLayout.visibility = View.GONE
+ binding.view.visibility = View.GONE
+ } else {
+ // 显示顶部和底部
+ binding.statusLayout.visibility = View.VISIBLE
+ binding.navigationLayout.visibility = View.VISIBLE
+ binding.view.visibility = View.VISIBLE
+ }
+ }
+
+ private fun toggleEyeCareMode(b: Boolean) {
+ val navColor = if (b) R.color.eye_protection_color else R.color.white
+ if (b) {
+ binding.eyeCareOverlay.visibility = View.VISIBLE
+ binding.eyeProtectIv.setImageResource(R.drawable.eye_protect_active)
+ } else {
+ binding.eyeCareOverlay.visibility = View.GONE
+ binding.eyeProtectIv.setImageResource(R.drawable.eye_protect)
+ }
+ ImmersionBar.with(this).statusBarView(binding.view).statusBarDarkFont(true)
+ .navigationBarColor(navColor).init()
+ }
}
\ No newline at end of file
diff --git a/app/src/main/java/com/all/pdfreader/pro/app/ui/view/CustomScrollHandle.java b/app/src/main/java/com/all/pdfreader/pro/app/ui/view/CustomScrollHandle.java
index e61a3b2..386e036 100644
--- a/app/src/main/java/com/all/pdfreader/pro/app/ui/view/CustomScrollHandle.java
+++ b/app/src/main/java/com/all/pdfreader/pro/app/ui/view/CustomScrollHandle.java
@@ -3,6 +3,7 @@ package com.all.pdfreader.pro.app.ui.view;
import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Color;
+import android.graphics.Typeface;
import android.graphics.drawable.Drawable;
import android.os.Handler;
import android.util.TypedValue;
@@ -17,6 +18,7 @@ import com.github.barteksc.pdfviewer.scroll.ScrollHandle;
import com.github.barteksc.pdfviewer.util.Util;
import androidx.core.content.ContextCompat;
+import androidx.core.content.res.ResourcesCompat;
public class CustomScrollHandle extends RelativeLayout implements ScrollHandle {
private final static int HANDLE_LONG = 36;
@@ -203,6 +205,13 @@ public class CustomScrollHandle extends RelativeLayout implements ScrollHandle {
textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, size);
}
+ /**
+ * @param tf 自定义font字体
+ */
+ public void setTypeface(Typeface tf){
+ textView.setTypeface(tf);
+ }
+
private boolean isPDFViewReady() {
return pdfView != null && pdfView.getPageCount() > 0 && !pdfView.documentFitsView();
}
diff --git a/app/src/main/res/drawable/dr_scroll_handle_bottom.xml b/app/src/main/res/drawable/dr_scroll_handle_bottom.xml
index 1e4921e..e97e124 100644
--- a/app/src/main/res/drawable/dr_scroll_handle_bottom.xml
+++ b/app/src/main/res/drawable/dr_scroll_handle_bottom.xml
@@ -3,10 +3,10 @@
xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
-
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/dr_scroll_handle_right.xml b/app/src/main/res/drawable/dr_scroll_handle_right.xml
index 237548d..42e2fd9 100644
--- a/app/src/main/res/drawable/dr_scroll_handle_right.xml
+++ b/app/src/main/res/drawable/dr_scroll_handle_right.xml
@@ -3,10 +3,10 @@
xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
-
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/eye_protect.xml b/app/src/main/res/drawable/eye_protect.xml
new file mode 100644
index 0000000..d466c77
--- /dev/null
+++ b/app/src/main/res/drawable/eye_protect.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/eye_protect_active.xml b/app/src/main/res/drawable/eye_protect_active.xml
new file mode 100644
index 0000000..27c902a
--- /dev/null
+++ b/app/src/main/res/drawable/eye_protect_active.xml
@@ -0,0 +1,5 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_pdf_view.xml b/app/src/main/res/layout/activity_pdf_view.xml
index 4cabd6f..9681592 100644
--- a/app/src/main/res/layout/activity_pdf_view.xml
+++ b/app/src/main/res/layout/activity_pdf_view.xml
@@ -1,77 +1,131 @@
-
+ android:layout_height="match_parent">
+ android:layout_height="match_parent"
+ android:background="@color/bg_color"
+ android:orientation="vertical">
+
+
+ android:id="@+id/statusLayout"
+ android:layout_width="match_parent"
+ android:layout_height="48dp"
+ android:gravity="center_vertical"
+ android:orientation="horizontal">
-
+
+
+
+
+
-
-
-
-
-
+ android:layout_height="0dp"
+ android:layout_weight="1"
+ android:background="@color/white">
-
+
-
+
-
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
\ No newline at end of file
+
+
+
diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml
index 53513e8..02223d8 100644
--- a/app/src/main/res/values/colors.xml
+++ b/app/src/main/res/values/colors.xml
@@ -14,4 +14,5 @@
#E0E0E0
#2c2c2c
#666666
+ #80FFD699
\ No newline at end of file