Android 实现WebView点击图片查看大图列表及图片保存功能

yizhihongxing

Android 实现WebView点击图片查看大图列表及图片保存功能

简介

在WebView中点击图片可以实现图片查看、图片保存等功能是非常常见且实用的功能,本文将详细介绍如何在Android中实现WebView点击图片查看大图列表及图片保存功能。

WebView中显示图片

在Android中使用WebView加载网页时,如果网页中有图片,则图片默认是不会展示出来的,需要通过设置WebViewClient的方法来实现,代码如下所示:

webView.setWebViewClient(new WebViewClient() {
    // 通过重写shouldOverrideUrlLoading方法来自定义图片展示
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        if(url.endsWith(".jpg") || url.endsWith(".png") || url.endsWith(".jpeg")) {
            // 显示图片
            showImage(url);
            return true;
        }
        // 其他情况交给WebView处理
        view.loadUrl(url);
        return true;
    }
});

// 显示图片的方法
private void showImage(String url) {
    // 实现查看大图、保存图片等功能
    // ...
}

显示大图列表

在showImage方法中,我们可以通过自定义Dialog或PopupWindow等方式来显示大图列表,代码如下所示:

private void showImage(String url) {
    // 创建PopupWindow对象
    PopupWindow popupWindow = new PopupWindow(context);

    // 创建要显示的View
    View view = LayoutInflater.from(context).inflate(R.layout.popup_image_list, null);

    // 设置RecyclerView
    RecyclerView recyclerView = view.findViewById(R.id.recycler_view);
    LinearLayoutManager layoutManager = new LinearLayoutManager(context);
    layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
    recyclerView.setLayoutManager(layoutManager);
    ImageListAdapter adapter = new ImageListAdapter(imageUrls);
    recyclerView.setAdapter(adapter);

    // 设置PopupWindow参数
    popupWindow.setContentView(view);
    popupWindow.setWidth(ViewGroup.LayoutParams.MATCH_PARENT);
    popupWindow.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT);
    popupWindow.setOutsideTouchable(true);
    popupWindow.setFocusable(true);
    popupWindow.showAtLocation(webView, Gravity.BOTTOM, 0, 0);
}

其中,popup_image_list.xml布局文件可以自定义,这里使用一个RecyclerView来展示大图列表,代码如下所示:

<androidx.recyclerview.widget.RecyclerView
    android:id="@+id/recycler_view"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:overScrollMode="never"
    android:background="@android:color/transparent"/>

图片保存功能

在显示大图列表的PopupWindow中,我们可以为每一张图片添加一个保存图片的按钮,点击按钮即可实现图片保存功能,代码如下所示:

private void showImage(String url) {
    ...
    ImageListAdapter adapter = new ImageListAdapter(imageUrls);
    adapter.setOnItemClickListener(new OnItemClickListener() {
        @Override
        public void onItemClick(View view, int position) {
            // 保存图片
            saveImage(imageUrls.get(position));
        }
    });
    recyclerView.setAdapter(adapter);
    ...
}

// 保存图片的方法
private void saveImage(String url) {
    Glide.with(context)
        .asBitmap()
        .load(url)
        .into(new SimpleTarget<Bitmap>() {
            @Override
            public void onResourceReady(Bitmap resource, Transition<? super Bitmap> transition) {
                // 获取存储路径
                File targetFile = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM).getAbsolutePath()
                    + File.separator
                    + "图片保存文件夹"
                    + File.separator
                    + System.currentTimeMillis()
                    + ".jpg");

                try {
                    // 创建文件夹
                    File dir = targetFile.getParentFile();
                    if(!dir.exists()) {
                        dir.mkdirs();
                    }
                    // 保存图片到本地
                    FileOutputStream fos = new FileOutputStream(targetFile);
                    resource.compress(Bitmap.CompressFormat.JPEG, 90, fos);
                    fos.flush();
                    fos.close();
                    // 通知相册更新
                    MediaScannerConnection.scanFile(context,
                        new String[]{ targetFile.getAbsolutePath() },
                        null,
                        new MediaScannerConnection.OnScanCompletedListener() {
                            @Override
                            public void onScanCompleted(String path, Uri uri) {
                                Toast.makeText(context, "图片已保存至相册", Toast.LENGTH_SHORT).show();
                            }
                        });
                } catch (Exception e) {
                    e.printStackTrace();
                    Toast.makeText(context, "图片保存失败", Toast.LENGTH_SHORT).show();
                }
            }
        });
}

在saveImage方法中,使用Glide库加载图片并将其转换为Bitmap格式,然后将其保存到指定目录下,同时通过MediaScannerConnection通知相册更新。

示例

下面是两个示例:

  1. 在WebView中点击图片,显示大图列表及图片保存功能:
webView.loadUrl("http://www.example.com");

webView.setWebViewClient(new WebViewClient() {
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        if(url.endsWith(".jpg") || url.endsWith(".png") || url.endsWith(".jpeg")) {
            showImage(url);
            return true;
        }
        view.loadUrl(url);
        return true;
    }
});
  1. 在RecyclerView或ListView中点击图片,显示大图列表及图片保存功能:
// 在Adapter中为ImageView设置监听器,然后调用showImage方法
image.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        showImage(imageUrls);
    }
});

