webview加载超长图

前言:android开发要经常和图片打交道。关于如何缓存,如何加载网上有很多框架。但是当我加载640*6149的长图时,实现起来效果并不理想,我用的是fresco加载。由于OpenGL渲染系统限制,Android 无法绘制长或宽大于2048像素的图片。如果它超过了这个界限,Fresco会对它进行Resize。所以当加载那个长图时,有的手机可以加载,有的就不显示。如果我对图片压缩,图片能正常加载但是不清晰。水平捉急的我,选择用webview加载长图。

1.webview加载图片的优势

  • Android 本身难加载的长图,对它来说很EZ,而且很简单的就能支持缩放,不用自己添加手势监听。
settings.setBuiltInZoomControls(true); //选择内置缩放机制与单独缩放控件;
settings.setDisplayZoomControls(true); //是否显示缩放控件
settings.setSupportZoom(true);  //是否支持缩放
mWebView.setInitialScale(120); //第一次显示的缩放比例,例子是120%;

2.webview使用中的问题

图片居中显示,有4种方法:

第一种

WebSettings settings = webView.getSettings(); 
settings.setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN); 

LayoutAlgorithm是一个枚举用来控制页面的布局,有三个类型:

①NARROW_COLUMNS:可能的话使所有列的宽度不超过屏幕宽度

②NORMAL:正常显示不做任何渲染

③SINGLE_COLUMN:把所有内容放大webview等宽的一列中

第二种

     settings.setUseWideViewPort(true); 
        settings.setLoadWithOverviewMode(true); 

设置加载进来的页面自适应手机屏幕 ,第一个方法设置webview推荐使用的窗口,设置为true。第二个方法是设置webview加载的页面的模式,也设置为true。这方法可以让你的页面适应手机屏幕的分辨率,完整的显示在屏幕上,可以放大缩小。虽然webview填充了,但是图片并不一定能填充屏幕。

第三种

    int screenDensity = getResources().getDisplayMetrics().densityDpi ;
    WebSettings.ZoomDensity zoomDensity = WebSettings.ZoomDensity.MEDIUM ;
    switch (screenDensity){
        case DisplayMetrics.DENSITY_LOW :
            zoomDensity = WebSettings.ZoomDensity.CLOSE;
            break;
        case DisplayMetrics.DENSITY_MEDIUM:
            zoomDensity = WebSettings.ZoomDensity.MEDIUM;
            break;
        case DisplayMetrics.DENSITY_HIGH:
            zoomDensity = WebSettings.ZoomDensity.FAR;
            break ;

    }

根据屏幕像素适配,但是只适配了L、M、H,XH等往上的密度没适配。

第四种

这种适配图片效果是最好的,通过js修改图片宽度。一定要加上:

settings.setJavaScriptEnabled(true);

代码如下:

 class  WC extends WebViewClient {
    @Override
    public void onPageFinished(WebView view, String url) {
        super.onPageFinished(view, url);

        imgReset();
        if(mDialog !=null && mDialog.isShowing())
            mDialog.dismiss();


    }

    @Override
    public void onScaleChanged(WebView view, float oldScale, float newScale) {
        super.onScaleChanged(view, oldScale, newScale);
    }
}


/**
 * 循环遍历标签中的图片
 * js 语法
 */
private void imgReset() {
    mWebView.loadUrl("javascript:(function(){" +
            "var objs = document.getElementsByTagName('img'); " +
            "for(var i=0;i<objs.length;i++)  " +
            "{"
            + "var img = objs[i];   " +
            "    img.style.maxWidth = '100%';   " +
            "}" +
            "})()");
}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值