这个是我最近解决的一个问题,印象还比较深,就以这个开头吧。我的文采不好,有时候可能会不知所云,希望大家见谅。

在微信中,聊天的时候大家可能会发现,它的输入法和表情页切换的时候非常的流畅,不会出现闪动的情况(当然陌陌也是类似的),我仔细观察了下,两者切换的时候输入框的高度是不变的,一直固定在屏幕上。所有我猜测它表情页的高度和输入法的高度应该是一致的。这就引申出一个问题,如何获取输入法的高度:

大家可以先看下http://blog.csdn.net/sanjinxiong/article/details/9989517这篇博客,我是利用其中输入框在屏幕中的位置改变来判断输入法高度的。在首次进到聊天窗口的时候,输入框默认是在屏幕底部的,若点击输入框,弹出输入法的时候,输入法会将输入框的位置挤到屏幕中的某个位置。这样我们就可以根据手机屏幕高度-输入框底部在屏幕中的位置。这样获取到的值就是输入法的高度了。但是这是对于没有虚拟按键的手机,如果是有虚拟按键的话,这样的计算方法是有问题的。对于没有虚拟按键的手机上,手机屏幕高度=状态栏+应用窗口高度。有虚拟按键的时候则是 状态栏+应用窗口高度+虚拟按键的高度。这个时候我们就需要判断手机是否有虚拟按键了。我是这样判断的

@Override  
        public void onWindowFocusChanged(boolean hasFocus) {  
            super.onWindowFocusChanged(hasFocus);  
            if(hasFocus){  
                 Rect frame = new Rect();  
                  getWindow().getDecorView().getWindowVisibleDisplayFrame(frame);  
                  int statusBarHeight = frame.top; //手机状态栏高度
                 
                  int mobileheight=statusBarHeight+input_listener.getHeight();//应用的高度+手机状态栏高度
                 
                  if(mobileheight!=MobileApplication.dm.heightPixels){ // 如果手机屏幕=应用的高度+手机状态栏高度,即没有虚拟按键。若是不相等 则虚拟按键存在 virtual_key的值就是虚拟按键的高度了
                     virtual_key=MobileApplication.dm.heightPixels-mobileheight;   //virtual_key默认是0
                  }
            }  
        }

其中的MobileApplication.dm是DisplayMetrics dm = new DisplayMetrics();的对象

这样输入法的高度=手机屏幕高度-输入框底部在屏幕中的位置-虚拟按键的高度。

接下来就是输入法和表情页切换了。

在这之前,我们需要了解下android输入法中的主要的几个的参数

//        【A】stateUnspecified:软键盘的状态并没有指定,系统将选择一个合适的状态或依赖于主题的设置
//        【B】stateUnchanged:当这个activity出现时,软键盘将一直保持在上一个activity里的状态,无论是隐藏还是显示
//        【C】stateHidden:用户选择activity时,软键盘总是被隐藏
//        【D】stateAlwaysHidden:当该Activity主窗口获取焦点时,软键盘也总是被隐藏的
//        【E】stateVisible:软键盘通常是可见的
//        【F】stateAlwaysVisible:用户选择activity时,软键盘总是显示的状态
//        【G】adjustUnspecified:默认设置,通常由系统自行决定是隐藏还是显示
//        【H】adjustResize:该Activity总是调整屏幕的大小以便留出软键盘的空间
//        【I】adjustPan:当前窗口的内容将自动移动以便当前焦点从不被键盘覆盖和用户能总是看到输入内容的部分

这次我用到的是ADJUST_PAN和ADJUST_RESIZE 。通俗点来说就是ADJUST_RESIZE会将我们的布局挤压上去以此来显示输入法,ADJUST_PAN则是输入法会覆盖我们的布局,这个就是有些人所说的输入法覆盖输入框的问题了。

当我们刚进到聊天窗口的时候,需要在oncreate中:

window=getWindow();
        window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN 
                |WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE); //第一个参数是默认不弹出输入法 第二个参数输入法将布局顶上去

当表情页和输入法切换的时候  不需要把表情页给Gone掉,而是view.setVisibility(View.INVISIBLE);  这样子表情页在屏幕中所占的高度还在  输入框就会固定在屏幕中了。而切换过程中出现黑屏闪动的情况只需要在切换之前用thread.sleep(200)休眠一会儿就好了。

具体的一些逻辑处理可以看我上传的demo,表达能力有限,就不一一说明了。

demo下载

