Android实现图片预览与保存功能

目录
  • 前言
  • 引入插件
  • 总结

前言

在App开发中,通常为了省流提高加载速度提升用户体验我们通常在列表中或新闻中的插图都是以缩略图压缩过的图片来进行展示,当用户点击图片时我们再去加载真正像素的大图让用户预览,如果用户想保存并且可以保存到自己的相册中,那么在Flutter中如何实现这样的功能,看完这篇文章让你1分钟瞬间实现。

引入插件

首先,我们需要引入强大的Flutter社区中的两个插件,分别是:

photo_view: ^0.13.0 用来加载查看大图。

image_gallery_saver: ^1.7.1 用来保存图片到本地。

首先我们先来看下如何查看大图,使用非常简单,使用PhotoView只需两行代码就可实现图片的放大及缩小,支持本地图片和网络图片查看。

@override
Widget build(BuildContext context) {
  return Container(
      child: PhotoView(
        // imageProvider: AssetImage("assets/xxx.jpg"),
        imageProvider: NetworkImage("imageUrl"),
      )
  );
}

但是这显然是不能满足我们的需求,一般我们需要查看大图都是一个图片列表,看下面:

文档翻译:

//如果使用画廊列表效果请使用 PhotoViewGallery;
To show several images and let user change between them, use PhotoViewGallery.

也就是说我们如果有一个图片列表进行查看的话,可以用上面的PhotoView,如果是图片列表那么就需要用 PhotoViewGallery

一般我们用的是PhotoViewGallery.builder()方法,下面看一下构造函数:

PhotoViewGallery.builder(
  scrollPhysics: BouncingScrollPhysics(), // 滑动到边界的交互 默认Android效果
  scrollDirection: Axis.horizontal,// 滑动方向 默认水平
  reverse: false,//是否逆转滑动的阅读顺序方向 默认false,true水平的话,图片从右向左滑动
  builder: _buildItem,// 图片构造器
  itemCount: widget.bigImageList.length,  // 图片数量
  loadingBuilder: widget.loadingBuilder ?? // 图片加载过程中显示的组件 可以显示加载进度
      (context, e) {
        return MyImage(image: MyImage.defImg);
      },
  backgroundDecoration: widget.backgroundDecoration ?? // 背景样式自定义
      BoxDecoration(color: Colors.black87),
  scaleStateChangedCallback: (photoViewScaleState){
    // 用户双击图片放大缩小时的回调
    },
  enableRotation:false,//是否支持手势旋转图片

  customSize: MediaQuery.of(context).size, //定义图片默认缩放基础的大小,默认全屏 MediaQuery.of(context).size
  allowImplicitScrolling: true,//是否允许隐式滚动 提供视障人士用的一个字段 默认false
  pageController: widget.pageController, // 切换图片控制器
  onPageChanged: (index) {
    // 图片切换回调
    setState(() {
      this.index = index + 1;
    });
  },
),

我们可以看到builder方法是来加载图片的,下面我们就具体看下builderItem方法:

我们可以看到返回的是PhotoViewGalleryPageOptions对象,这个对象就是加载图片的具体类。下面是一些常用的构造方法,这个类还支持手势相关的回调,有兴趣的可以自己研究下。这里就不过多介绍了。

PhotoViewGalleryPageOptions _buildItem(BuildContext context, int index) {
  final BigImageBean item = widget.bigImageList[index];
  return PhotoViewGalleryPageOptions(
    // 图片加载器 支持本地、网络
    imageProvider: NetworkImage(item.imageUrl ?? ""),
    // 初始化大小 全部展示
    initialScale: PhotoViewComputedScale.contained,
    // 最小展示 缩放最小值
    minScale: PhotoViewComputedScale.contained * 0.5,
    // 最大展示 缩放最大值
    maxScale: PhotoViewComputedScale.covered * 4,
    // hero动画设置
    heroAttributes: PhotoViewHeroAttributes(tag: item.imageUrl ?? ""),
  );
}

至此,我们就完成了图片的预览大图操作,是不是很简单。可以查看了之后,接下来我们还需要将这个图片保存到相册,那就更简单了,我们来看下image_gallery_saver插件是如何保存图片的,

一个是通过字节数组保存,一个是保存文件,那就很简单了,只需要将网络图片转换为字节码然后调用保存就可以了,当然这里需要进行文件存储权限的验证,权限验证插件:permission_handler,这里我们通过dio网络库将网络图片转换为字节, 网络封装库见另一篇文章:dio的二次封装。

Future<Uint8List> imageToBytes(String imageUrl) async {
  var response = await _dio?.get(imageUrl,
      options: Options(responseType: ResponseType.bytes));
  return Uint8List.fromList(response?.data);
}

最后来个效果图展示吧:

我们发现刚才那张图片已经被我们保存到相册了。

总结

站在巨人的肩膀,有些事情可以让我们容易的实现,这也是Flutter社区给与开发者强大的后盾,这两个插件是我经过实战检验过的,在Android、iOS上目前都没有问题,就不贴完整源码了吧,核心代码基本都在上面了,自己动手敲一敲使用起来你会更得心应手,嘿嘿

