监听EditText的触摸事件,判断当前EditText是否可以是上下滚动,如果可以滑动,则请求父控件不拦截子事件,在up事件触发时,将requestDisallowInterceptTouchEvent设置回false。
etNote.setOnTouchListener { v, event ->
// 控件id
if (v.id == R.id.etNote && canVerticalScroll(etNote)) {
// 请求父控件不拦截事件
v.parent.requestDisallowInterceptTouchEvent(true)
if (MotionEvent.ACTION_UP == event.action) {
// 可拦截事件
v.parent.requestDisallowInterceptTouchEvent(false)
}
}
false
}
/**
* EditText竖直方向是否可以滚动
* @return true:可以滚动 false:不可以滚动
*/
private fun canVerticalScroll(editText: EditText): Boolean {
//滚动的距离
val scrollY = editText.scrollY
//控件内容的总高度
val scrollRange = editText.layout.height
//控件实际显示的高度
val scrollExtent = editText.height - editText.compoundPaddingTop - editText.compoundPaddingBottom
//控件内容总高度与实际显示高度的差值
val mOffsetHeight = scrollRange - scrollExtent
return if (mOffsetHeight == 0) {
false
} else scrollY > 0 || scrollY < mOffsetHeight - 1
}