- 最近接到一个需求,要在一个滚动列表中有多个编辑框存在,而且有的编辑框高度固定,内容可能显示不下,需要上下滚动来回查看,然而最外层的父布局也是一个可以上下滚动的布局,这明显有冲突了。在查阅了相关博客以后,做出了一个完美的解决方式。
先放代码
@SuppressLint("AppCompatCustomView") public class PLEditText extends EditText {
public PLEditText(Context context) {
super(context);
}
public PLEditText(Context context, AttributeSet attrs) {
super(context, attrs);
}
public PLEditText(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override public boolean onTouchEvent(MotionEvent event) {
int oldy = (int) event.getY();
final int action = event.getActionMasked();
if (action == MotionEvent.ACTION_DOWN) {
getParent().requestDisallowInterceptTouchEvent(true);
} else if (action == MotionEvent.ACTION_MOVE) {
if (canVerticalScroll(this)) {
getParent().requestDisallowInterceptTouchEvent(true);
}else {
getParent().requestDisallowInterceptTouchEvent(false);
}
} else if (action == MotionEvent.ACTION_UP) {
getParent().requestDisallowInterceptTouchEvent(false);
}
return super.onTouchEvent(event);
}
/**
* EditText竖直方向是否可以滚动
* @param editText 需要判断的EditText
* @return true:可以滚动 false:不可以滚动
*/
private boolean canVerticalScroll(EditText editText) {
//滚动的距离
int scrollY = editText.getScrollY();
//控件内容的总高度
int scrollRange = editText.getLayout().getHeight();
//控件实际显示的高度
int scrollExtent = editText.getHeight() - editText.getCompoundPaddingTop() -editText.getCompoundPaddingBottom();
//控件内容总高度与实际显示高度的差值
int scrollDifference = scrollRange - scrollExtent;
if(scrollDifference == 0) {
return false;
}
return (scrollY > 0) || (scrollY < scrollDifference - 1);
}
}
解析
首先我们需要在触控到编辑框时将事件拦截下来交给编辑框自己处理,然后在滑动时就会存在一个问题,编辑框是额定高度,当你滑动的距离超出编辑框的区域的时候,这个时候就应该讲事件交给父布局处理,因为这个时候用户明显是想滑动整个布局,而不是编辑框。
参考博客:http://blog.csdn.net/z191726501/article/details/50701165