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.