这个是我最近解决的一个问题,印象还比较深,就以这个开头吧。我的文采不好,有时候可能会不知所云,希望大家见谅。
在微信中,聊天的时候大家可能会发现,它的输入法和表情页切换的时候非常的流畅,不会出现闪动的情况(当然陌陌也是类似的),我仔细观察了下,两者切换的时候输入框的高度是不变的,一直固定在屏幕上。所有我猜测它表情页的高度和输入法的高度应该是一致的。这就引申出一个问题,如何获取输入法的高度:
大家可以先看下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:软键盘的状态并没有指定,系统将选择一个合适的状态或依赖于主题的设置
这次我用到的是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下载