2010-06-23 2 views
27

В некоторых веб-браузерах огромные изображения автоматически изменяются в соответствии с разрешением экрана.Может ли Android WebView автоматически изменять размеры огромных изображений?

Возможно ли это сделать в Android WebView?

Веб-страница содержит только изображение, возможно, добавление некоторых JavaScript может сделать трюк?
Кто-нибудь уже это сделал?

Примечание: я не знаю размер изображения заранее.

ответ

69

Да, это возможно. Вы можете попробовать настроить макет WebView с помощью кода ниже. Он изменяет размеры всех изображений (больше, чем Device Screen Width) на ширину экрана. Это работает для обоего ориентаций (портрет и пейзаж)

webview.getSettings().setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN); 

Вы можете добавить дополнительные поля/отступы позже, чтобы получить право Spacing.

+1

+1 Я еще не пробовал, но это звучит идеально, лучше, чем с помощью JavaScript. –

+2

Работы, проверенные на 2.2.1, 3.2 и 4.0.3. 'minSdkVersion =" 8 "' 'targetSdkVersion =" 15 "и' android-support-v4.jar'. Очень простой и эффективный! – Ruben

+0

Работает как очарование, спасибо. –

13

Вы можете иметь браузер изменить размер изображения для вас, чтобы соответствовать максимальной ширине экрана:

<img src="huge-image.jpg" width="100%" /> 

Изменение размера его высоту окна просмотра WebView является тоже возможно:

<img src="huge-image.jpg" height="100%" /> 

Однако, изменение размера как ширина, так и высота приведут к растянутому изображению. Для того, чтобы либо изменить ширину или высоту в зависимости от того, что сторона подходит лучше всего, вы можете рассмотреть немного JavaScript, например:

<img src="huge-image.jpg" onload="resize(this);" /> 


<script type="text/javascript"> 

    function resize(image) 
    { 
     var differenceHeight = document.body.clientHeight - image.clientHeight; 
     var differenceWidth = document.body.clientWidth - image.clientWidth; 
     if (differenceHeight < 0) differenceHeight = differenceHeight * -1; 
     if (differenceWidth < 0) differenceWidth = differenceWidth * -1; 

     if (differenceHeight > differenceWidth) 
     { 
      image.style['height'] = document.body.clientHeight + 'px'; 
     } 
     else 
     { 
      image.style['width'] = document.body.clientWidth + 'px'; 
     } 

     // Optional: remove margins or compensate for offset. 
     image.style['margin'] = 0; 
     document.body.style['margin'] = 0; 
    } 

</script> 
+2

Это прекрасно работает, но оно улучшает масштабирование. Знаете ли вы об этом? –

+1

Если вы [измените размер только ширины] (http://stackoverflow.com/questions/3923610/fit-image-in-webview/24072099#24072099), высота будет пропорционально изменена. –

-1

Вы можете отправить размер вы хотите в параметрах запроса и пусть сервер установить ширину/высота в элементе img для вас.

+0

Проблема в том, что я заранее не знаю размер изображения. –

12

Вы могли бы использовать это:

WebView webView = (WebView) findViewById(R.id.myWebView); 
webView.getSettings().setLoadWithOverviewMode(true); 
webView.getSettings().setUseWideViewPort(true); 

Найдено это решение здесь: How to set the initial zoom/width for a webview

2

Если WebView ширина fill_parent, то вы можете использовать этот код:

Display display=getWindowManager().getDefaultDisplay(); 
int width=display.getWidth(); 
String data="<img src='http://example.com/image.jpg' style='width:"+width+"px' />"; 
webView.loadData(data, "text/html", "utf-8"); 

И зум еще за работой!

Тот же метод, если height есть fill_parent.

+0

Ах, проблема в том, что только ширина изменяется, я хотел бы сохранить пропорции ... –

+1

@NicolasRaoul Я тестировал ее на Android 4.0.3 - пропорции такие же –

+0

Интересно, мне придется попробовать! –

0

Мой любимца:

String data = "<html><body ><img id=\"resizeImage\" src=\""+PictureURL+"\" width=\"100%\" alt=\"\" align=\"middle\" /></body></html>"; 
webview.loadData(data, "text/html; charset=UTF-8", null); 
34
webview.getSettings().setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN); 

работает, но это deprecated. Это еще одно решение без LayoutAlgorithm.SINGLE_COLUMN, используя CSS:

@SuppressLint("NewApi") 
private openWebView() { 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { 
     webView.getSettings().setLayoutAlgorithm(LayoutAlgorithm.TEXT_AUTOSIZING); 
    } else { 
     webView.getSettings().setLayoutAlgorithm(LayoutAlgorithm.NORMAL); 
    } 
    String data = "<div> your HTML content </div>"; 
    webView.loadDataWithBaseURL("file:///android_asset/", getHtmlData(data), "text/html", "utf-8", null); 
} 

private String getHtmlData(String bodyHTML) { 
    String head = "<head><style>img{max-width: 100%; width:auto; height: auto;}</style></head>"; 
    return "<html>" + head + "<body>" + bodyHTML + "</body></html>"; 
} 
+1

+1 Действительно 'LayoutAlgorithm.SINGLE_COLUMN', кажется, устарел, поэтому решение Шехарьяра становится менее привлекательным ... –

+1

работает отлично ... :) –

+0

Отличное решение! Благодаря! –

Смежные вопросы