IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android格子视图的另外一种实现方式之Images3LinearLayout(9宫格/九宫格) -> 正文阅读

[移动开发]Android格子视图的另外一种实现方式之Images3LinearLayout(9宫格/九宫格)

宫格视图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 {

    @Override
    public void displayImage(Context context, Object path, ImageView imageView) {
        Glide.with(context).load(path)
                .transform(new CenterCrop(), new RoundedCorners(10))
                .into(imageView);
    }


    @Override
    public 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() {
            @Override
            public 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;
        }

        // 刷新UI
        startView();
        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]);
    }


    @Override
    public void onClick(View v, Object[] urls, int position) {
        //urls 这个是返回的图片路径,需要强制转换一下
        Log.d(TAG, "处理自己的逻辑 - 比如启动预览,点击了 + " + position);
    }

    @Override
    public void onLongClick(View v, Object[] urls, int position) {
        // 长按事件处罚
        Log.d(TAG, "触发长按事件 + " + position);


    }

    @Override
    public 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.Images3LinearLayout
         android: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

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-07-24 11:36:36  更:2021-07-24 11:36:56 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/2 3:45:11-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码