parent
							
								
									a03298d805
								
							
						
					
					
						commit
						e8b4046277
					
				| @ -0,0 +1,84 @@ | ||||
| package io.legado.app.ui.widget.text | ||||
| 
 | ||||
| import android.annotation.SuppressLint | ||||
| import android.content.Context | ||||
| import android.util.AttributeSet | ||||
| import android.view.MotionEvent | ||||
| import androidx.appcompat.widget.AppCompatMultiAutoCompleteTextView | ||||
| 
 | ||||
| open class ScrollMultiAutoCompleteTextView @JvmOverloads constructor( | ||||
|     context: Context, | ||||
|     attrs: AttributeSet? = null | ||||
| ) : AppCompatMultiAutoCompleteTextView(context, attrs) { | ||||
| 
 | ||||
| 
 | ||||
|     //滑动距离的最大边界 | ||||
|     private var mOffsetHeight = 0 | ||||
| 
 | ||||
|     //是否到顶或者到底的标志 | ||||
|     private var mBottomFlag = false | ||||
| 
 | ||||
|     override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { | ||||
|         super.onMeasure(widthMeasureSpec, heightMeasureSpec) | ||||
|         initOffsetHeight() | ||||
|     } | ||||
| 
 | ||||
|     override fun onTextChanged( | ||||
|         text: CharSequence, | ||||
|         start: Int, | ||||
|         lengthBefore: Int, | ||||
|         lengthAfter: Int | ||||
|     ) { | ||||
|         super.onTextChanged(text, start, lengthBefore, lengthAfter) | ||||
|         initOffsetHeight() | ||||
|     } | ||||
| 
 | ||||
|     override fun dispatchTouchEvent(event: MotionEvent): Boolean { | ||||
|         if (event.action == MotionEvent.ACTION_DOWN) { | ||||
|             //如果是新的按下事件,则对mBottomFlag重新初始化 | ||||
|             mBottomFlag = mOffsetHeight <= 0 | ||||
|         } | ||||
|         return super.dispatchTouchEvent(event) | ||||
|     } | ||||
| 
 | ||||
|     @SuppressLint("ClickableViewAccessibility") | ||||
|     override fun onTouchEvent(event: MotionEvent): Boolean { | ||||
|         val result = super.onTouchEvent(event) | ||||
|         //如果是需要拦截,则再拦截,这个方法会在onScrollChanged方法之后再调用一次 | ||||
|         if (!mBottomFlag) 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 | ||||
| 
 | ||||
|         //获得内容面板 | ||||
|         val mLayout = layout ?: return | ||||
|         //获得内容面板的高度 | ||||
|         mLayoutHeight = mLayout.height | ||||
|         //获取上内边距 | ||||
|         val paddingTop: Int = totalPaddingTop | ||||
|         //获取下内边距 | ||||
|         val paddingBottom: Int = totalPaddingBottom | ||||
| 
 | ||||
|         //获得控件的实际高度 | ||||
|         val mHeight: Int = measuredHeight | ||||
| 
 | ||||
|         //计算滑动距离的边界 | ||||
|         mOffsetHeight = mLayoutHeight + paddingTop + paddingBottom - mHeight | ||||
|         if (mOffsetHeight <= 0) { | ||||
|             scrollTo(0, 0) | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
| } | ||||
					Loading…
					
					
				
		Reference in new issue