问题:最近开发使用webView的时候,发现webView操作很卡,发现是由于webView关闭硬件加速导致
分析:关闭webView硬件加速,是由于需要对webView截取bitmap
截取Bitmap代码如下:
// 获取webView的宽高,创建一个和webView宽高一直的Bitmap
int width = webView.getWidth();
int height = webView.getHeight();
// 创建一个空白的Bitmap, width 和 height 必须大于 0
Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
// 关闭硬件加速,否则截取webView快照时是空白的
webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
// 将webView的截图绘制到bitmap
webView.draw(new Canvas(bitmap));
使用上面代码截取webView时,如果不关闭硬件加速,截取的bitmap是空白的
经过查阅资料发现在Android O(Android 8.0 api 26)及以上的Android系统提供了另外一个截取webView的方法,代码如下:
// 获取webView的宽高,创建一个和webView宽高一直的Bitmap
int width = webView.getWidth();
int height = webView.getHeight();
// 创建一个空白的Bitmap, width 和 height 必须大于 0
Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
Rect rect = new Rect();
// 获取webView在屏幕中的坐标
webView.getGlobalVisibleRect(rect);
// 获取webView的bitmap
PixelCopy.request(getWindow(), rect, bitmap, new PixelCopy.OnPixelCopyFinishedListener() {
@Override
public void onPixelCopyFinished(int copyResult) {
System.out.println("onPixelCopyFinished: " + copyResult);
if (copyResult == PixelCopy.SUCCESS) {
// 保存Bitmap
}
}
}, new Handler(Looper.getMainLooper()));
以上方法可在Android 8.0 系统上,webView开启硬件加速的场景下截取bitmap,完整代码如下:
private void captureWebView(WebView webView) {
// 获取webView的宽高,创建一个和webView宽高一直的Bitmap
int width = webView.getWidth();
int height = webView.getHeight();
// 创建一个空白的Bitmap, width 和 height 必须大于 0
Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
Rect rect = new Rect();
// 获取webView在屏幕中的坐标
webView.getGlobalVisibleRect(rect);
// 获取webView的bitmap
PixelCopy.request(getWindow(), rect, bitmap, new PixelCopy.OnPixelCopyFinishedListener() {
@Override
public void onPixelCopyFinished(int copyResult) {
System.out.println("onPixelCopyFinished: " + copyResult);
if (copyResult == PixelCopy.SUCCESS) {
// 保存Bitmap
saveBitmap(bitmap);
}
}
}, new Handler(Looper.getMainLooper()));
} else {
// 关闭硬件加速,否则截取webView快照时是空白的
webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
// 将webView的截图绘制到bitmap
webView.draw(new Canvas(bitmap));
// 保存Bitmap
saveBitmap(bitmap);
}
}
private void saveBitmap(Bitmap bitmap) {
File dir = getExternalCacheDir();
SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd_HHmmssSSS", Locale.getDefault());
String filename = format.format(System.currentTimeMillis());
File file = new File(dir, filename + ".png");
System.out.println("file path: " + file.getAbsolutePath());
try {
FileOutputStream fos = new FileOutputStream(file);
bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos);
fos.flush();
fos.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
记录一下这个小问题,希望对大家有所帮助