wake-up-neo.com

aktivieren / deaktivieren Sie die Vergrößerung Android WebView

In WebSettings gibt es einige Methoden zum Zoomen:

  • WebSettings.setSupportZoom
  • WebSettings.setBuiltInZoomControls

Mir ist aufgefallen, dass sie auf einigen Geräten anders funktionieren. Zum Beispiel ist auf meinem Galaxy S das Zoomen per Voreinstellung aktiviert, aber auf LG P500 ist es deaktiviert (und jetzt weiß ich nicht, wie ich NUR das Zoomen per Pinch aktivieren kann, aber das Zoomen verstecke Tasten).

Wenn ich auf P500 setBuiltInZoomControls(true) aufrufe, funktionieren beide Varianten (Multitouch und Tasten).

So aktivieren Sie den Multitouch-Zoom und deaktivieren die Zoomtasten auf Geräten wie dem LG P500? Ich weiß auch, dass die gleichen Probleme bei HTC-Geräten auftreten.)

UPDATE: Hier ist fast der gesamte Code für die Lösung

if (ev.getAction() == MotionEvent.ACTION_DOWN ||
        ev.getAction() == MotionEvent.ACTION_POINTER_DOWN ||
        ev.getAction() == MotionEvent.ACTION_POINTER_1_DOWN ||
        ev.getAction() == MotionEvent.ACTION_POINTER_2_DOWN ||
        ev.getAction() == MotionEvent.ACTION_POINTER_3_DOWN) {
    if (multiTouchZoom && !buttonsZoom) {
        if (getPointerCount(ev) > 1) {
            getSettings().setBuiltInZoomControls(true);
            getSettings().setSupportZoom(true);
        } else {
            getSettings().setBuiltInZoomControls(false);
            getSettings().setSupportZoom(false);
        }
    }
}

if (!multiTouchZoom && buttonsZoom) {
    if (getPointerCount(ev) > 1) {
        return true;
    }
}

Dieser Code befindet sich in meiner onTouchEvent überschriebenen Methode von WebView.

64
Evgeny Nacu

Ich habe mir den Quellcode für WebView angesehen und bin zu dem Schluss gekommen, dass es keinen eleganten Weg gibt, das zu erreichen, wonach Sie fragen.

Am Ende habe ich WebView in Unterklassen unterteilt und OnTouchEvent überschrieben. In OnTouchEvent für ACTION_DOWN Überprüfe ich, wie viele Zeiger MotionEvent.getPointerCount() verwenden. Wenn es mehr als einen Zeiger gibt, rufe ich setSupportZoom(true) auf, andernfalls rufe ich setSupportZoom(false) auf. Ich rufe dann die super.OnTouchEvent(). auf

Dadurch wird das Zoomen beim Scrollen effektiv deaktiviert (wodurch die Zoom-Steuerelemente deaktiviert werden) und das Zoomen aktiviert, wenn der Benutzer das Zoomen einschränken möchte. Keine schöne Art, es zu tun, aber es hat bisher gut für mich funktioniert.

Beachten Sie, dass getPointerCount() in 2.1 eingeführt wurde, sodass Sie einige zusätzliche Dinge tun müssen, wenn Sie 1.6 unterstützen.

37
gngr44

Auf API> = 11 können Sie Folgendes verwenden:

wv.getSettings().setBuiltInZoomControls(true);
wv.getSettings().setDisplayZoomControls(false);

Nach dem SDK:

public void setDisplayZoomControls (boolean enabled) 

Seit: API Level 11

Legt fest, ob die Schaltflächen für den Bildschirmzoom verwendet werden. Eine Kombination aus aktivierten eingebauten Zoom-Steuerelementen und deaktivierten Steuerelementen für den Bildschirmzoom ermöglicht, dass das Zoomen ohne die Steuerelemente auf dem Bildschirm funktioniert

110
yuttadhammo

Wir hatten das gleiche Problem bei der Arbeit an einer Android -Anwendung für einen Kunden, und es gelang mir, diese Einschränkung zu umgehen.

