Android WebView加载网页,图片等元素宽度大小不兼容手机屏幕的宽度

简介: 无论是Android手机还是iOS手机,使用WebView加载一些没有专门为手机屏幕做适配的网页的时候,就会出现网页中的图片等标签元素的宽度大小和手机屏幕的宽度不一致的情况,如下图之所以会出现上面的情况,是因为网页中的...

无论是Android手机还是iOS手机,使用WebView加载一些没有专门为手机屏幕做适配的网页的时候,就会出现网页中的图片等标签元素的宽度大小和手机屏幕的宽度不一致的情况,如下图


之所以会出现上面的情况,是因为网页中的dom元素大小没有适配到移动网页中,有些元素是把宽度固定死的

解决办法有很多:

  1. 前端人员将网页适配到移动端(优点:最为规范的做法    缺点:一些不再维护的项目,是没有前端人员来适配)
  2. 移动端开发人员自己通过JS的注入来修改(优点:在缺乏前端人员的支持下,可以勉强这样做     缺点:元素变化的话,Native需要修改各种JS函数)

现在重点就说下第二种方法:

     首先在Android和iOS这两个平台,WebView可以和Native进行交互的,在Native中编写JS函数注入到html中,也可以在网页调用Native的函数。

     这里我就简单讲一下通过JS注入到html中,来改变相应元素的大小,以及字体等,Android和iOS都有WebView,都可以监听监听网页的加载的过程,在Android中通过WebViewClient来监听网页的加载过程,一般我们需要在网页所有资源加载完成后,也就是onPageFinish的方法中,注入JS,废话不多说,直接看代码:

package com.example.webviewdemo;

import android.content.Context;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.WindowManager;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;

public class MainActivity extends AppCompatActivity {
    private static final String TAG = "WebView";

    private WebView webView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        webView = findViewById(R.id.webView);
        initWebSettings();

        webView.loadUrl("http://www.ah12377.cn/newsDetail/151");

        //监听WebView是否加载完成网页
        webView.setWebViewClient(new WebViewClient(){
            @Override
            public void onPageFinished(WebView view, String url) {
                super.onPageFinished(view, url);
                Log.d(TAG,"onPageFinished");
                loadJS();
            }
        });


    }

    private void loadJS(){
        webView.loadUrl("javascript:(function(){"
                //将DIV元素中的外边距和内边距设置为零,防止网页左右有空隙
                + " var divs = document.getElementsByTagName(\"div\");"
                + " for(var j=0;j<divs.length;j++){"
                + "   divs[j].style.margin=\"0px\";"
                + "   divs[j].style.padding=\"0px\";"
                + "   divs[j].style.width=document.body.clientWidth-10;"
                + " }"

                + " var imgs = document.getElementsByTagName(\"img\"); "
                + "   for(var i=0;i<imgs.length;i++)  "
                + "       {"
                       //过滤掉GIF图片,防止过度放大后,GIF失真
                + "    var vkeyWords=/.gif$/;"
                + "        if(!vkeyWords.test(imgs[i].src)){"
                + "         var hRatio="+getScreenWidthPX()+"/objs[i].width;"
                + "         objs[i].height= objs[i].height*hRatio;"//通过缩放比例来设置图片的高度
                + "         objs[i].width="+getScreenWidthPX()+";"//设置图片的宽度
                + "        }"
                +    "}"
                +   "})()");
    }



    /**
     * WebView Setting
     */
    private void initWebSettings(){
        WebSettings webSettings = webView.getSettings();
        webSettings.setJavaScriptEnabled(true);
//        webSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN);

    }

    /**
     * 获取屏幕的宽度(单位:像素PX)
     * @return
     */
    private int getScreenWidthPX(){
        WindowManager wm = (WindowManager) this.getSystemService(Context.WINDOW_SERVICE);
        DisplayMetrics dm = new DisplayMetrics();
        if (wm != null && wm.getDefaultDisplay() != null){
           wm.getDefaultDisplay().getMetrics(dm);
           return px2dip(dm.widthPixels);
        }else {
            return 0;
        }
    }

    /**
     * 像素转DP
     * @param pxValue
     * @return
     */
    public  int px2dip(float pxValue) {
        float scale = this.getResources().getDisplayMetrics().density;
        return (int) (pxValue / scale + 0.5f);
    }
}

