结论
requestScreenCapture文档内容如下:
从文档的说明来看,传入的参数为true
时横屏截图,false
时为竖屏截图,
先说结论,根据实际测试来看,传入true
时为以屏幕默认方向旋转90度截图,传入false
时为以屏幕默认方向截图,如果要以真正意义上的横屏截图(宽>高),应当根据当前宽度与高度与是否有屏幕旋转综合判断使用:
const width = getWidthPixels(); // 获取当前方向下的宽度(px)
const height = getHeightPixels(); // 获取当前方向下的宽度(px)
const rotation = activity.getWindowManager().getDefaultDisplay().getRotation(); // 获取旋转角度
// 屏幕未旋转时,且当前宽度小于高度,表示为手机模式,以默认方向下旋转屏幕截图
// 屏幕未旋转时,且当前宽度大于高度,表示为平板模式,以默认方向截图
// 屏幕旋转了,且当前宽度小于高度,表示为平板模式,以默认方向截图
// 屏幕旋转了,且当前宽度大于高度,表示为手机模式,以默认方向下旋转屏幕截图
requestScreenCaptureAsync(rotation == 0 ? width < height: width > height).then(function (success: boolean) {
// todo
});
其中获取当前屏幕宽高的方法,来自@auto.pro
/**
* 返回屏幕水平像素
*/
export const getWidthPixels = (): number => {
let dm = context.getResources().getDisplayMetrics();
let wm = context.getSystemService(context.WINDOW_SERVICE);
wm.getDefaultDisplay().getRealMetrics(dm);
return dm.widthPixels
}
/**
* 返回屏幕纵向像素
*/
export const getHeightPixels = (): number => {
let dm = context.getResources().getDisplayMetrics();
let wm = context.getSystemService(context.WINDOW_SERVICE);
wm.getDefaultDisplay().getRealMetrics(dm);
return dm.heightPixels
}
问题发现原因
早期主要根据雷电模拟器适配,其他模拟器大差不差与雷电用法差不多
雷电模拟器
早期在雷电模拟器上发现文档表述不准确,想当然的认为应该是:
requestScreenCapture传入true
时表示旋转屏幕截图,传入false
时表示以当前方向截图,当时申请横屏截图的代码如下:
requestScreenCaptureAsync(width < height).then(function (success: boolean) {
// todo
});
这段代码成功的稳定的运行了几年,不论在手机上,手机的虚拟机上,还是电脑的各种模拟器下,直到。。
mumu12
mumu12模拟器在3.5.2+的某次更新里面出现了问题,具体是哪个版本开始已无从考究,3.5.2时使用上面的代码是没有问题的,后面直接进行了一次大版本升级到了3.8.1时发现了问题:在手机模式下申请截图的方向不出现问题,在平板模式下申请截图的方向错误(截图为竖屏截图,上下大黑边,中间位置小小的横屏内容),但如果在平板模式下先旋转到竖屏,再按上面的代码去申请截图,该问题又消失了,经过排查发现当前版本的mumu12(3.8.4)的平板模式为手机模式旋转90度而来,发现上面的代码并不适用,经过实际摸索测试,传入true
时为以屏幕默认方向旋转90度截图,传入false
时为以屏幕默认方向截图,然后才有了上面最终的结论。