|
|
|
@ -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 |
|
|
|
|
|
|
|
|
|