宫格视图LatticeApp让开发再变得简单些!

文章最后有demo下载地址

这一篇讲的是LatticeApp最后一个控件Images3LinearLayout,也是这几个控件中代码量最多的一个控件了, Images3LinearLayout控件可以分为两部分来说,第一部分就是它的编辑功能,第二部分就是展示功能、类似微信朋友圈宫格图片展示,如下图所示:

其中编辑功能包括增加、删除、拖拽删除、移动切换(暂未实现),预览功能包括设置每一行最多展示的图片数量、缩放控件的比例、图片的展示类型、图片间距设置等等… 这样就给到我们高度自定义的空间,什么12宫格、9宫格、4宫格,都可以展示。 只要给定imageTextParams.maxLine就可以了。

imageTextParams.maxLine = 2; 如下图所展示的就是4宫格样式。

配置项

首先看配置项Images3Params继承于LatticeView.ImageTextParams,其中参数urls是图片路径,它可以是本地图片路径或者是网络路径,width是必须设置的参数,否则控件无法显示,代码注释中有详细描述。

LatticeView.ImageTextParams中还定义了一个图片加载器这个泛型,这个图片加载器我demo中使用的是 Glide,可以选择自己熟悉的图片加载框架。

图片展示

下面是展示图片实现方法,需要实现displayImage方法与displayDrawableImage两个方法,displayImage是网络与文件图片展示、displayDrawableImage本地图片展示。 需要自己在项目中实现。GlideImageLoader最后要实例化,赋值给配置项中的imageLoader参数。

/***  定义图片加载器。 这里我使用的是Glide图片加载器**  如果要对图片进行不同的处理, 可以再次实现ImageLoader接口*/
public class GlideImageLoader implements ImageLoader {@Overridepublic void displayImage(Context context, Object path, ImageView imageView) {Glide.with(context).load(path).transform(new CenterCrop(), new RoundedCorners(10)).into(imageView);}@Overridepublic void displayDrawableImage(Context context, Integer path, ImageView imageView) {Glide.with(context).load(path)// .diskCacheStrategy(DiskCacheStrategy.DATA).transform(new CenterCrop(), new RoundedCorners(10)).into(imageView);}
}
//R.mipmap.a是本地图片、将其转换成字符串类型就可以展示了urls = new String[]{"图片路径1","图片路径2",R.mipmap.a+""};images3Params = new Images3LinearLayout.Images3Params();images3Params = new Images3LinearLayout.Images3Params();images3Params.imageLoader = new GlideImageLoader();images3Params.bg_color = android.R.color.white;images3Params.setUrls(urls);images3Params.maxLine = 3;images3Params.space = 4; // 图片间距images3Params.scaleType = ImageView.ScaleType.CENTER; // 图片居中显示。 默认是铺满image3Layout.post(new Runnable() {@Overridepublic void run() {// 等到视图加载完,才能获取宽度images3Params.width = image3Layout.getWidth();image3Layout.setParams(images3Params);image3Layout.startView(); // 预览}});

好啦,以上代码就实现的9宫格图片的展示。 那么编辑呢, 怎么操作。我们看下列代码。

切换编辑模式

在配置项中我们看到了这样一行代码:

