Як встановити початковий масштаб / ширину для веб-перегляду


76

Я намагаюся, щоб WebView мав подібну поведінку, як браузер Android. Браузер відкриває всі сторінки таким чином, що намагається відповідати їх ширині екрану. Однак поведінка WebView за замовчуванням починається зі 100% піксельної шкали, щоб вона почала масштабуватися у верхньому лівому куті.

Я витратив останні кілька годин, намагаючись знайти спосіб отримати WebView для масштабування сторінки на екран, як це робиться в браузері, але мені не пощастило. Хтось знайшов спосіб досягти цього?

Я бачу, це параметр під назвою setLoadWithOverviewMode, але, схоже, він взагалі нічого не зробив. Я також експериментував із setInitialScale, але на різних розмірах екрана та розмірах веб-сторінок, які не будуть такими витонченими, як масштабування браузера.

У когось є якісь потенційні клієнти?

Дякую

EDIT: Здається, метод Брайана працює, коли телефон знаходиться в альбомному, але не в портретному режимі. На портреті це близько, але все ще не вміщує весь екран на сторінці. Я починаю цю нагороду з надії, що є надійний спосіб отримати початкове масштабування відповідно до ширини сторінки в будь-якій орієнтації чи розмірі екрана.


ти знайшов рішення для цього.
Самуель

@Sam, так, прийняте рішення нижче працює для мене.
cottonBallPaws

чомусь я витратив цілий день навколо цього, і це працювало лише в api7, а не вище. Нарешті довелося реалізувати те саме за допомогою setInitialScale та обчислення початкового масштабу вручну. До речі, у мене було одне зображення розміром 480x800.
Самуель

Працює для мене на кожному пристрої, на якому я його випробував, починаючи з рівня api 7 і закінчуючи 14.
cottonBallPaws

Відповіді:


159

Наступний код завантажує настільну версію домашньої сторінки Google, повністю зменшену, щоб вписатися в webviewмене в Android 2.2 на екран розміром 854x480 пікселів. Коли я переорієнтую пристрій, і він перезавантажується в книжковому або альбомному режимі, ширина сторінки кожного разу повністю поміщається в межах подання.

BrowserLayout.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

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

Browser.java:

import android.app.Activity;
import android.os.Bundle;
import android.webkit.WebView;

public class Browser extends Activity {

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.BrowserLayout);

        String loadUrl = "http://www.google.com/webhp?hl=en&output=html";

        // initialize the browser object
        WebView browser = (WebView) findViewById(R.id.webview);

        browser.getSettings().setLoadWithOverviewMode(true);
        browser.getSettings().setUseWideViewPort(true);

        try {
            // load the url
            browser.loadUrl(loadUrl);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Дякую Брайано, здається, це працює на перший погляд. Я збираюся протестувати ще купу сайтів, перш ніж нагородити нагороду, але це виглядає багатообіцяючим!
cottonBallPaws

Це було чудове колишнє пояснення. +1
Тарік

у мене це не працює. Здається, масштабування встановлено після завантаження сторінки
джидува

Це чудово працювало ... як люди придумують ці рішення ?? Випробування та помилки, чи у вас є якийсь священний том?
CloudMeta

6
Це рішення також не спрацювало для мене. Я отримую багато вільного місця праворуч і знизу вмісту. Однак я завантажую зображення з папки "активи" замість веб-сторінки. Чи може це бути причиною?
SilithCrowe

20

Я зрозумів, чому портретний вигляд не повністю заповнював область перегляду. Принаймні в моєму випадку це було тому, що смуга прокрутки завжди відображалася. На додаток до коду вікна перегляду вище, спробуйте додати ще:

    browser.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY);
    browser.setScrollbarFadingEnabled(false);

Це призводить до того, що смуга прокрутки не займає місця для розмітки, і дозволяє веб-сторінці заповнити область перегляду.

Сподіваюся, це допомагає


12

Це старе запитання, але дозвольте мені додати деталь на випадок, якщо сюди приїде більше людей, таких як я.

