Android-веб-просмотр делает снимок экрана только сверху страницы

Я делаю очень простую задачу - сделать скриншот из моего веб-представления в растровое изображение... Я делаю это так:

webView.setDrawingCacheEnabled(true);
Bitmap bitmap = Bitmap.createBitmap(webView.getDrawingCache(false));
webView.setDrawingCacheEnabled(false);
Canvas canvas = new Canvas(bitmap);
webView.draw(canvas);

Проблема в том, что окончательное растровое изображение всегда показывает верхнюю часть содержимого моей веб-страницы! Мне на самом деле нужно, чтобы сделать скриншот, где я прокрутил контент, но это не просто так! Я искал в сети в течение двух часов, но, похоже, ни у кого больше нет подобных проблем. Есть идеи, что могло пойти не так?

2 ответа

Я полагаю, это на Lollipop? Если это так, убедитесь, что вы вызываете WebView.enableSlowWholeDocumentDraw () ( doc) перед первым вызовом setContentView() это раздувает макет с WebView.

На самом деле вам не нужны последние 2 строки, просто отбросьте их.

webView.setDrawingCacheEnabled(true);  
Bitmap bitmap = Bitmap.createBitmap(webView.getDrawingCache(false));  
webView.setDrawingCacheEnabled(false);

вернет именно то растровое изображение, которое вам нужно, из того, что я видел.

Я столкнулся с той же проблемой и решил ее следующим образом:

Первый звонок WebView.enableSlowWholeDocumentDraw() до setContentView(), Затем сделайте снимок экрана со всем содержимым веб-просмотра и затем обрежьте растровое изображение до фактического размера представления с требуемым смещением прокрутки:

// the minimum bitmap height needs to be the view height
int bitmapHeight = (webView.getMeasuredHeight() < webView.getContentHeight())
         ? webView.getContentHeight() : webView.getMeasuredHeight();

Bitmap bitmap = Bitmap.createBitmap(
         webView.getMeasuredWidth(), bitmapHeight, Bitmap.Config.ARGB_8888);

Canvas canvas = new Canvas(bitmap);
webView.draw(canvas);

// prevent IllegalArgumentException for createBitmap: 
// y + height must be <= bitmap.height()
int scrollOffset = (scrollTo + webView.getMeasuredHeight() > bitmap.getHeight())
         ? bitmap.getHeight() : scrollTo;

Bitmap resized = Bitmap.createBitmap(
         bitmap, 0, scrollOffset, bitmap.getWidth(), webView.getMeasuredHeight());

Это сработало для меня...

Сначала добавьте веб-просмотр в LinearLayout..

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/layoutWeb"
    >
    <WebView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/webview"/>
</LinearLayout>

Во-вторых, инициализируйте представления внутри метода onCreate()...

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    webView = (WebView) findViewById(R.id.webview);
    webLayout = (LinearLayout) findViewById(R.id.layoutWeb);
    ....
 }

В-третьих, напишите функцию для создания снимка экрана... Здесь View v1 = webLayout; указывает представление, снимок экрана которого мы хотим сделать.

public void takeScreenshot() {
  try{   
      View v1 = webLayout;
      v1.setDrawingCacheEnabled(true);
      Bitmap bitmap = Bitmap.createBitmap(v1.getDrawingCache());
      v1.setDrawingCacheEnabled(false);
      String mPath = Environment.getExternalStorageDirectory().toString() + "/screenshot.jpg";
      File imageFile = new File(mPath);
      FileOutputStream outputStream = new FileOutputStream(imageFile);
      int quality = 100;
      bitmap.compress(Bitmap.CompressFormat.JPEG, quality, outputStream);
      outputStream.flush();
      outputStream.close();
 } catch(Throwable e) {
       e.printStackTrace();
  }

Это делает снимок экрана той части, которая покрывается webLayout. Прокрутите вверх, чтобы сосредоточиться на других областях, и сделайте снимок экрана WebView.

Другие вопросы по тегам