首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >启用/禁用Android WebView缩放

启用/禁用Android WebView缩放
EN

Stack Overflow用户
提问于 2011-02-26 16:23:47
回答 8查看 130.4K关注 0票数 66

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

  • WebSettings.setSupportZoom
  • WebSettings.setBuiltInZoomControls

我注意到它们在某些设备上的工作方式不同。例如,在我的Galaxy S上,默认情况下,缩放功能是启用的,但在LG P500上,它是禁用的(现在我不知道如何只启用缩放功能,而是隐藏缩放按钮)。

在P500上,当我调用setBuiltInZoomControls(true)时,我会让这两个变体都工作(多点触控和按钮)。

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

更新:下面是该解决方案的几乎完整的代码

代码语言:javascript
运行
复制
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重写方法中。

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2011-03-18 07:53:51

我已经看过WebView的源代码,我得出的结论是,没有优雅的方法来完成您所要求的东西。

我最终做的是对WebView进行子类化并覆盖OnTouchEvent。在ACTION_DOWNOnTouchEvent中,我使用MotionEvent.getPointerCount()检查有多少指针。如果有多个指针,我调用setSupportZoom(true),否则调用setSupportZoom(false)。然后,我调用super.OnTouchEvent().

这将有效地禁用滚动时的缩放(从而禁用缩放控件),并在用户将要收缩缩放时启用缩放。这不是一种很好的方式,但到目前为止,它对我来说效果很好。

请注意,getPointerCount()是在2.1中引入的,因此如果您支持1.6,您将不得不做一些额外的工作。

票数 37
EN

Stack Overflow用户

发布于 2011-10-26 21:27:15

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

代码语言:javascript
运行
复制
wv.getSettings().setBuiltInZoomControls(true);
wv.getSettings().setDisplayZoomControls(false);

根据SDK:

代码语言:javascript
运行
复制
public void setDisplayZoomControls (boolean enabled) 

自: API级别11

设置是否使用屏幕上的缩放按钮。启用内置缩放控件和禁用屏幕缩放控件的组合允许在没有屏幕控件的情况下进行缩放

票数 117
EN

Stack Overflow用户

发布于 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。

代码语言:javascript
运行
复制
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+ )来隐藏控件。

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

票数 29
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5125851

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档