一、MotionEvent event
event.
getX
():表示的是触摸的点距离自身左边界的距离
event.
getY
():表示的是触摸的点距离自身上边界的距离
event.
getRawX
:表示的是触摸点距离屏幕左边界的距离
event.
getRawY
:表示的是触摸点距离屏幕上边界的距离
备注:以上方法的返回值均为float类型
二、View view
view.
getWidth
():表示的是当前控件的宽度,即getRight()-getLeft()
view.
getHeight
():表示的是当前控件的高度,即getBottom()-getTop()
view.
getTop
():子View的顶部到父View顶部的距离
view.
getRight
():子View的右边界到父View的左边界的距离
view.
getBottom
():子View的底部到父View的顶部的距离
view.
getLeft
():子View的左边界到父View的左边界的距离
view.
getTranslationX
()计算的是该View在X轴的偏移量。初始值为0,向左偏移值为负,向右偏移值为正。
view.
getTranslationY
()计算的是该View在Y轴的偏移量。初始值为0,向上偏移为负,向下偏移为证。
备注:以上方法的返回值均为int类型
三、View view
view.
getLocationInWindow
(int[] location) 一个控件在其父窗口中的坐标位置
view.
getLocationOnScreen
(int[] location) 一个控件在其整个屏幕上的坐标位置
四、在Activity中,重写
dispatchTouchEvent方法,实现EditText失去焦点后(点击其他地方)收起键盘的效果,代码如下:
@Override
public boolean dispatchTouchEvent(MotionEvent pEv) {
if (pEv.getAction() == MotionEvent.ACTION_DOWN) {
View view = getCurrentFocus();
if (isShouldHideInput(view, pEv)) {
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
if (imm != null) {
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
}
return super.dispatchTouchEvent(pEv);
}
// 必不可少,否则所有的组件都不会有TouchEvent了
if (getWindow().superDispatchTouchEvent(pEv)) {
return true;
}
return onTouchEvent(pEv);
}
/**
* EditText失去焦点后(点击其他地方),收起键盘
* @param pView
* @param pEv
* @return
*/
private boolean isShouldHideInput(View pView, MotionEvent pEv) {
boolean isHidden = false;
if (pView != null && pView instanceof EditText) {
Log.v(TAG, "pViewID = " + pView.getId());
int[] leftTop = {0, 0};
// 获取输入框在当前屏幕上的位置
pView.getLocationOnScreen(leftTop);
int left = leftTop[0];
int top = leftTop[1];
int bottom = top + pView.getHeight();
int right = left + pView.getWidth();
// Log.v(TAG, "left = " + left + "\tright " + right + "\ttop = " + top + "\tbottom " + bottom);
// 获取光标(触摸点)在当前屏幕上的位置
float locationX = pEv.getRawX();
float locationY = pEv.getRawY();
// Log.v(TAG, "locationX = " + locationX + "\tlocationY " + locationY);
if (locationX > left && locationX < right
&& locationY > top && locationY < bottom) {
// 点击的是输入框区域,保留点击EditText事件
isHidden = false;
} else {
// 失去焦点
pView.clearFocus();
isHidden = true;
}
}
// Log.v(TAG, "isShouldHideInput isHidden = " + isHidden);
return isHidden;
}