private void showImage(List<String> imageUrls) {
    // 创建PopupWindow对象
    PopupWindow popupWindow = new PopupWindow(context);

    // 创建要显示的View
    View view = LayoutInflater.from(context).inflate(R.layout.popup_image_list, null);

    // 设置RecyclerView
    RecyclerView recyclerView = view.findViewById(R.id.recycler_view);
    LinearLayoutManager layoutManager = new LinearLayoutManager(context);
    layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
    recyclerView.setLayoutManager(layoutManager);
    ImageListAdapter adapter = new ImageListAdapter(imageUrls);
    adapter.setOnItemClickListener(new OnItemClickListener() {
        @Override
        public void onItemClick(View view, int position) {
            saveImage(imageUrls.get(position));
        }
    });
    recyclerView.setAdapter(adapter);

    // 设置PopupWindow参数
    popupWindow.setContentView(view);
    popupWindow.setWidth(ViewGroup.LayoutParams.MATCH_PARENT);
    popupWindow.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT);
    popupWindow.setOutsideTouchable(true);
    popupWindow.setFocusable(true);
    popupWindow.showAtLocation(recyclerView, Gravity.BOTTOM, 0, 0);
}

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Android 实现WebView点击图片查看大图列表及图片保存功能 - Python技术站

(0)
上一篇 2023年6月11日
下一篇 2023年6月11日

相关文章

  • JavaScript ES 模块的使用

    当我们在编写 JavaScript 代码时,常常会遇到文件依赖管理、代码模块化等问题。在过去,我们需要使用模块加载器(Module Loader)来实现对 JavaScript 模块进行加载和管理,比如 RequireJS、SystemJS 等等。但是在 ES6 规范中,JavaScript 原生支持模块,我们可以使用 import 和 export 关键字…

    JavaScript 2023年5月27日
    00
  • PHP和javascript常用正则表达式及用法实例

    PHP和JavaScript常用正则表达式及用法实例 什么是正则表达式 正则表达式是一种用来检索、替换和匹配文本的工具,它是基于字符模式匹配的。 正则表达式由字面值和特殊字符组成。字面值是指直接匹配的字符或字符串,特殊字符是包括“元字符”、“限定符”、“界定符”等一系列元素,用于构建灵活的模式。 PHP中的正则表达式 在PHP中,使用preg_match()…

    JavaScript 2023年6月10日
    00
  • 在JavaScript中操作数组之map()方法的使用

    当我们需要在JavaScript中操作数组时,map()方法是一种非常方便的选择。map()方法可以对数组中的每个元素进行操作,并返回一个新的数组,该新数组中包含了处理结果。下面是使用该方法的详细攻略: 基本语法 map()方法的基本语法如下: array.map(function(currentValue, index, arr), thisValue) …

    JavaScript 2023年5月27日
    00
  • Js参数值中含有单引号或双引号问题的解决方法

    Js参数值中含有单引号或双引号问题的解决方法可以通过转义字符进行转义。以下是详细的攻略: 方法一:使用转义字符 在引号前加上反斜杠(\)作为转义字符即可解决问题。如果参数值中含有单引号,则用反斜杠转义单引号(\’),如果参数值中含有双引号,则用反斜杠转义双引号(\”)。 例如: let name1 = "Tom’s cat"; // 包含…

    JavaScript 2023年6月11日
    00
  • JavaScript函数的使用教程

    JavaScript函数的使用教程 JavaScript函数是一个独立的可重复使用的代码块,用于执行特定的任务或计算。函数可以接收输入参数和返回计算结果,非常有用。在这份教程中,我们将介绍JavaScript函数的使用和定义。 定义和使用函数 函数的定义使用function关键字,后面跟着函数名。函数可以包含一系列的语句和计算逻辑。下面是一个简单的计算乘积的…

    JavaScript 2023年5月18日
    00
  • 浅谈javascript如何获取文件后缀名

    下面是“浅谈JavaScript如何获取文件后缀名”的完整攻略: 1.什么是文件后缀名 文件后缀名是指在文件名的最后一个句点(.)后面的几个字符,用来表示该文件的类型。比如说,图片文件的后缀名通常是“jpg”或“png”,文本文件的后缀名通常是“txt”或“md”,等等。 2.如何获取文件后缀名 在JavaScript中,可以通过字符串的方法来获取文件后缀名…

    JavaScript 2023年5月27日
    00
  • 微信小程序实现页面导航与传参功能详解

    下面我会详细讲解“微信小程序实现页面导航与传参功能”的完整攻略。本文过程中会包含两条示例说明。 实现页面导航 在微信小程序中,页面导航可以通过wx.navigateTo和wx.redirectTo两个API实现。 wx.navigateTo wx.navigateTo会创建一个新页面并进行导航。 wx.navigateTo({ url: ‘pages/det…

    JavaScript 2023年6月11日
    00
  • js中数组结合字符串实现查找(屏蔽广告判断url等)

    JS中数组和字符串结合可以方便地实现字符串的查找和筛选,常见的应用包括屏蔽广告,判断URL等。下面我们来详细讲解如何实现这些功能。 1. 屏蔽广告 1.1 实现思路 在网页中屏蔽广告的过程中,我们通常需要先获取到网页中所有的链接,并判断这些链接是否属于广告链接。判断广告链接的方法可以是比对链接的地址、名称等。这个过程可以使用正则表达式和数组的方式来实现。 1…

    JavaScript 2023年5月28日
    00
合作推广
合作推广
分享本页
返回顶部