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

一、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;
    }


猜你喜欢

转载自blog.csdn.net/Deaful/article/details/77774471