问题:最近开发使用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);

}

}

记录一下这个小问题,希望对大家有所帮助

文章来源

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: