优化
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.coroutine.Coroutine
|
||||||
import io.legado.app.help.storage.AppWebDav
|
import io.legado.app.help.storage.AppWebDav
|
||||||
import io.legado.app.help.storage.Backup
|
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.alert
|
||||||
import io.legado.app.lib.dialogs.selector
|
import io.legado.app.lib.dialogs.selector
|
||||||
import io.legado.app.lib.theme.accentColor
|
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.ContentTextView
|
||||||
import io.legado.app.ui.book.read.page.ReadView
|
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.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.read.page.provider.TextPageFactory
|
||||||
import io.legado.app.ui.book.searchContent.SearchContentActivity
|
import io.legado.app.ui.book.searchContent.SearchContentActivity
|
||||||
import io.legado.app.ui.book.searchContent.SearchResult
|
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.login.SourceLoginActivity
|
||||||
import io.legado.app.ui.replace.ReplaceRuleActivity
|
import io.legado.app.ui.replace.ReplaceRuleActivity
|
||||||
import io.legado.app.ui.replace.edit.ReplaceEditActivity
|
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.PhotoDialog
|
||||||
import io.legado.app.ui.widget.dialog.TextDialog
|
import io.legado.app.ui.widget.dialog.TextDialog
|
||||||
import io.legado.app.utils.*
|
import io.legado.app.utils.*
|
||||||
@@ -131,7 +134,9 @@ class ReadBookActivity : BaseReadBookActivity(),
|
|||||||
val textActionMenu: TextActionMenu by lazy {
|
val textActionMenu: TextActionMenu by lazy {
|
||||||
TextActionMenu(this, this)
|
TextActionMenu(this, this)
|
||||||
}
|
}
|
||||||
|
private val popupAction by lazy {
|
||||||
|
PopupAction(this)
|
||||||
|
}
|
||||||
override val isInitFinish: Boolean get() = viewModel.isInitFinish
|
override val isInitFinish: Boolean get() = viewModel.isInitFinish
|
||||||
override val isScroll: Boolean get() = binding.readView.isScroll
|
override val isScroll: Boolean get() = binding.readView.isScroll
|
||||||
private var keepScreenJon: Job? = null
|
private var keepScreenJon: Job? = null
|
||||||
@@ -954,8 +959,29 @@ class ReadBookActivity : BaseReadBookActivity(),
|
|||||||
/**
|
/**
|
||||||
* 长按图片
|
* 长按图片
|
||||||
*/
|
*/
|
||||||
override fun onImageLongPress(src: String) {
|
override fun onImageLongPress(x: Float, y: Float, src: String) {
|
||||||
showDialogFragment(PhotoDialog(src))
|
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() {
|
override fun onDestroy() {
|
||||||
super.onDestroy()
|
super.onDestroy()
|
||||||
textActionMenu.dismiss()
|
textActionMenu.dismiss()
|
||||||
|
popupAction.dismiss()
|
||||||
binding.readView.onDestroy()
|
binding.readView.onDestroy()
|
||||||
ReadBook.msg = null
|
ReadBook.msg = null
|
||||||
ReadBook.callBack = null
|
ReadBook.callBack = null
|
||||||
|
|||||||
@@ -228,7 +228,7 @@ class ContentTextView(context: Context, attrs: AttributeSet?) : View(context, at
|
|||||||
) {
|
) {
|
||||||
touch(x, y) { _, relativePos, _, lineIndex, _, charIndex, textChar ->
|
touch(x, y) { _, relativePos, _, lineIndex, _, charIndex, textChar ->
|
||||||
if (textChar.isImage) {
|
if (textChar.isImage) {
|
||||||
callBack.onImageLongPress(textChar.charData)
|
callBack.onImageLongPress(x, y, textChar.charData)
|
||||||
} else {
|
} else {
|
||||||
if (!selectAble) return@touch
|
if (!selectAble) return@touch
|
||||||
textChar.selected = true
|
textChar.selected = true
|
||||||
@@ -467,7 +467,7 @@ class ContentTextView(context: Context, attrs: AttributeSet?) : View(context, at
|
|||||||
var isSelectingSearchResult: Boolean
|
var isSelectingSearchResult: Boolean
|
||||||
fun upSelectedStart(x: Float, y: Float, top: Float)
|
fun upSelectedStart(x: Float, y: Float, top: Float)
|
||||||
fun upSelectedEnd(x: Float, y: Float)
|
fun upSelectedEnd(x: Float, y: Float)
|
||||||
|
fun onImageLongPress(x: Float, y: Float, src: String)
|
||||||
fun onCancelSelect()
|
fun onCancelSelect()
|
||||||
fun onImageLongPress(src: String)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ object ImageProvider {
|
|||||||
private const val M = 1024 * 1024
|
private const val M = 1024 * 1024
|
||||||
private val cacheSize =
|
private val cacheSize =
|
||||||
max(50 * M, min(100 * M, (Runtime.getRuntime().maxMemory() / 8).toInt()))
|
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 {
|
override fun sizeOf(key: String, bitmap: Bitmap): Int {
|
||||||
return bitmap.byteCount
|
return bitmap.byteCount
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -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