代码非常简单,效果图如下,通过上面的代码可以知道,我们可以通过JS来修改html的任何元素,也可以去掉或者隐藏html中的元素等,当然也要懂点JS和html的开发,才能更好地下手,当然这个过程使用Chrome浏览器的调试面板也很重要

目录
相关文章
|
14天前
|
网络协议 Android开发 数据安全/隐私保护
Android手机上使用Socks5全局代理-教程+软件
Android手机上使用Socks5全局代理-教程+软件
153 2
|
1天前
|
开发工具 Android开发 开发者
Android `.9.png` 图像是用于UI的可拉伸格式,保持元素清晰度和比例
【6月更文挑战第26天】Android `.9.png` 图像是用于UI的可拉伸格式,保持元素清晰度和比例。通过边上的黑线定义拉伸区域,右下角黑点标识内容区域,适应文本或组件大小变化。常用于按钮、背景等,确保跨屏幕尺寸显示质量。Android SDK 提供`draw9patch.bat`工具来创建和编辑。**
15 6
|
27天前
|
缓存 Android开发 开发者
安卓系统优化:提升手机性能的秘诀
【5月更文挑战第31天】本文将探讨如何通过一系列简单的步骤和技巧,对安卓系统进行优化,以提升手机的性能。我们将从清理无用文件、管理后台应用、调整系统设置等方面入手,帮助你的安卓设备运行更加流畅。
|
1月前
|
Android开发
【苹果安卓通用】xlsx 和 vCard 文件转换器,txt转vCard文件格式,CSV转 vCard格式,如何批量号码导入手机通讯录,一篇文章说全
本文介绍了如何快速将批量号码导入手机通讯录,适用于企业客户管理、营销团队、活动组织、团队协作和新员工入职等场景。步骤包括:1) 下载软件,提供腾讯云盘和百度网盘链接;2) 打开软件,复制粘贴号码并进行加载预览和制作文件;3) 将制作好的文件通过QQ或微信发送至手机,然后按苹果、安卓或鸿蒙系统的指示导入。整个过程简便快捷,可在1分钟内完成。
|
1月前
|
Android开发
【通讯录教程】苹果安卓鸿蒙系统通用,如何大批量导入手机号码到手机的通讯录,下面教你方法,只需1分钟搞定几万个号码的导入手机电话本
该文介绍了一种快速批量导入手机通讯录的方法,适用于处理大量手机号的需求,如微商管理、客户资料整理等。在QQ同步助手开始收费后,提供了免费的替代方案。步骤包括:下载批量导入软件(链接提供腾讯云盘和百度网盘地址),清空通讯录(非必需),制作符合格式的通讯录文件,并按操作系统(苹果、安卓或鸿蒙)进行导入。整个过程只需1分钟,简便快捷。
|
13天前
|
前端开发 JavaScript Android开发
手机APP开发|基于安卓APP实现掌上党支部——党员app
手机APP开发|基于安卓APP实现掌上党支部——党员app
|
29天前
|
安全 Android开发 iOS开发
探索安卓与iOS手机操作系统的发展趋势与差异
在移动互联网时代,安卓和iOS手机操作系统一直处于激烈的竞争之中。本文将从技术角度出发,探讨两大操作系统的发展趋势、特点以及差异,并分析其对用户体验和开发者生态的影响,旨在为读者提供对移动操作系统发展方向的深入了解。
|
1月前
|
Android开发
安卓远离手机app
远离手机是专门为防止年轻人上瘾而打造的生活管理类的软件,适度用手机,保护眼睛,节约时间。
18 0
安卓远离手机app
|
1月前
|
存储 数据库 Android开发
Android实现手机内存存储功能
Android实现手机内存存储功能
35 2
|
1月前
|
网络协议 安全 Linux
如何使用Android手机通过JuiceSSH远程访问本地Linux服务器
如何使用Android手机通过JuiceSSH远程访问本地Linux服务器