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

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日

相关文章

  • 当json键为数字时的取值方法解析

    当JSON的键为数字时,我们可以使用以下三种方式来取值: 方式一:使用点号加双引号,将数字键转换成字符串来访问。 例如,在下面的JSON数据中,键名为数字1和2: { "1": "Apple", "2": "Banana" } 我们可以通过以下方式访问它们: – Apple可以这…

    JavaScript 2023年5月27日
    00
  • 谈谈我对JavaScript中typeof和instanceof的深入理解

    我将为你讲解“谈谈我对JavaScript中typeof和instanceof的深入理解”的完整攻略。首先我们要了解typeof和instanceof这两个操作符的意义和用法,然后结合示例进行说明。 typeof操作符 typeof是一个JavaScript内置的操作符,用于检测变量的数据类型。它返回一个字符串表示变量的数据类型。 语法 typeof 操作数…

    JavaScript 2023年6月10日
    00
  • flash与js通讯方法

    Flash与JS通讯是前端开发中经常遇到的问题,下面我来为大家详细讲解一下Flash与JS通讯方法的完整攻略。 Flash与JS通讯方法 Flash与JS之间的通讯一般通过两种方式,一种是Flash调用JS方法,另一种是JS调用Flash方法。下面分别详细讲解这两种方式。 Flash调用JS方法 Flash调用JS方法是通过ExternalInterface…

    JavaScript 2023年6月11日
    00
  • ES6 javascript中class静态方法、属性与实例属性用法示例

    ES6(ES2015)引入了Class(类)的概念,它是一种更加清晰、更加面向对象的编程方式。在使用Class的过程中,我们需要了解并掌握Class的静态方法、属性和实例属性的用法,本攻略将带来详细的讲解与示例。 1. 静态方法与属性 静态方法和属性是指属于类本身而不是属于实例的方法和属性。静态方法和属性可以直接通过类名进行调用,而不需要先实例化类的对象。下…

    JavaScript 2023年5月27日
    00
  • js将字符串转成正则表达式的实现方法

    让我来详细讲解一下“JS将字符串转成正则表达式的实现方法”的攻略。 使用RegExp构造函数 我们可以使用JavaScript中的RegExp构造函数将字符串转成正则表达式。RegExp对象是一个具有预定义属性和方法的内置JavaScript对象,它可以用来创建正则表达式对象。下面是一个例子: const patternString = ‘test’; //…

    JavaScript 2023年5月28日
    00
  • php正则删除html代码中class样式属性的方法 原创

    PHP正则删除HTML代码中class样式属性的方法 在PHP中,删除HTML代码中的Class样式属性是一个常见的需求,我们可以使用正则表达式来完成。下面将介绍如何使用正则表达式来删除HTML代码中的Class样式属性。 使用preg_replace函数 PHP中的preg_replace函数可以使用正则表达式替换子串。我们可以使用此函数删除HTML代码中…

    JavaScript 2023年6月10日
    00
  • 再谈javascript面向对象编程

    当谈到JavaScript编程时,面向对象编程(OOP)是必须理解的一个概念。下面是JavaScript中面向对象编程的完整攻略。 面向对象编程的概述 面向对象编程是一种编程范式,它将程序设计组织成一组对象,每个对象都可以接收数据、处理数据和向其他对象发送消息。JavaScript是基于原型的语言,OOP的核心概念是对象,对于Javascript而言,它在对…

    JavaScript 2023年6月10日
    00
  • JS小数转换为整数的方法分析

    下面是详细讲解“JS小数转换为整数的方法分析”的攻略: 问题背景 在JavaScript中,我们有时需要将小数转换成整数。例如,将0.3转换成3,或者将0.6转换成6。本文将介绍几种方法来实现这种转换。 方法一:乘法转换 此方法很简单,只需将小数乘以10的n次幂,其中n是小数点右侧的位数。然后将乘积四舍五入取整。这样就可以得到整数值。 function to…

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