activer/désactiver le zoom dans WebView Android
Il y a quelques méthodes de WebSettings liées à zoom:
- WebSettings.setSupportZoom
- WebSettings.setBuiltInZoomControls
J'ai remarqué qu'ils fonctionnent différemment sur certains appareils.
Par exemple, sur mon Galaxy S pincée de zoom est activé par défaut, mais sur LG P500 il est désactivé (Et maintenant, je ne sais pas comment faire pour activer SEULEMENT pincer pour zoomer, mais masquer les boutons de zoom).
Sur P500 quand je l'appelle setBuiltInZoomControls(true)
- je obtenir ces deux variantes de travail (multitouch et boutons).
Comment activer le zoom multitouch et désactiver les boutons de zoom sur des appareils tels qu'un LG P500? (Aussi, je connais le même problème sur les appareils HTC)
Mise à JOUR: Ici est presque complète du code pour la solution
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;
}
}
Ce code est dans mon onTouchEvent
méthode de remplacement de la WebView.
- J'ai eu le même problème.. quels sont les multiTouchZoom et la buttonsZoom variable?
- Je sais que c'est vieux, mais dans le cas où quelqu'un d'autre le trouve: Changement getPointerCount(ev) à ev.getPointerCount() et ça marche!
- Je ne suis pas sûr si quelqu'un a besoin de ce plus, mais jetez un oeil à mon "hack" autour de". Il fonctionne en arrière pour Android 1.6
- Quelles sont les multiTouchZoom et la buttonsZoom variable? Comment avez-vous eu des événements pour les boutons de zoom et multitouchZoom? si cela ne vous dérange pas, Pouvez-vous s'il vous plaît poster le code complet ici ?
Vous devez vous connecter pour publier un commentaire.
J'ai regardé le code source de
WebView
et j'en ai conclu qu'il n'existe pas de manière élégante pour accomplir ce que vous demandez.Ce que j'ai fait a été de sous-classement
WebView
et dominanteOnTouchEvent
.Dans
OnTouchEvent
pourACTION_DOWN
, j'ai vérifier le nombre de pointeurs il y a à l'aide deMotionEvent.getPointerCount()
.Si il n'y a plus d'un pointeur, j'appelle
setSupportZoom(true)
, sinon j'appellesetSupportZoom(false)
. Je téléphone alors à l'super.OnTouchEvent().
Cela aura pour effet de désactiver le zoom lors du défilement (ce qui désactive les commandes de zoom) et activer le zoom lorsque l'utilisateur est sur le point de zoom par pincement. Pas une belle manière de faire, mais il a bien fonctionné pour moi jusqu'à présent.
Noter que
getPointerCount()
a été introduit dans la version 2.1, de sorte que vous aurez à faire quelques trucs supplémentaires si vous 1,6.Sur l'API >= 11, vous pouvez utiliser:
Que par le SDK:
Nous avons eu le même problème en travaillant sur une application Android pour un client et j'ai réussi à "pirater" autour de cette restriction.
J'ai pris un coup d'oeil au code Source Android pour la WebView classe et a repéré un
updateZoomButtonsEnabled()
-méthode qui a été de travailler avec unZoomButtonsController
-objet pour activer et désactiver les contrôles de zoom en fonction de la taille actuelle de l'navigateur.J'ai cherché une méthode pour retourner
ZoomButtonsController
instance et a trouvé legetZoomButtonsController()
-méthode, qui a renvoyé cette très instance.Bien que la méthode est déclarée
public
, il n'est pas documentée dans leWebView
-de la documentation et de l'Éclipse ne pouvais pas le trouver. Donc, j'ai essayé un peu de réflexion sur cette question et de créer mon propreWebView
-sous-classe de remplacer leonTouchEvent()
-méthode, ce qui a déclenché les contrôles.Vous pouvez supprimer l'inutile constructeurs et réagir sur probablement sur les exceptions.
Bien que cela ressemble hacky et peu fiable, il œuvres de retour à l'API de Niveau 4 (Android 1.6).
Comme @jayellos souligné dans les commentaires, le privé
getZoomButtonsController()
-méthode n'est plus existant sur Android 4.0.4 et plus tard.Cependant, il n'est pas nécessaire. À l'aide de exécution conditionnelle, nous pouvons vérifier si nous sommes sur un appareil avec l'API de Niveau 11+ et utiliser les fonctionnalités exposées (voir @Yuttadhammo de réponse) pour masquer les commandes.
J'ai mis à jour l'exemple de code ci-dessus pour faire exactement cela.
WebSettings.setDisplayZoomControls(boolean)
méthode qui est disponible à partir de l'API de Niveau 11.this.getSettings().setBuiltInZoomControls(true);
à exécuter sur tous les WebViews, non seulement l'API 11 ou celles du haut. (cache toujours les commandes de zoom. J'ai également ajoutéthis.getSettings().setUseWideViewPort(true);
pour le double-tap zoomIve modifiet Lukas Knuth la solution un peu:
1) Il n'y a pas besoin de sous-classer la webview,
2) le code de crash lors de bytecode vérification sur certains appareils Android 1.6 si vous ne mettez pas présents méthodes de séparer les classes
3) les contrôles de Zoom apparaît toujours si l'utilisateur fait défiler vers le haut/vers le bas d'une page. J'ai simplement mis le zoom contrôleur de conteneur à la visibilité ALLÉ
Lukas Knuth ont une bonne solution, mais sur android 4.0.4 sur Samsung Galaxy SII je continue de regarder les contrôles de zoom. Et je le résoudre via
au lieu de
La solution que vous avez posté, semble à l'arrêt des commandes de zoom apparaissent lorsque l'utilisateur fait glisser, cependant il existe des situations où un utilisateur pincée de zoom et les contrôles de zoom apparaît. J'ai remarqué qu'il y a 2 façons de le webview acceptera pincée de zoom, et un seul d'entre eux provoque les contrôles de zoom apparaît, malgré votre code:
Utilisateur Pincée de Zoom et de commandes apparaissent:
Utilisateur Pincée de Zoom et de Contrôle n'apparaissent pas:
Pouvez-vous nous éclairer sur votre solution?
Amélioration de Lukas Knuth version:
hé là pour toute personne qui pourrait être à la recherche de solution comme ça.. j'ai eu des problème avec la mise à l'échelle à l'intérieur de WebView donc, la meilleure façon de le faire est à votre java.class lorsque vous définissez tous pour webView mettre ces deux ligne de code: (webViewSearch est le nom de mon webView -->webViewSearch = (WebView) findViewById(R. id.id_webview_search);)