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

时间:2022-08-23 14:52:40

原文:http://m.blog.csdn.net/blog/u013677619/43149585


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


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


大家可以先看下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,表达能力有限,就不一一说明了。