android webview 显示灰度网页

2023-11-01

要在WebView中显示网页灰度显示,您可以通过以下步骤操作:
使用的原理两种方式,一种使用画笔,一种是js css注入。都能够实现黑白色灰度网页。

在您的布局文件中添加WebView组件:

<WebView
    android:id="@+id/webview"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

在您的Activity或Fragment中,初始化WebView并启用硬件加速:

WebView webView = findViewById(R.id.webview);
webView.setLayerType(View.LAYER_TYPE_HARDWARE, null);

创建applyGrayscaleFilter()方法,该方法将会应用灰度滤镜到WebView的内容:


@SuppressWarnings({"deprecation", "AccessStaticViaInstance"})
    private void applyGrayscaleFilter(WebView webView) {
        // 创建WebSettings实例
        WebSettings webSettings = webView.getSettings();

        // 启用插件
        webSettings.setPluginState(WebSettings.PluginState.ON);

        // 根据系统版本选择不同的滤镜方法
        ColorMatrix colorMatrix = new ColorMatrix();
        colorMatrix.setSaturation(0);// 0为黑白色
        ColorMatrixColorFilter filter = new ColorMatrixColorFilter(colorMatrix);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
            // Android 10及以上版本
            webView.setWebContentsDebuggingEnabled(true);
            webView.setLayerType(View.LAYER_TYPE_HARDWARE, null);
            webView.setRendererPriorityPolicy(RENDERER_PRIORITY_BOUND, true);
            // 两种方法都可以
            //nativeHandleGrey(view, filter);
            webView.loadUrl("javascript:" + jsHandleGrey());
        } else {
            // 低于Android 10版本
            webView.setDrawingCacheEnabled(true);
            webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
            webView.setBackgroundColor(Color.TRANSPARENT);
            Paint paint = new Paint();
            paint.setColorFilter(filter);
            webView.setLayerPaint(paint);
        }
    }

    private String jsHandleGrey() {
        return "var style_special = document.createElement('style');\n" +
                "var css_special = `* {\n" +
                "            filter: grayscale(100%) !important;\n" +
                "            -webkit-filter: grayscale(100%) !important;\n" +
                "        }`;\n" +
                "style_special.appendChild(document.createTextNode(css_special));\n" +
                "document.head.appendChild(style_special);";
    }

    private void nativeHandleGrey(WebView view, ColorMatrixColorFilter filter) {
        Bitmap webViewBitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(), Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(webViewBitmap);
        view.draw(canvas);

        Paint paint = new Paint();
        paint.setColorFilter(filter);

        canvas.drawBitmap(webViewBitmap, 0, 0, paint);
        if (webViewBitmap != null)
            webViewBitmap.recycle();
    }

最后,在WebView加载网页之前,调用applyGrayscaleFilter()方法以应用灰度滤镜效果:

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

webView.loadUrl("https://www.example.com");

这样就可以在WebView中显示灰度网页了。根据系统版本的不同,使用了不同的滤镜方法来实现灰度效果。请注意,这种方法可能会影响WebView的性能和渲染速度,因此请确保在使用之前进行足够的测试。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

