在 Android WebView 中启用/禁用缩放
WebSettings 中有一些与缩放相关的方法:
- WebSettings.setSupportZoom
- WebSettings.setBuiltInZoomControls
我注意到它们在某些设备上的工作方式有所不同。 例如,在我的 Galaxy S 上,默认情况下启用捏合缩放,但在 LG P500 上它被禁用(现在我不知道如何启用“仅捏合缩放”,但隐藏缩放按钮)。
在 P500 上,当我调用 setBuiltInZoomControls(true)
时,这两种变体都可以工作(多点触控和按钮)。
如何在 LG P500 等设备上启用多点触控缩放并禁用缩放按钮? (另外,我知道 HTC 设备上也存在同样的问题)
更新:这里是解决方案的几乎完整代码
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
重写方法中。
There are some methods in WebSettings related to zoom:
- WebSettings.setSupportZoom
- WebSettings.setBuiltInZoomControls
I noticed they work differently on some devices.
For example, on my Galaxy S pinch to zoom is enabled by default, but on LG P500 it is disabled (And now I don't know how to enable ONLY pinch to zoom, but hide zooming buttons).
On P500 when I call setBuiltInZoomControls(true)
I get both these variants working (multitouch and buttons).
How to enable multitouch zoom and disable zooming buttons on devices such an LG P500? (Also, I know the same problems are on HTC devices)
UPDATE: Here is almost full code for the 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;
}
}
This code is in my onTouchEvent
overridden method of the WebView.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(8)
在 API >= 11 上,您可以使用:
根据 SDK:
On API >= 11, you can use:
As per the SDK:
我查看了
WebView
的源代码,得出的结论是没有优雅的方法来完成您所要求的任务。我最终所做的是子类化
WebView
并重写OnTouchEvent
。在
ACTION_DOWN
的OnTouchEvent
中,我使用MotionEvent.getPointerCount()
检查有多少个指针。如果有多个指针,我会调用
setSupportZoom(true)
,否则我会调用setSupportZoom(false)
。然后,我调用 super.OnTouchEvent()。这将有效地在滚动时禁用缩放(从而禁用缩放控件),并在用户即将捏缩放时启用缩放。这不是一个很好的方法,但到目前为止对我来说效果很好。
请注意,
getPointerCount()
是在 2.1 中引入的,因此如果您支持 1.6,则必须执行一些额外的操作。I've looked at the source code for
WebView
and I concluded that there is no elegant way to accomplish what you are asking.What I ended up doing was subclassing
WebView
and overridingOnTouchEvent
.In
OnTouchEvent
forACTION_DOWN
, I check how many pointers there are usingMotionEvent.getPointerCount()
.If there is more than one pointer, I call
setSupportZoom(true)
, otherwise I callsetSupportZoom(false)
. I then call thesuper.OnTouchEvent().
This will effectively disable zooming when scrolling (thus disabling the zoom controls) and enable zooming when the user is about to pinch zoom. Not a nice way of doing it, but it has worked well for me so far.
Note that
getPointerCount()
was introduced in 2.1 so you'll have to do some extra stuff if you support 1.6.我们在为客户开发 Android 应用程序时遇到了同样的问题,我设法“破解”了这个限制。
我查看了 WebView 类的 Android 源代码,发现了
updateZoomButtonsEnabled()
-method 正在使用ZoomButtonsController
-object 用于启用和禁用缩放控件,具体取决于浏览器的当前比例。我搜索了返回
ZoomButtonsController
实例的方法,并找到了getZoomButtonsController()
-method,返回了这个非常实例。尽管该方法被声明为 public,但它没有记录在 WebView 文档中,Eclipse 也找不到它。因此,我尝试对此进行一些反思,并创建了自己的
WebView
子类来重写触发控件的onTouchEvent()
方法。您可能想要删除不必要的构造函数并可能对异常做出反应。
虽然这看起来很老套且不可靠,但它可以返回到 API 级别 4 (Android 1.6)。
正如 @jayellos 在评论中指出的那样,私有
getZoomButtonsController()
-Android 4.0.4 及更高版本中不再存在该方法。然而,它并不需要这样做。使用条件执行,我们可以检查我们是否在设备上API 级别 11+ 并使用公开的功能(请参阅 @Yuttadhammo 答案)来隐藏控件。
我更新了上面的示例代码来做到这一点。
We had the same problem while working on an Android application for a customer and I managed to "hack" around this restriction.
I took a look at the Android Source code for the WebView class and spotted a
updateZoomButtonsEnabled()
-method which was working with anZoomButtonsController
-object to enable and disable the zoom controls depending on the current scale of the browser.I searched for a method to return the
ZoomButtonsController
-instance and found thegetZoomButtonsController()
-method, that returned this very instance.Although the method is declared
public
, it is not documented in theWebView
-documentation and Eclipse couldn't find it either. So, I tried some reflection on that and created my ownWebView
-subclass to override theonTouchEvent()
-method, which triggered the controls.You might want to remove the unnecessary constructors and react on probably on the exceptions.
Although this looks hacky and unreliable, it works back to API Level 4 (Android 1.6).
As @jayellos pointed out in the comments, the private
getZoomButtonsController()
-method is no longer existing on Android 4.0.4 and later.However, it doesn't need to. Using conditional execution, we can check if we're on a device with API Level 11+ and use the exposed functionality (see @Yuttadhammo answer) to hide the controls.
I updated the example code above to do exactly that.
我对 Lukas Knuth 的解决方案进行了一些修改:
1)无需对 webview 进行子类化,
2)如果您不将不存在的方法放入单独的类中,则在某些 Android 1.6 设备上的字节码验证期间代码将崩溃
3)缩放控件仍然会出现如果用户向上/向下滚动页面。我只是将缩放控制器容器设置为可见性消失
Ive modifiet Lukas Knuth's solution a little:
1) There's no need to subclass the webview,
2) the code will crash during bytecode verification on some Android 1.6 devices if you don't put nonexistant methods in seperate classes
3) Zoom controls will still appear if the user scrolls up/down a page. I simply set the zoom controller container to visibility GONE
Lukas Knuth 有很好的解决方案,但在 Samsung Galaxy SII 上的 android 4.0.4 上我仍然关注缩放控件。我通过
而不是解决它
Lukas Knuth have good solution, but on android 4.0.4 on Samsung Galaxy SII I still look zoom controls. And I solve it via
instead of
您发布的解决方案似乎可以阻止用户拖动时出现缩放控件,但是在某些情况下,用户会捏缩放并且会出现缩放控件。我注意到,网络视图有两种方式接受捏缩放,并且只有其中一种会导致缩放控件出现,尽管您的代码:
用户捏缩放和控件出现:
用户捏缩放和控件不出现:
可以你对你的解决方案有更多的了解吗?
The solution you posted seems to work in stopping the zoom controls from appearing when the user drags, however there are situations where a user will pinch zoom and the zoom controls will appear. I've noticed that there are 2 ways that the webview will accept pinch zooming, and only one of them causes the zoom controls to appear despite your code:
User Pinch Zooms and controls appear:
User Pinch Zoom and Controls don't appear:
Can you shed more light on your solution?
改进了 Lukas Knuth 的版本:
Improved Lukas Knuth's version:
嘿,对于任何可能正在寻找这样的解决方案的人来说..我在 WebView 内部缩放时遇到了问题,所以最好的方法是在 java.class 中为 webView 设置所有内容,放入这两行代码:(webViewSearch 的名称我的 webView -->webViewSearch = (WebView) findViewById(R.id.id_webview_search);)
hey there for anyone who might be looking for solution like this.. i had issue with scaling inside WebView so best way to do is in your java.class where you set all for webView put this two line of code: (webViewSearch is name of my webView -->webViewSearch = (WebView) findViewById(R.id.id_webview_search);)