3

我对 WebView 和 SVG 有疑问。当我将 svg(使用 javascript)加载到 WebView 中时,它会随机缩放。在不同设备上绝对随机,在一台设备上具有不同的屏幕方向。我需要将 SVG 放置在 WebView 中,并使用 fot 到 WebView 大小,放空并启用缩放。A试过这个html:

<html xmlns="http://www.w3.org/1999/xhtml">
<body>
<object type="image/svg+xml" data="AutomobileMain.svg" width="100%" height="100%" align="middle">
    <param name="src" value="AutomobileMain.svg" />
    <param name="wmode" value="transparent" />
</object>
</body>
</html>

它在浏览器中正常工作,但在 WebView 中不起作用。

这里有一个代码:

public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    mSchemeImageWebView = (WebView) inflater.inflate(
            R.layout.newremark_image, container, false);

    WebSettings webSettings = mSchemeImageWebView.getSettings();
    webSettings.setJavaScriptEnabled(true);
    webSettings.setBuiltInZoomControls(true);
    webSettings.setSupportZoom(true);

    webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE);
    webSettings.setAppCacheEnabled(false);

    mSchemeImageWebView.addJavascriptInterface(new IJavascriptHandler(),
            "android");

    mSchemeImageWebView.setWebViewClient(new WebViewClient() {
        @Override
        public void onPageFinished(WebView view, String url) {
            super.onPageFinished(view, url);
            prepareResizedToFit(mSchemeImageWebView);
        }

    });

    reloadWebView() ;

    return mSchemeImageWebView;
}

public void reloadWebView() {
    mSchemeImageWebView.loadUrl(getSchemePath()) ;
}

private void prepareResizedToFit(WebView webView) {
    webView.setInitialScale(scale(mSchemeImageWebView));
}

private int scale(View view) {
    int height = Math.round(view.getHeight()) ;
    int width = Math.round(view.getWidth()) ;
    Dimension parsedDimension ;
    try {
        parsedDimension = new SVGDimensionsParser().parse(getResources()
                .getAssets().open(getSchemeFileName())) ;
        double scaleXtoMax = width / parsedDimension.width ;
        double scaleYtoMax = height / parsedDimension.height ;
        double scale = Math.min( scaleXtoMax , scaleYtoMax ) ;
        return (int) ( scale * 100.0 ) ;
    } catch (Exception e) {
        return 100;
    }
}

private static class SVGDimensionsParser {
    public Dimension parse(InputStream in) throws XmlPullParserException,
            IOException {
        try {
            XmlPullParser parser = Xml.newPullParser();
            parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES,
                    false);
            parser.setInput(in, null);
            parser.nextTag();
            return readFeed(parser);
        } finally {
            in.close();
        }
    }

    private Dimension readFeed(XmlPullParser parser)
            throws XmlPullParserException, IOException {
        if (parser.getName().equals("svg")) {
            return new Dimension(
                    Double.parseDouble(parser.getAttributeValue(null,
                            "height").replaceAll("px", "")),
                    Double.parseDouble(parser.getAttributeValue(null,
                            "width").replaceAll("px", "")));
        } else {
            return null;
        }
    }
}
4

1 回答 1

0

您可能会看到因设备而异的设备像素比的影响。

尝试将以下内容添加到 HTML 文件的标题中。

<meta name="viewport" content="width=device-width, initial-scale=1">

如果这不起作用,则可能是您的 SVG 文件的编写方式存在问题。SVG 在窗口中的定位方式会受到根<svg>元素的各种属性的影响。特别是 viewBox、width、height 和 preserveAspectRatio 属性。

尝试修补它们。有关它们如何工作的更多信息,请参阅 SVG 规范。

http://www.w3.org/TR/SVG/struct.html#SVGElement

于 2013-05-20T20:53:52.860 回答