Ich habe mir den Android-Quellcode für die WebView-Klasse angesehen und eine updateZoomButtonsEnabled()- -Methode entdeckt, die mit einer ZoomButtonsController- object zum Aktivieren und Deaktivieren der Zoom-Steuerelemente in Abhängigkeit vom aktuellen Maßstab des Browsers.

Ich suchte nach einer Methode, um die ZoomButtonsController- -Instanz zurückzugeben, und fand die getZoomButtonsController()- -Methode , die genau diese Instanz zurückgab.

Obwohl die Methode als public deklariert ist, ist sie in der WebView -Dokumentation nicht dokumentiert, und Eclipse konnte sie auch nicht finden. Also habe ich versucht, darüber nachzudenken und eine eigene WebView- Unterklasse erstellt, um die onTouchEvent()- -Methode zu überschreiben, die die Steuerelemente ausgelöst hat.

public class NoZoomControllWebView extends WebView {

    private ZoomButtonsController zoom_controll = null;

    public NoZoomControllWebView(Context context) {
        super(context);
        disableControls();
    }

    public NoZoomControllWebView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        disableControls();
    }

    public NoZoomControllWebView(Context context, AttributeSet attrs) {
        super(context, attrs);
        disableControls();
    }

    /**
     * Disable the controls
     */
    private void disableControls(){
        if (Android.os.Build.VERSION.SDK_INT >= Android.os.Build.VERSION_CODES.HONEYCOMB) {
            // Use the API 11+ calls to disable the controls
            this.getSettings().setBuiltInZoomControls(true);
            this.getSettings().setDisplayZoomControls(false);
        } else {
            // Use the reflection magic to make it work on earlier APIs
            getControlls();
        }
    }

    /**
     * This is where the magic happens :D
     */
    private void getControlls() {
        try {
            Class webview = Class.forName("Android.webkit.WebView");
            Method method = webview.getMethod("getZoomButtonsController");
            zoom_controll = (ZoomButtonsController) method.invoke(this, null);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        super.onTouchEvent(ev);
        if (zoom_controll != null){
            // Hide the controlls AFTER they where made visible by the default implementation.
            zoom_controll.setVisible(false);
        }
        return true;
    }
}

Möglicherweise möchten Sie die unnötigen Konstruktoren entfernen und auf die Ausnahmen reagieren.

Obwohl dies hacky und unzuverlässig aussieht, funktioniert es zurück zu API Level 4 (Android 1.6).


Wie @ jayellos in den Kommentaren ausgeführt wurde, ist die private getZoomButtonsController()- -Methode in Android 4.0.4 und höher nicht mehr vorhanden.

Muss es aber nicht. Mit bedingte Ausführung können wir überprüfen, ob wir uns auf einem Gerät mit API Level 11+ befinden, und die offen gelegte Funktionalität verwenden (siehe @ Yuttadhammo answer), um die Steuerelemente auszublenden .

Ich habe den obigen Beispielcode aktualisiert, um genau das zu tun.

29
Lukas Knuth

Ich habe Lukas Knuths Lösung ein wenig modifiziert:

1) Die Webansicht muss nicht in Unterklassen unterteilt werden.

2) Der Code stürzt bei der Bytecode-Überprüfung auf einigen Android 1.6-Geräten ab, wenn Sie nicht vorhandene Methoden nicht in separaten Klassen ablegen

3) Zoom-Steuerelemente werden weiterhin angezeigt, wenn der Benutzer eine Seite nach oben oder unten scrollt. Ich habe einfach den Zoom-Controller-Container auf Sichtbarkeit GEGANGEN gesetzt

  wv.getSettings().setSupportZoom(true);
  wv.getSettings().setBuiltInZoomControls(true);
  if (Android.os.Build.VERSION.SDK_INT >= Android.os.Build.VERSION_CODES.HONEYCOMB) {
    // Use the API 11+ calls to disable the controls
    // Use a seperate class to obtain 1.6 compatibility
    new Runnable() {
      public void run() {
        wv.getSettings().setDisplayZoomControls(false);
      }
    }.run();
  } else {
    final ZoomButtonsController zoom_controll =
        (ZoomButtonsController) wv.getClass().getMethod("getZoomButtonsController").invoke(wv, null);
    zoom_controll.getContainer().setVisibility(View.GONE);
  }
