- 滾動(dòng)沖突解決
public class XEditText extends EditText {
//滑動(dòng)距離的最大邊界
private int mOffsetHeight;
//是否到頂或者到底的標(biāo)志
private boolean mBottomFlag = false;
public XEditText(Context context) {
super(context);
}
public XEditText(Context context, AttributeSet attrs) {
super(context, attrs);
}
public XEditText(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int paddingTop;
int paddingBottom;
int height;
int layoutHeight;
//獲得內(nèi)容面板
Layout layout = getLayout();
//獲得內(nèi)容面板的高度
layoutHeight = layout.getHeight();
//獲取上內(nèi)邊距
paddingTop = getTotalPaddingTop();
//獲取下內(nèi)邊距
paddingBottom = getTotalPaddingBottom();
//獲得控件的實(shí)際高度
height = getHeight();
//計(jì)算滑動(dòng)距離的邊界
mOffsetHeight = layoutHeight + paddingTop + paddingBottom - height;
}
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN)
//如果是新的按下事件薪者,則對(duì)mBottomFlag重新初始化
mBottomFlag = false;
//如果已經(jīng)不要這次事件馍刮,則傳出取消的信號(hào),這里的作用不大
if (mBottomFlag)
event.setAction(MotionEvent.ACTION_CANCEL);
return super.dispatchTouchEvent(event);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
boolean result = super.onTouchEvent(event);
//如果是需要攔截细诸,則再攔截,這個(gè)方法會(huì)在onScrollChanged方法之后再調(diào)用一次
if (!mBottomFlag)
getParent().requestDisallowInterceptTouchEvent(true);
return result;
}
@Override
protected void onScrollChanged(int horiz, int vert, int oldHoriz, int oldVert) {
super.onScrollChanged(horiz, vert, oldHoriz, oldVert);
if (vert == mOffsetHeight || vert == 0) {
//這里觸發(fā)父布局或祖父布局的滑動(dòng)事件
getParent().requestDisallowInterceptTouchEvent(false);
mBottomFlag = true;
}
}
}
- 解決EditText換行后,ScrollView跟隨滾動(dòng)的問(wèn)題
重寫ScrollView
的computeScrollDeltaToGetChildRectOnScreen
方法
@Override
protected int computeScrollDeltaToGetChildRectOnScreen(Rect rect) {
View currentFocused = findFocus();
if (null == currentFocused || this == currentFocused) {
return super.computeScrollDeltaToGetChildRectOnScreen(rect);
}
// 重新計(jì)算需要顯示的區(qū)域
Rect tempRect = new Rect();
currentFocused.getDrawingRect(tempRect);
offsetDescendantRectToMyCoords(currentFocused, tempRect);
return super.computeScrollDeltaToGetChildRectOnScreen(tempRect);
}
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者