启用/禁用放大Android WebView

WebSettings中有一些与缩放相关的方法:

  • WebSettings.setSupportZoom
  • WebSettings.setBuiltInZoomControls

我注意到他们在某些设备上的工作方式不同 例如,在我的Galaxy S捏缩放是默认启用,但在LG P500它被禁用(现在我不知道如何启用只捏缩放,但隐藏缩放button)。

在P500上,当我调用setBuiltInZoomControls(true)我得到了这两个变体的工作(多点触摸和button)。

如何启用多点触控缩放和禁用设备上的缩放button,如LG P500? (另外,我知道在HTC设备上也有同样的问题)

更新:这里几乎是解决scheme的完整代码

  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; } } 

此代码位于WebView的onTouchEvent重写方法中。

Solutions Collecting From Web of "启用/禁用放大Android WebView"

我已经查看了WebView的源代码,并得出结论说,没有一种方法可以完成你所要求的。

我最终做的是OnTouchEvent WebView并重写OnTouchEvent 。 在OnTouchEvent for ACTION_DOWN ,我检查有多less指针正在使用MotionEvent.getPointerCount() 。 如果有多个指针,则调用setSupportZoom(true) ,否则我调用setSupportZoom(false) 。 然后我调用super.OnTouchEvent().

这将有效地禁用滚动时缩放(从而禁用缩放控件),并启用缩放时,用户即将捏缩放。 这并不是一个好的方法,但迄今为止,它对我来说效果很好。

请注意, getPointerCount()是在2.1中引入的,所以如果你支持1.6,你将不得不做一些额外的事情。

在API> = 11上,您可以使用:

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

根据SDK:

 public void setDisplayZoomControls (boolean enabled) 

因为:API级别11

设置是否使用屏幕缩放button。 启用内置缩放控件和禁用屏幕缩放控件的组合允许缩放缩放以在没有屏幕控件的情况下工作

我们在为客户开发一个Android应用程序时遇到了同样的问题,并且设法绕过这个限制。

我看了一下WebView类的Android源代码,发现了一个updateZoomButtonsEnabled()方法 ,它使用了ZoomButtonsController来启用和禁用缩放控件,具体取决于浏览器的当前比例。

我search了一个返回ZoomButtonsController -instance的方法,并find了getZoomButtonsController()方法 ,它返回了这个实例。

尽pipe该方法是public ,但是它并没有logging在WebView -documentation中,Eclipse也找不到它。 所以,我尝试了一些反思,并创build了自己的WebView -subclass来覆盖触发控件的onTouchEvent()方法。

 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; } } 

您可能需要删除不必要的构造函数,并可能对exception做出反应。

虽然这看起来很不可靠,但它可以回溯到API Level 4(Android 1.6)。


正如@jayellos在评论中指出的,私人getZoomButtonsController() – 方法在Android 4.0.4及更高版本中不再存在。

但是,它不需要。 使用条件执行 ,我们可以检查我们是否在具有API Level 11+的设备上,并使用公开的function(请参阅@Yuttadhammo答案)来隐藏控件。

我更新了上面的示例代码来做到这一点。

我修改了Lukas Knuth的解决办法:

1)没有必要inheritancewebview,

2)在某些Android 1.6设备的字节码validation过程中,代码将会崩溃,如果您不在独立的类中放置不可用的方法

3)如果用户向上/向下滚动页面,缩放控件仍然会出现。 我只需将缩放控制器容器设置为可见性即可

  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); } 

卢卡斯Knuth有很好的解决scheme,但在三星Galaxy SII上的Android 4.0.4我仍然看变焦控制。 我通过解决它

 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); } 

代替

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

您所发布的解决scheme似乎可以在用户拖动时停止显示缩放控件,但是在某些情况下,用户将会缩放缩放并显示缩放控件。 我注意到有两种方法可以让webview接受缩放,而且只有其中一个方法会导致缩放控制出现,尽pipe你的代码:

用户捏缩放和控制出现:

 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 

用户捏放大和控制不会出现:

 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 

你能解释一下你的解决scheme吗?

改进的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; } } 

嘿有任何人可能正在寻找这样的解决scheme..我曾经在WebView中扩展的问题,所以最好的办法是在你的java.class你设置所有的webView放在这两行代码:(webViewSearch是我的webView – > webViewSearch =(WebView)findViewById(R.id.id_webview_search);)

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