 // 模式public EditType type = EditType.PREVIEW_TYPE;

什么意思? 我们接着看EditType这个枚举。

/*** 启用编辑的类型*/public enum EditType {// 图片添加模式ADD_TYPE,// 图片删除模式DELETE_TYPE,// 添加与删除共存ALL_TYPE,// 拖拽删除DRAG_TYPE,// 预览PREVIEW_TYPE,}

原来枚举EditType中定义了5中类型。 那么改变配置项中的参数就可以吗? 我们看代码中提供了一个这样的方法。

/*** 启用编辑模式** @param type 编辑的类型 在EditType中定义* @param images(一般最多2张图片, 当参数长度为2时,游标为0的参数应该是删除图片,游标为1的是添加图片)* @return*/public boolean enableEditModel(EditType type, int... images) {if (params == null) {Log.e(TAG, "params is null");return false;}if (type == null) {Log.e(TAG, "EditType is null");return false;}this.removeEditModel();this.params.type = type;switch (type) {case ADD_TYPE:if (images.length > 0) addType(images[0]);break;case DELETE_TYPE:if (images.length > 0) deleteType(images[0]);break;case ALL_TYPE:if (images.length > 1) allType(images[0], images[1]);break;}// 刷新UIstartView();return true;}

enableEditModel()有两个参数,第一个就是EditType枚举,传入你想要的操作模式即可。 第二个参数是一个图片数组参数,看代码的注释是这样说的
“一般最多2张图片, 当参数长度为2时,游标为0的参数应该是删除图片,游标为1的是添加图片” 最多只能传递2张图片哦,而且需要与传入的EditType相互对应。

下面看一下几种编辑模式的切换方法。

删除模式

  // 打开删除模式image3Layout.enableEditModel(Images3LinearLayout.EditType.DELETE_TYPE,R.mipmap.shanchu);

添加模式

       //添加模式  image3Layout.enableEditModel(Images3LinearLayout.EditType.ADD_TYPE, R.mipmap.send_photo_join); // 添加模式

拖拽删除模式

// 开启拖拽删除模式 image3Layout.enableEditModel(Images3LinearLayout.EditType.DRAG_TYPE);

全编辑模式

 // 包括删除和添加-所以需要传递2张图片image3Layout.enableEditModel(Images3LinearLayout.EditType.ALL_TYPE,  R.mipmap.shanchu, R.mipmap.send_photo_join); // 开启全模式

预览模式

 image3Layout.enableEditModel(Images3LinearLayout.EditType.PREVIEW_TYPE);

如果需要在几种模式中来回切换,直接调image3Layout.enableEditModel即可。

绑定事件

  // 绑定点击事件image3Layout.setOnImages3PageItemOnClickListener(this);
// 删除事件监听
image3Layout.setOnPageDeleteImageClickListener(this);
// 长按事件监听
image3Layout.setOnPageItemOnLongClickListener(this);

看看回调方法有哪些。onDeleteClick删除回调,onClick点击回调,这个方法一般用于启动预览图片窗口,onLongClick 长按回调。这几个回调的参数是一样的,urls是路径数组,position是操作的位置。

@Override
public void onDeleteClick(View view, String[] urls, int position) {// 删除成功之后被回调, 处理一些删除之后的逻辑Log.e(TAG,"------" + urls[position]);}@Overridepublic void onClick(View v, Object[] urls, int position) {//urls 这个是返回的图片路径,需要强制转换一下Log.d(TAG, "处理自己的逻辑 - 比如启动预览,点击了 + " + position);}@Overridepublic void onLongClick(View v, Object[] urls, int position) {// 长按事件处罚Log.d(TAG, "触发长按事件 + " + position);}@Overridepublic boolean onClickEndView(View v, Object[] urls, int position) {Log.d(TAG, "点击了最后一个追加图片按钮, 插入一张图片到倒数第二的位置"+position);image3Layout.addImage(position, lastImage);image3Layout.startView();// 如果返回 false . onClick(View v, Object[] urls, int position) 将不在被回调,不继续分发事件 , true则相反return false;}

onClickEndView()是啥,为什么还要有一个返回值呢? 这个方法的意思是点击了视图中最后个view, 但是他的触发是有条件的, 我们看代码。

点击的是最后一个,而且必须是数值形态的路径(项目中的图片),并且满足添加模式与全编辑模式的两个参数才会被回调。 onClickEndView()的用途是什么?一般用于启动我们的图片选择器。它的返回值决定了onClick()方法是否被回调,是否要继续向下分发事件。看代码

   /*** 该方法主要监听当前点击的是不是最后一个view, 并且只有在添加图片\全编辑的模式下,才会被调用** @param v* @param urls* @return 是否向下分发事件, 如果返回false, 就不再响应onClick事件。 返回true,继续回调onClick事件*/boolean onClickEndView(View v, Object[] urls, int position);

插入一张图片到指定位置

  image3Layout.addImage(position, "图片路径");image3Layout.startView();

如果在ListView或者RecyclerView的adapter中使用,出现图片错乱的情况, 请先调用removeViews()方法。

在布局文件中的引用

     <com.gongjiebin.latticeview.Images3LinearLayoutandroid:id="@+id/il_mian"android:layout_width="match_parent"android:layout_height="wrap_content"/>

用法(引用)

在app->build.gradle文件下 -> dependencies中引入

 implementation 'com.github.gongjb:LatticeApp:1.0.2'

在app->build.gradle文件下 -> android 中加入如下代码

 allprojects {repositories {jcenter()maven {url 'https://maven.google.com/'name 'Google'}mavenCentral()}}

为了能顺利加载成功,我们需要做如下操作,在根目录build.gradle文件下->buildscript下加入如下代码

    repositories {google()maven { url 'http://maven.aliyun.com/nexus/content/groups/public/'}maven { url 'https://www.jitpack.io' }}

在根目录build.gradle文件根目录下加入如下代码

allprojects {repositories {google()maven { url 'http://maven.aliyun.com/nexus/content/groups/public/'}maven { url 'https://www.jitpack.io' }maven { url "https://maven.google.com"}maven { url "https://dl.google.com/dl/android/maven2/"}}
}

结束语: 在androidx上也能正常运行该组件,这个组件一共有4个视图,这篇讲的是9宫格图片展示器/编辑器 Images3LinearLayout。 LatticeApp组件讲完了,欢迎大家下载使用,如果您觉得还行,请给我个star 谢谢!

LatticeApp Demo下载地址

整理了一下讲这个组件的其它文章,有兴趣的同学可以看看。

第一篇Android格子视图的另外一种实现之LatticeView视图

第二篇Android格子视图的另外一种实现方式之PersonalTabBar

第三篇Android格子视图的另外一种实现方式之AutoLineLayout与AutoLineDeleteView

Android格子视图的另外一种实现方式之Images3LinearLayout(9宫格/九宫格)相关推荐

  1. Android面试,BroadCastReceiver的两种注册方式的异同

    在Android手机应用程序中开发中,需要用到BroadcastReceiver来监听广播的消息.在自定义好BroadcastReceiver ,需要对其进行注册,注册有两种方法: 一种是在代码当中注 ...

  2. android 软件 加密方法,Android中WIFI常见的几种加密方式(详细)

    系统设置中WIFI热点的加密方式,添加新的WIFI和连接WIFI的时候,需要在程序中配置相应的参数,可以打开自己的手机对着看 包:android.net.wifi.WifiConfiguration  ...

  3. Android中夜间模式的三种实现方式

    参考:https://www.jianshu.com/p/f3aaed57fa15 在本篇文章中给出了三种实现日间/夜间模式切换的方案: 使用 setTheme 的方法让 Activity 重新设置主 ...

  4. Android中圆形图的几种实现方式

    在Android开发中,圆形图片是很常见的,例如淘宝的宝贝,QQ的联系人头像等都是圆形的图片, 但是Android原生的ImageView又不能显示圆形的图片,这就需要我们自己去实现一个圆形图了 一. ...

  5. Android推送服务的几种实现方式

    现实生活中, 推送服务就像订杂志一样, 只要留下你的地址, 杂志就能如期送到你手里, 可以认为每个人都有唯一的一个地址, 但在目前的网络上, 这是办不到的, 因为不是每个人都有一个唯一的地址, 服务器 ...

  6. Android中WIFI常见的几种加密方式(详细)

    系统设置中WIFI热点的加密方式,添加新的WIFI和连接WIFI的时候,需要在程序中配置相应的参数,可以打开自己的手机对着看 包:android.net.wifi.WifiConfiguration  ...

  7. android java 退出程序_android开发两种退出程序方式(killProcess,System.exit)

    KillProcess: 在android中我们如果想要程序的进程结束可以这样写: android.os.Process.killProcess(android.os.Process.myPid()) ...

  8. Android _ MVVM 设计模式的一种实现方式,最新BAT大厂面试者整理的Android面试题目

    前言 首先表明,这篇博客 80% 的内容是翻译自 Christopher Elias 的文章 <Understanding MVVM pattern for Android in 2021> ...

  9. Android _ MVVM 设计模式的一种实现方式

    Model 其实并不是什么新的概念,它最初是由 [Trygve Reenskaug](() 于1979年定义的,作为 MVC 体系结构的一部分. "Model 对表示状态.结构和用户心理模型 ...

最新文章

  1. 倒计时2天,如何搭乘通往AI全明星技术盛宴的末班车?(附大会完整版全日程)...
  2. 别再用那些已经淘汰的技术了!2020 年 9 大顶级 Java 框架出炉!!
  3. A级计算机考试试题,计算机等级考试一级试题及答案-计算机a级试题
  4. Java 设计模式之状态模式
  5. buildpack_使用Buildpack容器化Spring Boot应用程序
  6. 快速傅里叶变换python_FFT快速傅里叶变换的python实现过程解析
  7. 点击按钮刷新_Chrome扩展推荐:抢票太累?后台监视网页,页面自动刷新和提醒...
  8. 建立最简单的OpenCASCADE程序
  9. SpringBoot指南(一)——SpringBoot入门
  10. 2012.5.3下午
  11. 2.卷1(套接字联网API)---传输层:TCP,UDP 和 SCTP
  12. Atitit 学习的本质 团队管理与培训的本质 attilax总结 1. 学习的定义 1 2. 学习的本质是数据的处理,海量的数据,处理能力有限的大脑 2 2.1. 摘要(缩小数据体量。。这个过程有
  13. Requirement-Driven Linux Shell Programming
  14. 纯C#实现JPEG解码器在超大图片切割中的应用
  15. Maven项目 混合编译Java和Scala
  16. 事件A和B之间相互独立与互不相容的理解
  17. vue spa php,在Vue中有关SPA首屏加载优化(详细教程)
  18. CocosCreater 教程(中)
  19. 7-18 Decimal Equivalent of a Binary Number (10 分)
  20. 数据结构与算法-Prim算法解析与解决修路最小生成树问题

热门文章

  1. openstack 本地导入镜像.
  2. Cravatar:WordPress网站Gravatar头像完美替代方法
  3. 大学计算机word排版作业,大学作业 word 文档排版.doc
  4. 一篇让你搞定word文档毕业论文/书籍格式
  5. ISP 图像信号处理器数字IP实现
  6. 由于找不到libmysql.dIl, 无法继续执行代码。重新安装程序可能会解决此问题
  7. 最简单DIY基于ESP8266的智能彩灯①(在网页用按钮点亮普通RGB灯)
  8. ? ?. ?? ??=的用法
  9. 20172319 《程序设计与数据结构》第11周学习总结
  10. uni-app开发经验分享十九: uni-app对接微信小程序直播