监听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
}
本文介绍如何在Android中监听EditText的触摸事件,通过判断EditText是否可以垂直滚动来决定父控件是否拦截子事件。当EditText可滚动时,请求父控件不拦截事件,允许用户滚动输入框;在触摸事件结束时,重新允许父控件拦截事件。
1856

被折叠的 条评论
为什么被折叠?



