kunfei 4 лет назад
Родитель
Сommit
9492b6ef49

+ 32 - 16
app/src/main/java/io/legado/app/ui/widget/text/NestScrollMultiAutoCompleteTextView.kt

@@ -3,6 +3,7 @@ package io.legado.app.ui.widget.text
 import android.annotation.SuppressLint
 import android.content.Context
 import android.util.AttributeSet
+import android.view.GestureDetector
 import android.view.MotionEvent
 import androidx.appcompat.widget.AppCompatMultiAutoCompleteTextView
 
@@ -14,12 +15,38 @@ open class NestScrollMultiAutoCompleteTextView @JvmOverloads constructor(
     attrs: AttributeSet? = null
 ) : AppCompatMultiAutoCompleteTextView(context, attrs) {
 
+    //是否到顶或者到底的标志
+    private var disallowIntercept = true
 
     //滑动距离的最大边界
     private var mOffsetHeight = 0
 
-    //是否到顶或者到底的标志
-    private var mBottomFlag = false
+    private val gestureDetector = GestureDetector(context,
+        object : GestureDetector.SimpleOnGestureListener() {
+
+            override fun onDown(e: MotionEvent): Boolean {
+                disallowIntercept = true
+                return super.onDown(e)
+            }
+
+            override fun onScroll(
+                e1: MotionEvent,
+                e2: MotionEvent,
+                distanceX: Float,
+                distanceY: Float
+            ): Boolean {
+                val y = scrollY + distanceY
+                if (y < 0 || y > mOffsetHeight) {
+                    disallowIntercept = false
+                    //这里触发父布局或祖父布局的滑动事件
+                    parent.requestDisallowInterceptTouchEvent(false)
+                } else {
+                    disallowIntercept = true
+                }
+                return true
+            }
+
+        })
 
     override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
         super.onMeasure(widthMeasureSpec, heightMeasureSpec)
@@ -37,9 +64,8 @@ open class NestScrollMultiAutoCompleteTextView @JvmOverloads constructor(
     }
 
     override fun dispatchTouchEvent(event: MotionEvent): Boolean {
-        if (event.action == MotionEvent.ACTION_DOWN) {
-            //如果是新的按下事件,则对mBottomFlag重新初始化
-            mBottomFlag = lineCount <= maxLines
+        if (lineCount > maxLines) {
+            gestureDetector.onTouchEvent(event)
         }
         return super.dispatchTouchEvent(event)
     }
@@ -48,22 +74,12 @@ open class NestScrollMultiAutoCompleteTextView @JvmOverloads constructor(
     override fun onTouchEvent(event: MotionEvent): Boolean {
         val result = super.onTouchEvent(event)
         //如果是需要拦截,则再拦截,这个方法会在onScrollChanged方法之后再调用一次
-        if (!mBottomFlag) {
+        if (disallowIntercept && lineCount > maxLines) {
             parent.requestDisallowInterceptTouchEvent(true)
         }
         return result
     }
 
-    override fun onScrollChanged(horiz: Int, vert: Int, oldHoriz: Int, oldVert: Int) {
-        super.onScrollChanged(horiz, vert, oldHoriz, oldVert)
-        if (vert == mOffsetHeight || vert == 0) {
-            //这里触发父布局或祖父布局的滑动事件
-            parent.requestDisallowInterceptTouchEvent(false)
-            mBottomFlag = true
-        }
-    }
-
-
     private fun initOffsetHeight() {
         val mLayoutHeight: Int