Improve keyboard control in reader
parent
835c49ae79
commit
8398c01929
@ -0,0 +1,24 @@
|
|||||||
|
package org.koitharu.kotatsu.reader.ui.pager.standard
|
||||||
|
|
||||||
|
import android.view.KeyEvent
|
||||||
|
import android.view.View
|
||||||
|
import android.view.ViewGroup
|
||||||
|
import androidx.core.view.children
|
||||||
|
import androidx.viewpager2.widget.ViewPager2
|
||||||
|
import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView
|
||||||
|
import org.koitharu.kotatsu.core.util.ext.recyclerView
|
||||||
|
|
||||||
|
class PagerEventSupplier(private val pager: ViewPager2) : View.OnKeyListener {
|
||||||
|
|
||||||
|
fun attach() {
|
||||||
|
pager.recyclerView?.setOnKeyListener(this)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onKey(v: View?, keyCode: Int, event: KeyEvent?): Boolean {
|
||||||
|
val rootView = pager.recyclerView?.findViewHolderForAdapterPosition(pager.currentItem)?.itemView as? ViewGroup
|
||||||
|
?: return false
|
||||||
|
return rootView.children.firstNotNullOfOrNull { x ->
|
||||||
|
x as? SubsamplingScaleImageView
|
||||||
|
}?.dispatchKeyEvent(event) == true
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -1,32 +0,0 @@
|
|||||||
package org.koitharu.kotatsu.reader.ui.pager.standard
|
|
||||||
|
|
||||||
import android.graphics.PointF
|
|
||||||
import android.view.InputDevice
|
|
||||||
import android.view.KeyEvent
|
|
||||||
import android.view.MotionEvent
|
|
||||||
import android.view.View
|
|
||||||
import android.view.View.OnGenericMotionListener
|
|
||||||
import android.view.animation.DecelerateInterpolator
|
|
||||||
import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView
|
|
||||||
|
|
||||||
class SsivZoomListener : OnGenericMotionListener {
|
|
||||||
|
|
||||||
override fun onGenericMotion(v: View?, event: MotionEvent): Boolean {
|
|
||||||
val ssiv = v as? SubsamplingScaleImageView ?: return false
|
|
||||||
if (event.source and InputDevice.SOURCE_CLASS_POINTER != 0) {
|
|
||||||
if (event.actionMasked == MotionEvent.ACTION_SCROLL) {
|
|
||||||
val axisValue = event.getAxisValue(MotionEvent.AXIS_VSCROLL)
|
|
||||||
val withCtrl = event.metaState and KeyEvent.META_CTRL_MASK != 0
|
|
||||||
if (withCtrl || ssiv.scale > ssiv.minScale) {
|
|
||||||
val center = PointF(event.x, event.y)
|
|
||||||
val scale = ssiv.scale + axisValue * 1.6f
|
|
||||||
(ssiv.animateScaleAndCenter(scale, center) ?: return false)
|
|
||||||
.withInterpolator(DecelerateInterpolator())
|
|
||||||
.start()
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Loading…
Reference in New Issue