Android 网页自适应webView

Android 网页自适应webView

由于坑爹的项目需要,在TV盒子上启动支付的时候要显示一个订购网页,而这个网页是有省级公司外包给某为做的,不知道为什么他们做的界面没有做自适应的适配,所以我们这边接入的方法是用固定大小的webView的大小,来显示这个奇葩的界面。

原有的解决方案在各个盒子上适配都良好,webView的大小可以通过Density的scale来进行缩放。直到适配到华为EC6108V8D的盒子时,遇到了问题,他取到的scale的值和本身盒子实际展示的不一样,显示的界面会有问题,然后就开始研究题目里的内容,下面是在网上所查到的相关方法:

方法一:

WebSettings webSettings = mWebView.getSettings();

通过webSetting中的setLayoutAlgorithm(LayoutAlgorithm.*)方法来实现缩放

可以传进去的参数分为三个:

  • NARROW_COLUMNS:可能的话使所有列的宽度不超过屏幕宽度,【这个试了感觉没有变化,好像默认的就是通过这个来显示网页的】。
  • NORMAL:正常显示不做任何渲染【同上】。
  • SINGLE_COLUMN:把所有内容放大webview等宽的一列中【所适配的网页中的控件居中了,但是背景图片没有缩放,界面整体变形了,不建议采用】。

方法二:

通过webSetting中的自适应屏幕大小方法来实现。

webSettings.setUseWideViewPort(true);
webSettings.setLoadWithOverviewMode(true);
但是我所需要的是并不是充满全屏幕,而是填充原来的比例,这个方法是按照屏幕的比例进行缩放,会造成网页的比例的拉伸(如背景图片等)。

方法三:

直接设置webSetting中的缩放参数,网上查到的方案都是如下:

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 ;
}
webSettings.setDefaultZoom(zoomDensity);

根据设备的dpi来配置webView的缩放参数,不过setDefaultZoom这个函数已经被弃用的,现在不用通过webSetting来设置,是通过webView的setInitScale方法来调用,传的参数也和之前不一样了,是传入百分比参数,举个栗子,setInitScale(100)就是不变大小,传200就是放大两倍。

经过测试得到的结果和方法二相似,缩放会使原来网页变形。

 

结论

上面几个方法试了一上午,发现没有满足要求的,只能作罢,不过现在网页一般都是自适应的,应该不会遇到上面这种奇奇怪怪的需求?目前正在联系某为,看能不能把界面改了,实在不行就只能针对该设备进行特殊处理了,以上内容仅为存档,避免下次再遇到走弯路。

发表评论

电子邮件地址不会被公开。