这几天相对来说比较闲做了一个评论添加图片的效果,
就是这个效果,主要的难点就是 软键盘的监听 和软键盘的大小 废话不多说,
上代码
layoutListener= new ViewTreeObserver.OnGlobalLayoutListener(){
//当键盘弹出隐藏的时候会 调用此方法。
@Override
public void onGlobalLayout() {
Rect r = new Rect();
//获取当前界面可视部分
PostDetailsActivity.this.getWindow().getDecorView().getWindowVisibleDisplayFrame(r);//获得可视大小
//获取屏幕的高度
int screenHeight = PostDetailsActivity.this.getWindow().getDecorView().getRootView().getHeight();
//此处就是用来获取键盘的高度的, 在键盘没有弹出的时候 此高度为0 键盘弹出的时候为一个正数
int heightDifference = screenHeight - r.bottom;
if (heightDifference!=0){
//键盘显示状态 或者华为虚拟键盘显示
if (mMaxHeight==0&&mMinHeight==0){
//第一次赋值
mMaxHeight=heightDifference;
mMinHeight=heightDifference;
}
if (heightDifference>mMaxHeight){
mMaxHeight=heightDifference;//获得最大的
}
if (heightDifference<mMinHeight){
mMinHeight=heightDifference;//获得最小的
}
if (mMaxHeight-mMinHeight!=0){
//说明有华为软键盘
mKeyheight=mMaxHeight-mMinHeight;//获得真正键盘高度
}else {
//没有就随意啦
mKeyheight=heightDifference;
}
if (mMaxHeight!=mMinHeight&&heightDifference==mMinHeight){
//是华为软键盘的高度 所以也是软键盘隐藏的状态
if (mImageSwitch) {
//如果是开添加图片状态 点添加图片的时候软键盘会消失 但有的时候RV回不显示
// 所以只能监听 如果是图片选择开启状态 强制获得集合 并且重新设置刷新
if (mImageRecyclerViewAdapter != null) {
List<PhotoInfo> photoInfos = mImageRecyclerViewAdapter.getPhotoInfos();
mImageRecyclerViewAdapter.setPhotoInfos(photoInfos);
}
}
mImageSwitch=false;//只有软键盘显示的是添加图片或者什么都没有
//下次弹出键盘走下面隐藏
}else {
//正常弹出输入法
if (!mImageSwitch) {
//不显示添加图片隐藏RV,展示键盘输入法
setRVheight(0);//软键盘显示 RV高度肯定是0的 选择图片模式 键盘显示图片隐藏 正常状态隐藏RV
}
}
}else {
//键盘隐藏
//键盘隐藏
if (mImageSwitch){
//如果是开添加图片状态 点添加图片的时候软键盘会消失 但有的时候RV回不显示
// 所以只能监听 如果是图片选择开启状态 强制获得集合 并且重新设置刷新
if (mImageRecyclerViewAdapter!=null) {
List<PhotoInfo> photoInfos = mImageRecyclerViewAdapter.getPhotoInfos();
mImageRecyclerViewAdapter.setPhotoInfos(photoInfos);
}
mImageSwitch=false;//下次软键盘弹出隐藏RV
}
}
}
};
mViewPostEdittext.getViewTreeObserver().addOnGlobalLayoutListener(layoutListener);
/**
* <p>
* 设置RV高度 选择图片大小应该和软键盘一样大
* </p>
* Author: Wu.Chen <br/>
* Date:2017/5/15
*/
private void setRVheight(int keyHeight){
ViewGroup.LayoutParams params= mRlAddimage.getLayoutParams();
params.height=keyHeight;
mRlAddimage.setLayoutParams(params);//设置
}
这里的RV其实就是RelativeLayout 我在里面放了一个RecyclerView用来添加图片的
这个主要就是获得OnGlobalLayoutListener 获得可视界面和屏幕界面大小,
两个高就是软键盘的变化大小 所以当这个heightDifference不为0的时候 说明这个高度就是软键盘的高度,但是还有有一个坑的,就是我发现华为是有自己虚拟键盘的 所以这个值不为0的时候 也是有可能软键盘隐藏的 会造成冲突 所以这里我用两个值 分辨获得除了0最大的值和最小的值,如果这两个值相同 就说明没有华为虚拟软键盘 如果不同 就说明有,并且记录真实软键盘的高度,第二点就是对于软件盘的监听,我们知道heightDifference 当时0 和 最小值的时候(如果有虚拟键盘的话)说明软键盘是隐藏的 软键盘隐藏的时候我要把我放图片的RelativeLayout的高度设置为0 但是只有一种情况 隐藏软键盘RelativeLayout的高度不是0,也就是我们添加图片的时候
这样的效果 所以当点击这个加号按钮的时候 我这里的方式是给一个布尔值 也就是上面所看到的mImageSwitch 当为ture的时候就是开启图片的状态 不走设置RelativeLayout为0的方法 这里还有一个莫名其妙的坑就是我设置数据传到我的Adapter里面 但是有的点击的时候这个里面没有数据 所以我又在点开添加图片mImageSwitch 为ture的时候重新获得我选择图片的数据然后设置进去 就搞定了 最后记得这个今天非常的耗内存
@Override
protected void onDestroy() {
super.onDestroy();
mViewPostEdittext.getViewTreeObserver()
.removeGlobalOnLayoutListener(layoutListener);//注销监听
}
记得释放掉 - -还有就是当这个RelativeLayout 不为0,添加图片展示的时候 按返回建我们要有和软键盘一样的效果 让他消失 所以
@Override
public void onBackPressed() {
ViewGroup.LayoutParams params= mRlAddimage.getLayoutParams();
if (params.height!=0){
//如果RV高度不是0 比如是选择图片状态
setRVheight(0);
}else {
super.onBackPressed();
}
}
体验优化更好一点 顺便说一下我这里用的图片选择框架是
compile 'cn.finalteam:galleryfinal:1.4.8.7'
不过这个好像已经不维护了你们可以用更好的框架 7.0系统如果打开相机拍照会有URL权限问题 记得在Application 里面 onCreate()方法添加一句
@Override
public void onCreate() {//程序的入口方法
//7.0相机权限问题 URL含有File都算你没权限
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
StrictMode.setVmPolicy(builder.build());
}
}
就可以啦 下一篇我会说一下我添加图片RecyclerView的实现方式