WebSettings中有一些与缩放相关的方法:
我注意到它们在某些设备上的工作方式不同。例如,在我的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
重写方法中。
发布于 2011-03-18 07:53:51
我已经看过WebView
的源代码,我得出的结论是,没有优雅的方法来完成您所要求的东西。
我最终做的是对WebView
进行子类化并覆盖OnTouchEvent
。在ACTION_DOWN
的OnTouchEvent
中,我使用MotionEvent.getPointerCount()
检查有多少指针。如果有多个指针,我调用setSupportZoom(true)
,否则调用setSupportZoom(false)
。然后,我调用super.OnTouchEvent().
这将有效地禁用滚动时的缩放(从而禁用缩放控件),并在用户将要收缩缩放时启用缩放。这不是一种很好的方式,但到目前为止,它对我来说效果很好。
请注意,getPointerCount()
是在2.1中引入的,因此如果您支持1.6,您将不得不做一些额外的工作。
发布于 2011-10-26 21:27:15
在API >= 11上,您可以使用:
wv.getSettings().setBuiltInZoomControls(true);
wv.getSettings().setDisplayZoomControls(false);
根据SDK:
public void setDisplayZoomControls (boolean enabled)
自: API级别11
设置是否使用屏幕上的缩放按钮。启用内置缩放控件和禁用屏幕缩放控件的组合允许在没有屏幕控件的情况下进行缩放
发布于 2012-08-10 20:45:18
我们在为客户开发Android应用程序时遇到了同样的问题,我设法绕过了这个限制。
我看了看WebView类的Android源代码,发现了一个updateZoomButtonsEnabled()
-method,它与ZoomButtonsController
-object一起工作,根据浏览器的当前比例启用和禁用缩放控件。
我搜索了返回ZoomButtonsController
-instance的方法,找到了返回此实例的getZoomButtonsController()
-method。
尽管该方法被声明为public
,但它没有记录在WebView
-documentation中,Eclipse也找不到它。因此,我尝试了一些思考,并创建了我自己的WebView
-subclass来覆盖触发控件的onTouchEvent()
-method。
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;
}
}
您可能希望删除不必要的构造函数,并可能对异常做出反应。
尽管这看起来既老套又不可靠,但它可以回到级别4(Android1.6)。
正如@jayellos在评论中指出的那样,私有的getZoomButtonsController()
-method在Android 4.0.4和更高版本上不再存在。
然而,它不需要这样做。使用conditional execution,我们可以检查我们是否在具有API级别答案的设备上,并使用公开的功能(请参阅@Yuttadhammo 11+ )来隐藏控件。
我更新了上面的示例代码来实现这一点。
https://stackoverflow.com/questions/5125851
复制相似问题