关于陌陌和微信表情页与输入法之间切换的问题相关推荐

  1. 微信表情与输入法无缝切换(原理篇)

    对于做过表情与输入法切换的就应该知道,它们之间正常切换的话会存在对话框掉下去的情况.如果不知道可以去对比易信的表情界面与输入法的切换,跟微信的表情界面与输入法切换的区别,明显效果不可同日而语. 废话不 ...

  2. 25页PPT带你吃透微信、陌陌等著名IM软件设计架构(值得珍藏)

    源 /  网络    文 /  佚名 对微信.陌陌等进行了分析,发出来分享一下. 电量:对于移动设备最大的瓶颈就是电量了.因为用户不可能随时携带电源,充电宝.所以必须考虑到电量问题.那就要检查我们工程 ...

  3. 微信、陌陌等社交App,前后台整体架构设计实践分享,25页PPT

    点击"技术领导力"关注∆  每天早上8:30推送 作者| Mr.K   编辑| Emma 来源| 技术领导力(ID:jishulingdaoli) 本文整理了微信.陌陌技术团队对外 ...

  4. 网络陌生人交友APP对比评测 微信、陌陌、比邻各有优缺点

    无论哪个时代,男女盆友资源的分配总是不平均的,所以陌生人社交app一直有旺盛的需求.从最开始的微信摇一摇,到无心插柳成约炮神器的陌陌,再到玩直接语音交友的比邻,为解决男女盆友分配和各类情感问题,一代代 ...

  5. 微信的碾压下陌陌为什么活了下来还赚钱了?

    PMCAFF(www.pmcaff.com):互联网产品社区,是百度,腾讯,阿里等产品经理的学习交流平台.定期出品深度产品观察,互联产品研究首选. 外包大师(www.waibaodashi.com): ...

  6. 手机版_仿微信 陌陌 安卓版(android)/苹果版(iPhone ios),移动社交APP系统源码,企业即时通讯APP程序源码,手机聊天软件源码,移动聊天APP开发...

    一:系统背景 根据国际电信联盟发布的<衡量信息社会发展报告>中显示:2014年全球手机用户已超过70亿人,全球互联网用户已超过30亿人,世界上移动通信设备用户总数已超过世界总人口数(还在稳 ...

  7. 陌陌、米聊、微博、微信看IT人士对交际的重视

    近日传言有投资方对陌陌投资4000万美元,可见从事互联网IT业,手机业,对沟通软件的开发的重视.随着研发,各自品牌的聊天工具免费使用,不同公司对聊天软件各种功能进行整合.以下简单介绍一些相关的并受欢迎 ...

  8. 微信、陌陌等著名IM软件设计架构详解【转】

    原贴http://blog.csdn.net/justinjing0612/article/details/38322353 对微信.陌陌等进行了分析,发出来分享一下(时间有些久了) 电量:对于移动设 ...

  9. Java可以hook微信吗,Hook实现Android 微信、陌陌 、探探位置模拟(附源码下载)

    Hook实现Android 微信.陌陌 .探探位置模拟 最近需要对微信,陌陌等程序进行位置模拟 实现世界各地发朋友圈,搜索附近人的功能,本着站在巨人肩膀上的原则 爱网上搜索一番. 也找到一些 代码和文 ...

最新文章

  1. linux基础上的三维重建,Ubuntu16.04下用ZED双目立体相机进行SLAM(以相机轨迹生成和三维重建为例)...
  2. Filter(过滤器)
  3. Java 集合系列02之 Collection架构
  4. Java垃圾回收工作原理
  5. 微型计算机滑动平均值滤波器方程,微型计算机控制技术期末复习2011.ppt
  6. 妙用Windows安全模式执行杀毒
  7. 第二章 数组名是一个指针常量吗?
  8. java 读取网络图片_每日一学:如何读取网络图片
  9. EAE:自编码器 + BN + 最大熵 = 生成模型
  10. SAP Commerce Cloud deprecation机制
  11. C语言试题七十三之请编写函数求两个数的最大公约数
  12. OpenShift 4 - 容器应用备份和恢复
  13. require-ensure
  14. 如何在Mac上的“活动监视器”中运行系统诊断?
  15. 笔记本电脑(PC)序列号查询
  16. 发送网页内容到onenote_如何直接在网页上做笔记并保存到 Onenote?
  17. 大屏可视化解决方案:公安大数据平台建设
  18. 苏州Uber优步司机奖励政策(8月31日至9月6日)
  19. [css选择器] 后代选择器
  20. 台式电脑电源接口介绍

热门文章

  1. Android 手机红外遥控器实现
  2. 灵魂一问-如何彻底防止APK反编译?积累总结
  3. hadoop1.2.1+zookeeper3.4.6+hbase0.94集群环境搭建
  4. OpenStack新版UI管理skyline
  5. 学校永远不会教你的财富课:养鹅
  6. linux系统篇 -- 一、系统概要
  7. .net 本地文件管理 代码_如何在百万行代码中发现隐藏的后门
  8. 讯飞智能录音笔SR101:性价比满满的AI好物
  9. 什么是API,SDK 两者有什么关系?
  10. linux加载模块失败,linux 第二次加载netlink模块时,内核创建sock失败