博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
重写dispatchTouchEvent方法,实现EditText失去焦点后(点击其他地方)收起键盘的效果
阅读量:2085 次
发布时间:2019-04-29

本文共 2807 字,大约阅读时间需要 9 分钟。

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

转载地址:http://kpsqf.baihongyu.com/

你可能感兴趣的文章
Postman 安装及使用入门教程
查看>>
获取指定包下所有自定义注解并提取注解信息
查看>>
Windows 环境下 Git clone pull fetch 慢 解决之道
查看>>
Redis (error) NOAUTH Authentication required.解决方法
查看>>
plsql窗口中文显示的是横版的 问题解决办法
查看>>
使用notePad修改将文件格式保存后不起作用
查看>>
如何查询oracle会话及锁 如何查锁了哪张表?如何杀掉会话
查看>>
Git常用命令速查手册
查看>>
Redis运维利器 -- RedisManager
查看>>
分布式之REDIS复习精讲
查看>>
分布式之数据库和缓存双写一致性方案解析
查看>>
Redis集群
查看>>
Oracle 查看和扩展表空间
查看>>
记一次线上Java程序导致服务器CPU占用率过高的问题排除过程
查看>>
Java 内存溢出(java.lang.OutOfMemoryError)的常见情况和处理方式总结
查看>>
从cpu和内存来理解为什么数组比链表查询快
查看>>
CentOS7下使用YUM安装MySQL5.6
查看>>
JVM内存空间
查看>>
Docker 守护进程+远程连接+安全访问+启动冲突解决办法 (完整收藏版)
查看>>
从零写分布式RPC框架 系列 2.0 (4)使用BeanPostProcessor实现自定义@RpcReference注解注入
查看>>