mirror of
https://github.com/gedoor/legado.git
synced 2025-08-10 00:52:30 +00:00
优化
This commit is contained in:
@@ -31,6 +31,7 @@ import io.legado.app.help.config.ReadTipConfig
|
||||
import io.legado.app.help.coroutine.Coroutine
|
||||
import io.legado.app.help.storage.AppWebDav
|
||||
import io.legado.app.help.storage.Backup
|
||||
import io.legado.app.lib.dialogs.SelectItem
|
||||
import io.legado.app.lib.dialogs.alert
|
||||
import io.legado.app.lib.dialogs.selector
|
||||
import io.legado.app.lib.theme.accentColor
|
||||
@@ -50,6 +51,7 @@ import io.legado.app.ui.book.read.config.TipConfigDialog.Companion.TIP_COLOR
|
||||
import io.legado.app.ui.book.read.page.ContentTextView
|
||||
import io.legado.app.ui.book.read.page.ReadView
|
||||
import io.legado.app.ui.book.read.page.entities.PageDirection
|
||||
import io.legado.app.ui.book.read.page.provider.ImageProvider
|
||||
import io.legado.app.ui.book.read.page.provider.TextPageFactory
|
||||
import io.legado.app.ui.book.searchContent.SearchContentActivity
|
||||
import io.legado.app.ui.book.searchContent.SearchResult
|
||||
@@ -60,6 +62,7 @@ import io.legado.app.ui.dict.DictDialog
|
||||
import io.legado.app.ui.login.SourceLoginActivity
|
||||
import io.legado.app.ui.replace.ReplaceRuleActivity
|
||||
import io.legado.app.ui.replace.edit.ReplaceEditActivity
|
||||
import io.legado.app.ui.widget.PopupAction
|
||||
import io.legado.app.ui.widget.dialog.PhotoDialog
|
||||
import io.legado.app.ui.widget.dialog.TextDialog
|
||||
import io.legado.app.utils.*
|
||||
@@ -131,7 +134,9 @@ class ReadBookActivity : BaseReadBookActivity(),
|
||||
val textActionMenu: TextActionMenu by lazy {
|
||||
TextActionMenu(this, this)
|
||||
}
|
||||
|
||||
private val popupAction by lazy {
|
||||
PopupAction(this)
|
||||
}
|
||||
override val isInitFinish: Boolean get() = viewModel.isInitFinish
|
||||
override val isScroll: Boolean get() = binding.readView.isScroll
|
||||
private var keepScreenJon: Job? = null
|
||||
@@ -954,8 +959,29 @@ class ReadBookActivity : BaseReadBookActivity(),
|
||||
/**
|
||||
* 长按图片
|
||||
*/
|
||||
override fun onImageLongPress(src: String) {
|
||||
showDialogFragment(PhotoDialog(src))
|
||||
override fun onImageLongPress(x: Float, y: Float, src: String) {
|
||||
popupAction.setItems(
|
||||
listOf(
|
||||
SelectItem("查看", "show"),
|
||||
SelectItem("刷新", "refresh")
|
||||
)
|
||||
)
|
||||
popupAction.onActionClick = {
|
||||
when (it) {
|
||||
"show" -> showDialogFragment(PhotoDialog(src))
|
||||
"refresh" -> {
|
||||
ImageProvider.bitmapLruCache.remove(src)
|
||||
}
|
||||
}
|
||||
popupAction.dismiss()
|
||||
}
|
||||
val navigationBarHeight =
|
||||
if (!ReadBookConfig.hideNavigationBar && navigationBarGravity == Gravity.BOTTOM)
|
||||
navigationBarHeight else 0
|
||||
popupAction.showAtLocation(
|
||||
binding.readView, Gravity.BOTTOM or Gravity.CENTER_HORIZONTAL, x.toInt(),
|
||||
binding.root.height + navigationBarHeight - y.toInt()
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1076,6 +1102,7 @@ class ReadBookActivity : BaseReadBookActivity(),
|
||||
override fun onDestroy() {
|
||||
super.onDestroy()
|
||||
textActionMenu.dismiss()
|
||||
popupAction.dismiss()
|
||||
binding.readView.onDestroy()
|
||||
ReadBook.msg = null
|
||||
ReadBook.callBack = null
|
||||
|
||||
@@ -228,7 +228,7 @@ class ContentTextView(context: Context, attrs: AttributeSet?) : View(context, at
|
||||
) {
|
||||
touch(x, y) { _, relativePos, _, lineIndex, _, charIndex, textChar ->
|
||||
if (textChar.isImage) {
|
||||
callBack.onImageLongPress(textChar.charData)
|
||||
callBack.onImageLongPress(x, y, textChar.charData)
|
||||
} else {
|
||||
if (!selectAble) return@touch
|
||||
textChar.selected = true
|
||||
@@ -467,7 +467,7 @@ class ContentTextView(context: Context, attrs: AttributeSet?) : View(context, at
|
||||
var isSelectingSearchResult: Boolean
|
||||
fun upSelectedStart(x: Float, y: Float, top: Float)
|
||||
fun upSelectedEnd(x: Float, y: Float)
|
||||
fun onImageLongPress(x: Float, y: Float, src: String)
|
||||
fun onCancelSelect()
|
||||
fun onImageLongPress(src: String)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -33,7 +33,7 @@ object ImageProvider {
|
||||
private const val M = 1024 * 1024
|
||||
private val cacheSize =
|
||||
max(50 * M, min(100 * M, (Runtime.getRuntime().maxMemory() / 8).toInt()))
|
||||
private val bitmapLruCache = object : LruCache<String, Bitmap>(cacheSize) {
|
||||
val bitmapLruCache = object : LruCache<String, Bitmap>(cacheSize) {
|
||||
override fun sizeOf(key: String, bitmap: Bitmap): Int {
|
||||
return bitmap.byteCount
|
||||
}
|
||||
|
||||
63
app/src/main/java/io/legado/app/ui/widget/PopupAction.kt
Normal file
63
app/src/main/java/io/legado/app/ui/widget/PopupAction.kt
Normal file
@@ -0,0 +1,63 @@
|
||||
package io.legado.app.ui.widget
|
||||
|
||||
import android.content.Context
|
||||
import android.view.ViewGroup
|
||||
import android.widget.PopupWindow
|
||||
import io.legado.app.base.adapter.ItemViewHolder
|
||||
import io.legado.app.base.adapter.RecyclerAdapter
|
||||
import io.legado.app.databinding.ItemTextBinding
|
||||
import io.legado.app.databinding.PopupActionBinding
|
||||
import io.legado.app.lib.dialogs.SelectItem
|
||||
import splitties.systemservices.layoutInflater
|
||||
|
||||
class PopupAction(private val context: Context) :
|
||||
PopupWindow(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT) {
|
||||
|
||||
val binding = PopupActionBinding.inflate(context.layoutInflater)
|
||||
val adapter by lazy {
|
||||
Adapter(context)
|
||||
}
|
||||
var onActionClick: ((action: String) -> Unit)? = null
|
||||
|
||||
init {
|
||||
contentView = binding.root
|
||||
|
||||
isTouchable = true
|
||||
isOutsideTouchable = true
|
||||
isFocusable = false
|
||||
|
||||
binding.recyclerView.adapter = adapter
|
||||
}
|
||||
|
||||
fun setItems(items: List<SelectItem<String>>) {
|
||||
adapter.setItems(items)
|
||||
}
|
||||
|
||||
inner class Adapter(context: Context) :
|
||||
RecyclerAdapter<SelectItem<String>, ItemTextBinding>(context) {
|
||||
|
||||
override fun getViewBinding(parent: ViewGroup): ItemTextBinding {
|
||||
return ItemTextBinding.inflate(inflater, parent, false)
|
||||
}
|
||||
|
||||
override fun convert(
|
||||
holder: ItemViewHolder,
|
||||
binding: ItemTextBinding,
|
||||
item: SelectItem<String>,
|
||||
payloads: MutableList<Any>
|
||||
) {
|
||||
with(binding) {
|
||||
textView.text = item.title
|
||||
}
|
||||
}
|
||||
|
||||
override fun registerListener(holder: ItemViewHolder, binding: ItemTextBinding) {
|
||||
holder.itemView.setOnClickListener {
|
||||
getItem(holder.layoutPosition)?.let { item ->
|
||||
onActionClick?.invoke(item.value)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
21
app/src/main/res/layout/popup_action.xml
Normal file
21
app/src/main/res/layout/popup_action.xml
Normal file
@@ -0,0 +1,21 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:background="@drawable/shape_card_view"
|
||||
android:orientation="vertical"
|
||||
android:padding="5dp">
|
||||
|
||||
<androidx.recyclerview.widget.RecyclerView
|
||||
android:id="@+id/recycler_view"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center"
|
||||
android:orientation="horizontal"
|
||||
app:flexDirection="row"
|
||||
app:flexWrap="wrap"
|
||||
app:layoutManager="com.google.android.flexbox.FlexboxLayoutManager" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
Reference in New Issue
Block a user