android朋友圈监听键盘状态 点击空白区域隐藏键盘


  /**
     * 判断键盘是否隐藏
     */
    void setViewTreeObserver() {
        final ViewTreeObserver observer = parent.getViewTreeObserver();
        observer.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                Rect rect = new Rect();
                parent.getWindowVisibleDisplayFrame(rect);   //获取除去状态栏之外的屏幕高度

//                LogUtils.info("--> rect " + rect.top + "  " + rect.bottom + " " + rect.left + " " + rect.right);
                int statusBarH = getStatusBarHeight();  //获取状态栏高度
//                LogUtils.info("--> statusBarH " + statusBarH);
                int screenH = parent.getRootView().getHeight();  //获取屏幕高度
//                LogUtils.info("--> screenH " + screenH);

                if (rect.top != statusBarH) {
                    //在这个demo中r.top代表的是状态栏高度,在沉浸式状态栏时r.top=0,通过getStatusBarHeight获取状态栏高度
                    rect.top = statusBarH;      //避免沉浸式状态栏的情况下获取的top=0
                }

                int keyboardH = screenH - (rect.bottom - rect.top);     //获取当前可能的键盘高度  keyboardH != statusBarH的时候即可能键盘出现
//                LogUtils.info("--> keyboardH " + keyboardH);
//                Log.d(TAG, "screenH= "+ screenH +" &keyboardH = " + keyboardH + " &r.bottom=" + r.bottom + " &top=" + r.top + " &statusBarH=" + statusBarH);

                if (keyboardH == mCurrentKeyboardH) {//有变化时才处理,否则会陷入死循环
                    return;
                }

                mCurrentKeyboardH = keyboardH;

//                LogUtils.info("--> mCurrentKeyboardH " + mCurrentKeyboardH);
                mScreenHeight = screenH;//应用屏幕的高度
//                mEditTextBodyHeight = edittextbody.getHeight(); // TODO: 2017/1/5

                if (keyboardH < 150) {//说明是隐藏键盘的情况
                    LogUtils.info("--> 隐藏键盘");
                    Observable.timer(200, TimeUnit.MILLISECONDS).observeOn(AndroidSchedulers.mainThread()).subscribe(new Action1() {
                        @Override
                        public void call(Long aLong) {
                            ib_recommend.setVisibility(View.VISIBLE);
                        }
                    });

                    return;
                } else {
                    LogUtils.info("--> 显示键盘");
                    ib_recommend.setVisibility(View.GONE);
                }
            }
        });
    }

    /**
     * 获取状态栏高度
     *
     * @return
     */
    private int getStatusBarHeight() {
        int result = 0;
        int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
        if (resourceId > 0) {
            result = getResources().getDimensionPixelSize(resourceId);
        }
        return result;
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        if (ev.getAction() == MotionEvent.ACTION_DOWN) {
            View v = getCurrentFocus();
            if (isShouldHideInput(v, ev)) {

                InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                if (imm != null) {
                    imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
                }
            }
            return super.dispatchTouchEvent(ev);
        }
        // 必不可少,否则所有的组件都不会有TouchEvent了
        if (getWindow().superDispatchTouchEvent(ev)) {
            return true;
        }
        return onTouchEvent(ev);
    }

    /**
     * 判断键盘是否应该隐藏
     * 点击除EditText的区域隐藏
     * @param v
     * @param event
     * @return
     */
    public boolean isShouldHideInput(View v, MotionEvent event) {
        if (v != null && (v instanceof EditText)) {
            int[] leftTop = {0, 0};
            //获取输入框当前的location位置
            v.getLocationInWindow(leftTop);
            int left = leftTop[0];
            int top = leftTop[1];
            int bottom = top + v.getHeight();
            int right = left + v.getWidth();
            if (event.getX() > left && event.getX() < right
                    && event.getY() > top && event.getY() < bottom) {
                // 点击的是输入框区域,保留点击EditText的事件
                return false;
            } else {
                return true;
            }
        }
        return false;
    }


你可能感兴趣的:(Android)