到此这篇关于Android实现图片预览与保存功能的文章就介绍到这了,更多相关Android 图片预览保存内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Android实现Camera2预览和拍照效果

    简介 网上对于 Camera2 的介绍有很多,在 Github 上也有很多关于 Camera2 的封装库,但是对于那些库,封装性太强,有时候我们仅仅是需要个简简单单的拍照功能而已,因此,自定义一个 Camera 使之变得轻量级那是非常重要的了.(本文并非重复造轮子, 而是在于学习 Camera2API 的基本功能, 笔记之.) 学习要点: 使用 Android Camera2 API 的基本功能. 迭代连接到设备的所有相机的特征. 显示相机预览和拍摄照片. Camera2 API 为连接到 An

  • Android CameraX 打开摄像头预览功能

    目标很简单,用CameraX打开摄像头预览,实时显示在界面上.看看CameraX有没有Google说的那么好用.先按最简单的来,把预览显示出来. 引入依赖 模块gradle的一些配置,使用的Android SDK版本为31,启用了databinding apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' apply plug

  • Android Camera2 实现预览功能

    1. 概述 最近在做一些关于人脸识别的项目,需要用到 Android 相机的预览功能.网上查阅相关资料后,发现 Android 5.0 及以后的版本中,原有的 Camera API 已经被 Camera2 API 所取代. 全新的 Camera2 在 Camera 的基础上进行了改造,大幅提升了 Android 系统的拍照功能.它通过以下几个类与方法来实现相机预览时的工作过程: •CameraManager :摄像头管理器,主要用于检测系统摄像头.打开系统摄像头等: •CameraDevice

  • Android编程中调用Camera时预览画面有旋转问题的解决方法

    本文实例讲述了Android编程中调用Camera时预览画面有旋转问题的解决方法.分享给大家供大家参考,具体如下: 在调用Camera写应用的时候,前后摄像头的情况有时候是不一样的.有时候,明明后摄像头没有问题,而调用到前摄像头时,却倒转了180°,或者其他角度,百思不得其解.在查看了Android源码之后,发现它的解决办法很是好,接下来贴个源码,以备日后查看. public static int getDisplayRotation(Activity activity) { int rotat

  • Android camera实时预览 实时处理,人脸识别示例

    Android camera实时预览 实时处理,面部认证. 预览操作是网友共享的代码,我在继承SurfaceView 的CameraSurfaceView 中加入了帧监听事件,每次预览监听前五个数据帧,在处理做一个面部识别. 先看目录关系 自定义控件CameraSurfaceView.java 自定义接口方法CameraInterface.java CameraActivity预览界面. CameraSurfaceView.Java package com.centaur.camera.prev

  • Android CameraX打开摄像头预览教程

    目录 前言 引入依赖 权限 界面 开启预览 运行测试 增加开关 小结 前言 目标很简单,用CameraX打开摄像头预览,实时显示在界面上.看看CameraX有没有Google说的那么好用.先按最简单的来,把预览显示出来. 引入依赖 模块gradle的一些配置,使用的Android SDK版本为31,启用了databinding apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin:

  • Android Camera1实现预览框显示

    本文实例为大家分享了Android Camera1实现预览框显示的具体代码,供大家参考,具体内容如下 Android要预览Camer界面其实非常简单,只需要几句话就行. 1.首先要再AndroidManifest.xml中添加权限 <uses-permission android:name="android.permission.CAMERA"/> 2.创建一个xml包含控件TextureView 比如activity_main.xml: <?xml version=

  • Android多种方式实现相机圆形预览的示例代码

    效果图如下: 一.为预览控件设置圆角 为控件设置ViewOutlineProvider public RoundTextureView(Context context, AttributeSet attrs) { super(context, attrs); setOutlineProvider(new ViewOutlineProvider() { @Override public void getOutline(View view, Outline outline) { Rect rect

  • Android快速实现无预览拍照功能

    本文实例为大家分享了Android实现无预览拍照功能的具体代码,供大家参考,具体内容如下 实现思路: 把预览的SurfaceView的宽高设置为肉眼看不出的值,例如0.1dp,其他的就是自定义相机的标准步骤了! 当然,网上自定义相机的文章多的去了,我是不可能再做老生常谈的事的,在这里我推荐一个很好用的第三方库,也许很多人已经了解过并且用过,没用过的同学可以试试,亲测好用. 废话不多说,先上源码地址 这里简单介绍一下用法: 1.在gradle里添加库的依赖:compile 'com.wonderk

  • Android自定义相机、预览区域裁剪

    本文实例为大家分享了Android自定义相机,预览区域裁剪的具体代码,供大家参考,具体内容如下 写法一: 预览区域裁剪,方法调用: //按照比例进行裁剪头像区域 Bitmap   resultBitmap = getScaleImage(resultBitmap,  (int) cuttingAreaView.getX(),   (int) cuttingAreaView.getY(),    cuttingAreaView.getWidth(),    cuttingAreaView.getH

随机推荐