目前项目在做IM聊天功能,仿照微信的语音接听页面:
这个页面看上去好像用一个activity来实现,但是呢,左上角有个小窗口模式,因此不适合用activity来实现,因此想到了自定义一个view,可以动态添加到任何activity页面中。但是遇到了个问题:
根据getWindow().getDecorView() 添加进去的view,无法全屏显示(显示到状态栏和底部虚拟按键部分)
所以不符合需求,后来发现popupwindow可以实现这个效果,因此又把popupwindow的源码看了一遍,根据popupwindow实现了可以扩展到状态栏和底部虚拟按键部分:
关键代码如下:
private void showImage() {
WindowManager mWindowManager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
final WindowManager.LayoutParams p = createPopupLayoutParams(getWindow().getDecorView().getApplicationWindowToken());
ImageView imageView = new ImageView(this);
FrameLayout frameLayout = new FrameLayout(this);
frameLayout.addView(imageView);
imageView.setBackground(new BitmapDrawable(BitmapUtils.loadBitmapFormRes(R.drawable.hbst_logo)));
FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) imageView.getLayoutParams();
//屏幕高度+顶部导航栏高度(如果延伸到底部虚拟按键,还要加上虚拟按键高度)
params.height = me.jessyan.autosize.utils.ScreenUtils.getScreenSize(this)[1] + ImmersionBar.getStatusBarHeight(this);
//屏幕宽度
params.width = me.jessyan.autosize.utils.ScreenUtils.getScreenSize(this)[0];
imageView.setLayoutParams(params);
frameLayout.setFitsSystemWindows(false);
mWindowManager.addView(frameLayout, p);
}
protected WindowManager.LayoutParams createPopupLayoutParams(IBinder token) {
final WindowManager.LayoutParams p = new WindowManager.LayoutParams();
p.gravity = Gravity.NO_GRAVITY;
p.flags = computeFlags(p.flags);
p.type = WindowManager.LayoutParams.TYPE_APPLICATION_PANEL;
p.token = token;
p.softInputMode = WindowManager.LayoutParams.SOFT_INPUT_STATE_UNCHANGED;
p.windowAnimations = -1;
p.format = PixelFormat.TRANSLUCENT;
p.height = WindowManager.LayoutParams.MATCH_PARENT;
p.width = WindowManager.LayoutParams.MATCH_PARENT;
return p;
}
private int computeFlags(int curFlags) {
curFlags &= ~(
WindowManager.LayoutParams.FLAG_IGNORE_CHEEK_PRESSES |
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |
WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE |
WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH |
WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS |
WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM |
WindowManager.LayoutParams.FLAG_SPLIT_TOUCH);
curFlags |= WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM;
curFlags |= WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH;
curFlags |= WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS;
curFlags |= WindowManager.LayoutParams.FLAG_SPLIT_TOUCH;
//打开则不会显示到底部虚拟按键部分,隐藏掉会显示到,相应的布局高度也要增加虚拟按键高度
// curFlags |= WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN;
curFlags |= WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR;
curFlags |= WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL;
curFlags |= WindowManager.LayoutParams.FLAG_LAYOUT_ATTACHED_IN_DECOR;
return curFlags;
}
效果完美,记录一下 ,避免重复造轮子。