1.目前项目中常用通过WindowManager获取手机屏幕的宽高来做一些UI展示,但是不兼容全面屏手机,手机分辨率2160 * 1080, 比如小米Mix2、锤子坚果Pro2等机型
Display display = activity.getWindowManager().getDefaultDisplay();
int widths = display.getWidth();
int heights = display.getHeight(); //全面屏手机获取的高度是2030,不包含底部的虚拟按键高度
解决的方法是通过获取顶层Window宽高
View view = activity.getWindow().getDecorView();
int widths = view.getWidth();
int heights = view.getHeight(); //高度是2160
2.自定义Dialog可以通过获取Window设置宽高
Window dialogWindow = dialog.getWindow();
lp = dialogWindow.getAttributes();
lp.width = ViewGroup.LayoutParams.MATCH_PARENT;
lp.height = ViewGroup.LayoutParams.MATCH_PARENT; //注意一定要是MATCH_PARENT
dialogWindow.setAttributes(lp);
处理高斯模糊背景的dialog截屏的核心代码
/**
* 截屏
*/
public static Bitmap takeScreenShot(Activity activity) {
Bitmap b = null;
try {
// 获取windows中最顶层的view
View view = activity.getWindow().getDecorView();
view.buildDrawingCache();
// 获取状态栏高度
Rect rect = new Rect();
view.getWindowVisibleDisplayFrame(rect);
int statusBarHeights = rect.top;
int widths = view.getWidth();
int heights = view.getHeight();
//此获取宽高的方式不适用全名屏, 不会包含底部的虚拟按键高度, 导致截屏过程中缺少这部分高度
//Display display = activity.getWindowManager().getDefaultDisplay();
// 获取屏幕宽和高
//int widths = display.getWidth();
//int heights = display.getHeight();
// 允许当前窗口保存缓存信息
view.setDrawingCacheEnabled(true);
// 去掉状态栏
b = Bitmap.createBitmap(view.getDrawingCache(), 0,
statusBarHeights, widths, heights - statusBarHeights);
// 销毁缓存信息
view.destroyDrawingCache();
} catch (Exception e) {
e.printStackTrace();
}
return b;
}
3.处理效果对比:
上下空白间距
底部模糊未覆盖