Как я могу захватить весь вид в растровое изображение при использовании перекрестка для отображения веб-страницы?

Я использую 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 для более подробной информации.