android webview 显示灰度网页 的相关文章

  • 没有这样的属性:类的 useLibrary

    我的项目在Android Studio上使用ndk 所以 build gradle如下 dependencies classpath com android tools build gradle experimental 0 4 0 app
  • 使用 Cordova 加载应用程序时如何配置状态栏颜色?

    我用 Cordova 创建了一个应用程序 我想改进 UI UX 使其看起来尽可能像本机应用程序 当应用程序第一次加载时 状态栏 和背景 的前几毫秒 实际上不到 1 秒 没有我配置的颜色Cordova 状态栏插件 https cordova
  • 如何在android中将时间转换为“时间之前”

    我的服务器 返回时间 2016 01 24T16 00 00 000Z I want 1 转换为字符串 2 我希望它在从服务器加载时显示 不久前 请 帮我 我认为主要有三种方式 a 内置选项使用SimpleDateFormat and 日期
  • 使用kivy/python访问android手电筒(相机LED闪光灯)

    我不知道如何使用 python 或 kivy 访问 android 上的 led 灯 我尝试安装 python for android 以便能够将 android 模块导入到我的代码中 但不是找不到模块 我按照此处的说明克隆了 python
  • android 弹出菜单文本颜色(AppCompat)

    我需要更改 popuo 菜单的文本颜色 但我找不到任何方法来执行此操作 我可以更改 popomenu 的背景但不能更改文本 我以这种方式编辑 style xml
  • android 4 中的 android RadioButton 问题

    我有一个简单的应用程序 屏幕是在相对布局内构建的 我还有 LinearLayout s 其中之一显示 2 个 RadioButton s 如下所示
  • 我想了解 NfcV ISO-15639 的操作

    我是 NFC 技术新手 我很难理解如何操作块 byte cmd new byte byte 0x20 FLAG byte 0x21 WRITE SINGLE BLOCK COMMAND byte 0x00 byte 0x00 byte 0x
  • 使用应用程序上下文滑动图像加载

    我在我的 Android 应用程序中使用 glide 进行图像加载 为了避免任何崩溃 我正在使用应用程序上下文加载图像 这对应用程序和内存的性能有何影响 这对应用程序和内存的性能有何影响 Glide提供了这么多 with 方法是有原因的 它
  • 调用了 BroadcastReceiver 但未调用 PhoneStateListener

    在调试下面的代码时 BroadcastReceiverCustom 正在被 已调用 但 PhoneStateListenerCustom 未调用 现在我只在 BroadcastReceiverCustom 中执行所需的操作 但可能不是最好的
  • 在主线程中处理某些代码时如何显示进度对话框(在单独的线程中?)

    我需要执行以下操作 当应用程序启动时 它会运行一项活动 splashActivity 该活动尝试创建一个 DBHelper SQLiteDatabase 实例 该实例在创建时检查数据库是否存在 如果不存在则创建一个 在此数据库创建过程中 我
  • 华为移动服务的 Android 虚拟设备

    我想将HMS应用到我的应用程序中 然而 购买真正的华为手机并不在我的候选清单上 华为是否为此目的提供 Android 虚拟设备 如果没有 如何测试我的 HMS 实现是否真正有效 是的 华为确实提供了一个 Android 虚拟设备 名为App
  • Recycler查看可见项目的数量

    我正在我的应用程序中创建一个水平 RecyclerView 它必须一次在屏幕上显示 2 个图像 因此每个图像的宽度必须为屏幕的 50 目前它工作正常 但每个项目都会占用屏幕的所有宽度 这是我的代码 mRecyclerView Recycle
  • Firebase 实时数据库 .info/connected 本应为 True 时为 False

    我有一个 Android 服务 它的调用地址为onCreate FirebaseDatabase database FirebaseDatabase getInstance database getReference info connec
  • VideoView中的seekTo

    我在寻找视频时遇到问题 我的应用程序应该从上次停止的位置恢复视频 所以我这样做 videoView seekTo bookmark videoView start 然而 当它播放时 我听到视频开头的声音大约 1 2 秒 只有在该视频寻找到正
  • 在包“android”中找不到属性“roundIcon”的资源标识符

    我正在尝试编译我的项目 但出现一些错误 Android 清单 xml
  • 无法在android中使用retrofit发出@Post请求

    我正在学习如何在 android 中使用改造 但是每当我尝试从互联网检索数据时 我的应用程序不会返回任何内容我的响应没有成功 我不知道如何修复当前我正在尝试发布的错误并使用此 URL 检索数据https jsonplaceholder ty
  • 如何在不打开浏览器的情况下查看 Android 应用程序中的网页?

    嘿 我正在开发一个 Android 应用程序 我想连接到该应用程序内的网络 不过 我在某种程度上尝试过 WebView 但它在我的目录中显示的文件很好 但当连接到 google com 时 它显示错误 然后我添加了这个文件
  • 启动 Activity 时自动弹出键盘

    我有一个相对简单的问题 我有一个包含很多 EditText 的活动 当我打开活动时 它会自动聚焦到第一个 EditText 并显示虚拟键盘 我怎样才能防止这种情况发生 在 XML 文件的布局标签中使用此属性 android focusabl
  • Android:如何实现“分布式控制”

    对于与 Android 开发者论坛的交叉发帖表示歉意 那里没有收到任何答复 我有一个有趣的设计挑战 我有一个前端 Activity 和一个后端 用本机 C C 编写 代码 后端是一个复杂的对象 它部分控制 应用程序流程一旦启动就在它自己的线
  • 在 Android 应用程序中启动应用程序时仅显示一次版本信息

    我想显示一个带有 确定 按钮的简单信息对话框 介绍此版本中的新增内容 但它应该仅在第一次启动时显示 实施这个的最好方法是什么 我会 并且已经 使用带有布尔值或 int 值的 SharedPreferences 只需检查最后一个版本是否比当前

随机推荐