Я использую CrossWalk для отображения веб-страницы, она работает хорошо. У меня есть функция захвата всего содержимого в виде растрового изображения для сохранения в SDCard, но я не могу найти решение. Использование TextureView может только фиксировать растровое изображение размера экрана, у кого есть такая же проблема? BTW, я могу захватить весь контент с помощью WebView.draw().
Как я могу захватить весь вид в растровое изображение при использовании перекрестка для отображения веб-страницы?
Ответ 1
Вот какой-нибудь псевдокод, который может помочь. Вы можете получить высоту и ширину контента из веб-представления, а затем вы можете использовать webview.draw()... так что-то вроде следующего.
Bitmap bitmap = Bitmap.createBitmap( webView.getWidth(), webView.getContentHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
webView.draw(canvas);
Затем вы можете вывести файл растрового изображения с помощью bitmap.compress и вывести его в выходной поток файла
//fos is a FileOutputStream, you can use something else if needed.
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);
Единственная проблема, которую я предвижу, заключается в том, что ваш растровый рисунок может закрепить содержимое горизонтально, так как WebView не имеет метода для получения ширины содержимого. В противном случае я думаю, что это должно сработать.
Ответ 2
Я никогда не пользовался переходом, но я предполагаю, что Crosswalk WebView также является потомком android.view.View. Если это так, то вы можете использовать кеш чертежа для просмотра Android. Это выглядит как
yourWebView.setDrawingCacheEnabled(true);
Bitmap bmp = yourWebView.getDrawingCache();
Затем, как сказал Павел, сохраните его через FileOutputStream
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);
Ответ 3
Вы не можете захватить изображение XWalkView стандартными способами, как описано в ответах выше, потому что Crosswalk XWalkView работает с аппаратным уровнем (то есть SurfaceView или TextureView). Но вы можете использовать метод getBitmap() класса TextureView, чтобы получить его.
Короче говоря, вы должны включить использование TextureView в Crosswalk до того, как XWalkView будет инициализирован (например, в подклассе Application):
XWalkPreferences.setValue(XWalkPreferences.ANIMATABLE_XWALK_VIEW, true);
И найдите TextureView в дереве просмотров, чтобы вызвать getBitmap() на нем.
Что-то вроде этого:
/**
* Returns TextureView which is used in XWalkView
*
* @param group
* @return
*/
private TextureView findXWalkTextureView(ViewGroup group) {
int childCount = group.getChildCount();
for (int i = 0; i < childCount; i++) {
View child = group.getChildAt(i);
if (child instanceof TextureView) {
String parentClassName = child.getParent().getClass().toString();
boolean isRightKindOfParent = (parentClassName.contains("XWalk"));
if (isRightKindOfParent) {
return (TextureView) child;
}
} else if (child instanceof ViewGroup) {
TextureView textureView = findXWalkTextureView((ViewGroup) child);
if (textureView != null) {
return textureView;
}
}
}
return null;
}
/**
* Example of capturing image from XWalkView based on TextureView
*
* @return
*/
public Bitmap captureImage() {
if (mXWalkView != null) {
Bitmap bitmap = null;
boolean isCrosswalk = false;
try {
Class.forName("org.xwalk.core.XWalkView");
isCrosswalk = true;
} catch (Exception e) {
e.printStackTrace();
}
if (isCrosswalk) {
try {
TextureView textureView = findXWalkTextureView(mXWalkView);
bitmap = textureView.getBitmap();
} catch (Exception e) {
e.printStackTrace();
}
} else {
bitmap = Bitmap.createBitmap(mXWalkView.getWidth(), mXWalkView.getHeight(), Bitmap.Config.ARGB_8888);
Canvas c = new Canvas(bitmap);
mXWalkView.draw(c);
}
return bitmap;
} else {
return null;
}
}
Проверьте этот код: https://github.com/gitawego/cordova-screenshot/blob/master/src/android/Screenshot.java для более подробной информации.