重写dispatchTouchEvent方法,实现EditText失去焦点后(点击其他地方)收起键盘的效果

来源:互联网 发布:plc简单编程实例 编辑:程序博客网 时间:2024/05/04 22:39
一、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类型

资料参考链接:http://blog.csdn.net/dmk877/article/details/51550031

三、View view
view.getLocationInWindow(int[] location) 一个控件在其父窗口中的坐标位置
view.getLocationOnScreen(int[] location) 一个控件在其整个屏幕上的坐标位置

资料参考链接:http://blog.csdn.net/u010746364/article/details/50377875

四、在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;    }


阅读全文
0 0