2013-04-18 17 views
8

WebView.getScale() jest przestarzała (ale nadal użyteczny)Jak dostać Webview skalę w Androidzie 4

Zalecanym sposobem, aby uzyskać skalę dla WebView jest użycie WebViewClient.onScaleChanged() http://developer.android.com/reference/android/webkit/WebViewClient.html#onScaleChanged(android.webkit.WebView, float, float)

Dodałem odpowiadające obsługi w moim niestandardowego WebView:

public class CustomWebView extends WebView { 

public CustomWebView(Context context) { 
    super(context); 
    setWebViewClient(new WebViewClient() { 
     @Override 
     public void onScaleChanged(WebView view, float oldScale, float newScale) { 
      super.onScaleChanged(view, oldScale, newScale); 
      currentScale = newScale 
     } 
    }); 
} 

I teraz problem: metoda nie wywoływany (przynajmniej na moim Nexus 7) jeśli jestem zoom in/zoom przy użyciu szczyptę, więc działa dobrze tylko wtedy, gdy używam regulacji zoomu, ale tona.

+0

Czy znalazłeś już odpowiedź? Mam ten sam problem. –

+0

Nie znalazłem sposobu na zmianę skalowania, ale moim celem było śledzenie aktualnej skali, więc musiałem użyć wycofanego podejścia WebView.getScale() zamiast skalowania. Jeśli chcesz śledzić zdarzenie zmiany skali w widoku internetowym, spróbuj ustawić niestandardowy detektor gestów na widok internetowy i po prostu śledź zdarzenia szczypania. Nie wiem, czy to zadziała, po prostu pomysł. – abovesun

+0

Nie mam jeszcze rozwiązania (i nie sądzę, że jest podany poniżej), ale odkryłem przyczynę: wywołanie zwrotne 'ScaleDetectorListener.onScaleEnd' w' WebView' (i później 'ZoomManager 'helper class) powoduje, że' setNewZoomScale' (dla 'wersji WebKit') lub' setZoomScale' (dla wersji 'ZoomManager') jest wywoływane ze skalą' mActualScale', a metody te będą wyzwalać tylko 'onScaleChanged', gdy dostarczone zostaną skala nie jest równa 'mActualScale' (jest jeszcze jedno wymaganie'! mPreviewZoomOnly', ale ta jest spełniona, ponieważ 'onScaleEnd' ustawia ją na 'false'). – JAB

Odpowiedz

1

try:

public MyWebView(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    // TODO Auto-generated constructor stub 
    setWebViewClient(new WebViewClient() { 
     @Override 
     public void onScaleChanged(WebView view, float oldScale, float newScale) { 
      super.onScaleChanged(view, oldScale, newScale); 
      currentScale = newScale; 
     } 
    }); 
} 
+3

jak to się różni od kodu podanego powyżej? – abovesun

+2

parametry konstruktora: MyWebView (Kontekst kontekstowy, Atrybs AttributeSet) –

3

Zajmuję na poziomie API 17 i skończyło się przy użyciu przestarzałej metody getScale() dla tego samego powodu. WebViewClient.onScaleChanged() po prostu nie został wywołany, gdy zmieniłem skalę za pomocą zoomu szczypta w WebView. Mam niestandardowy GestureListener w mojej rozszerzonej WebView, która zachowuje się inaczej, gdy widok jest powiększony (skala 1.0+). Nie mogłem niezawodnie uzyskać prawidłowej wartości skali, gdy ustawiam zmienną klasy w onScaleChanged().