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