Відмінна відповідь, опублікована Брайаном, не працює для мене в Jelly Bean. Я повинен також додати:

browser.setInitialScale(30);

Параметр може становити будь-який відсоток, який досягає того, що змінений розмір вмісту менше ширини веб-перегляду. Потім setUseWideViewPort (true) розширює ширину вмісту до максимальної ширини веб-перегляду.


Моя веб-сторінка, що відображається у веб-перегляді, складається з безлічі Javascript, це більше схоже на екранне меню в телевізорі, віджети з кнопками. Я використав ваше рішення, і у мене є 2 коментарі до цього: 1. перше завантаження веб-перегляду невдале, веб-перегляд чорне 2. друге правильне, але я можу двічі натиснути, і це те, що я не хочу, тому що це масштабується тоді віджети та кнопки перестають працювати. Будь-яку допомогу ви могли б надати? Дякую.
MartinC

Слід зазначити, що значення за замовчуванням WebView.setInitialScale(int)- 0, а не 100. Посилання на документацію
DBX12

Дякую, допомогло. Я спробував 5, 10, 30 і 70 відсотків. У випадку 70 він збільшив розмір великої сторінки до 70%, отже, з'явилися смуги прокрутки. У разі 5-30% він нормально змінював розмір сторінки.
CoolMind

7

Спробуйте скористатися широким вікном перегляду :

 webview.getSettings().setUseWideViewPort(true);

1
Дякую, здається, це в правильному напрямку. Здається, це саме по собі нічого не робило, але завдяки поєднанню setInitialScale (50) це чудово працювало у портреті. Однак, тримаючи телефон у вертикальному положенні, він не підходить для екрану. Чи є інші налаштування, якими я повинен користуватися на додаток до цього? Ось що я маю на даний момент: setBuiltInZoomControls (істина), setUseWideViewPort (істина), setInitialScale (50). Я хотів би, щоб він добре прилягав до екрану незалежно від розміру чи щільності екрану. Знову дякую.
cottonBallPaws

3

// для зображень та відео swf використовуйте ширину як "100%" та висоту як "98%"

mWebView2.getSettings().setJavaScriptEnabled(true);
mWebView2.getSettings().setLoadWithOverviewMode(true);
mWebView2.getSettings().setUseWideViewPort(true);
mWebView2.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY);
mWebView2.setScrollbarFadingEnabled(true);

Ви можете мені допомогти в цьому stackoverflow.com/questions/49098464 / ...
StuartDTO

1

Я працюю із завантаженням зображень для цієї відповіді, і хочу, щоб їх масштабували до ширини пристрою. Я вважаю, що для старих телефонів з версіями менше API 19 (KitKat) поведінка відповіді Брайана не така, як мені подобається. Він розміщує багато пробілів навколо деяких зображень на старих телефонах, але працює на моєму новому. Ось моя альтернатива, за допомогою цієї відповіді: Чи може WebView для Android автоматично змінювати розмір величезних зображень? Алгоритм компонування SINGLE_COLUMNзастарілий, але він працює, і я вважаю, що він підходить для роботи зі старими веб-переглядами.

WebSettings settings = webView.getSettings();

// Image set to width of device. (Must be done differently for API < 19 (kitkat))
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
    if (!settings.getLayoutAlgorithm().equals(WebSettings.LayoutAlgorithm.SINGLE_COLUMN))
        settings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN);
} else {
    if (!settings.getLoadWithOverviewMode()) settings.setLoadWithOverviewMode(true);
    if (!settings.getUseWideViewPort()) settings.setUseWideViewPort(true);
}

0

Якщо у вас є веб-перегляд, але ваші зображення все ще мають масштаб, найкращим рішенням, яке я знайшов ( тут ), було просто додавання документа до:

<style>img{display: inline; height: auto; max-width: 100%;}</style>

В результаті всі зображення масштабуються відповідно до ширини веб-перегляду.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.