10
Jacob Nordfalk

Lukas Knuth hat eine gute Lösung, aber auf Android 4.0.4 auf dem Samsung Galaxy SII schaue ich immer noch Zoom-Steuerelemente. Und ich löse es über

if (zoom_controll!=null && zoom_controll.getZoomControls()!=null)
{
   // Hide the controlls AFTER they where made visible by the default implementation.
   zoom_controll.getZoomControls().setVisibility(View.GONE);
}

anstatt

if (zoom_controll != null){
   // Hide the controlls AFTER they where made visible by the default implementation.
   zoom_controll.setVisible(false);
}
7
Mihail M

Verbesserte Version von Lukas Knuth:

public class TweakedWebView extends WebView {

    private ZoomButtonsController zoomButtons;

    public TweakedWebView(Context context) {
        super(context);
        init();
    }

    public TweakedWebView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public TweakedWebView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init();
    }

    private void init() {
        getSettings().setBuiltInZoomControls(true);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
            getSettings().setDisplayZoomControls(false);
        } else {
            try {
                Method method = getClass()
                        .getMethod("getZoomButtonsController");
                zoomButtons = (ZoomButtonsController) method.invoke(this);
            } catch (Exception e) {
                // pass
            }
        }
    }

    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        boolean result = super.onTouchEvent(ev);
        if (zoomButtons != null) {
            zoomButtons.setVisible(false);
            zoomButtons.getZoomControls().setVisibility(View.GONE);
        }
        return result;
    }

}
1
yanchenko

Die von Ihnen veröffentlichte Lösung scheint zu funktionieren, indem verhindert wird, dass die Zoom-Steuerelemente angezeigt werden, wenn der Benutzer zieht. Es gibt jedoch Situationen, in denen der Benutzer den Zoom einschränkt und die Zoom-Steuerelemente angezeigt werden. Ich habe festgestellt, dass es zwei Möglichkeiten gibt, mit denen die Webansicht das Prise-Zoomen akzeptiert, und nur eine davon bewirkt, dass die Zoom-Steuerelemente trotz Ihres Codes angezeigt werden:

User Pinch Zooms und Steuerelemente werden angezeigt:

ACTION_DOWN
getSettings().setBuiltInZoomControls(false); getSettings().setSupportZoom(false);
ACTION_POINTER_2_DOWN
getSettings().setBuiltInZoomControls(true); getSettings().setSupportZoom(true);
ACTION_MOVE (Repeat several times, as the user moves their fingers)
ACTION_POINTER_2_UP
ACTION_UP

User Pinch Zoom und Steuerelemente werden nicht angezeigt:

ACTION_DOWN
getSettings().setBuiltInZoomControls(false); getSettings().setSupportZoom(false);
ACTION_POINTER_2_DOWN
getSettings().setBuiltInZoomControls(true); getSettings().setSupportZoom(true);
ACTION_MOVE (Repeat several times, as the user moves their fingers)
ACTION_POINTER_1_UP
ACTION_POINTER_UP
ACTION_UP

Können Sie mehr Licht in Ihre Lösung bringen?

1
Pete

hallo, für alle, die nach einer Lösung wie dieser suchen. Ich hatte ein Problem mit der Skalierung in WebView. Der beste Weg, dies zu tun, ist in Ihrer Java.class, in der Sie alles für WebView einstellen my webView -> webViewSearch = (WebView) findViewById (R.id.id_webview_search);)

// force WebView to show content not zoomed---------------------------------------------------------
    webViewSearch.getSettings().setLoadWithOverviewMode(true);
    webViewSearch.getSettings().setUseWideViewPort(true);
0
Perhpethua