一、前言

应工作上的要求,需要有一个类似于微信朋友圈发动态上传图片的功能,想起曾经已经做过了,但奈何不忍看自己以前写的代码的惨状,觉得重新封装一个使用方便,易于维护的类似功能的类,自己之后用起来也顺手,当然也方便一下大家,这样可以加快我们工作的效率,让我们有更多的时间学习(划水)。

功能上的话,目前有添加图片、查看大图、删除图片

二、效果图

先贴一下效果图吧

三、实现功能

库有用到butterknife和显示图片的glide

适配器用的rvadapter,加一个删除功能的气泡弹窗

引入一下相关依赖:

api 'com.jakewharton:butterknife:10.2.1'

annotationProcessor 'com.jakewharton:butterknife-compiler:10.2.1'

implementation 'com.github.bumptech.glide:glide:4.5.0'

annotationProcessor 'com.github.bumptech.glide:compiler:4.5.0'

//气泡弹窗

implementation 'me.kareluo.ui:popmenu:1.1.0'

implementation 'com.zhy:base-rvadapter:3.0.3'

复制代码

####(一)布局文件

主页面上的话,只有一个RecyclerView,他的LayoutManager设为GridLayoutManager,一行为3个

xmlns:app="http://schemas.android.com/apk/res-auto"

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

tools:context=".MainActivity">

android:id="@+id/rv_images"

android:paddingTop="15dp"

android:layout_width="match_parent"

android:layout_height="wrap_content" />

复制代码

子布局的话,有两个ImageView,一个是普通的图片,另外一个固定为那个添加的按钮

android:layout_width="match_parent"

android:layout_height="90dp"

android:gravity="center"

android:layout_marginBottom="10dp"

android:layout_marginTop="10dp"

android:orientation="horizontal">

android:id="@+id/iv_thum"

android:visibility="gone"

android:scaleType="centerCrop"

android:layout_width="90dp"

android:layout_height="match_parent" />

android:visibility="gone"

android:id="@+id/iv_add"

android:src="@mipmap/add_icon"

android:scaleType="centerCrop"

android:layout_width="90dp"

android:layout_height="match_parent" />

复制代码

(二)Activity代码

先来看一下如何在我们的页面里使用我已经写好的这个adapter

首先初始化一下控件和adapter,给adapter设置一个点击添加图片的监听

private void initView() {

rvImages.setLayoutManager(new GridLayoutManager(this, 3));

adapter = new NineGridAdapter(MainActivity.this, mSelectList, rvImages);

adapter.setMaxSize(maxNum);

rvImages.setAdapter(adapter);

adapter.setOnAddPicturesListener(new OnAddPicturesListener() {

@Override

public void onAdd() {

pickImage();

}

});

}

复制代码

选择图片页面的启动

private void pickImage() {

MultiImageSelector selector = MultiImageSelector.create(context);

selector.showCamera(true);

selector.count(maxNum);

selector.multi();

selector.origin(mSelectList);

selector.start(instans, REQUEST_IMAGE);

}

复制代码

拿到选择图片页面的返回数据,添加至List中

@Override

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

super.onActivityResult(requestCode, resultCode, data);

if (requestCode == REQUEST_IMAGE) {

if (resultCode == RESULT_OK) {

List select = data.getStringArrayListExtra(MultiImageSelector.EXTRA_RESULT);

mSelectList.clear();

mSelectList.addAll(select);

adapter.notifyDataSetChanged();

}

}

}

复制代码

(三)适配器代码

首先在构造函数中,往list里添加一个空串,为添加按钮占位。之后初始化一下删除气泡按钮跟大图显示的控件

public NineGridAdapter(Context context, List selectPath, RecyclerView rvImages) {

super(context, R.layout.item_img, selectPath);

this.context = context;

selectPath.add("");

initDeleteMenu();

initTransfer(rvImages);

}

复制代码

两个控件初始化的代码

/**

* 初始化大图查看控件

*/

private void initTransfer(RecyclerView rvImages) {

transferee = Transferee.getDefault(context);

config = TransferConfig.build()

.setSourceImageList(getDatas())

.setProgressIndicator(new ProgressBarIndicator())

.setIndexIndicator(new NumberIndexIndicator())

.setImageLoader(GlideImageLoader.with(context.getApplicationContext()))

.setJustLoadHitImage(true)

.bindRecyclerView(rvImages, R.id.iv_thum);

}

/**

* 初始化图片删除小弹窗

*/

private void initDeleteMenu() {

menuView = new PopupMenuView(context, R.menu.menu_pop, new MenuBuilder(context));

menuView.setSites(PopupView.SITE_TOP);

menuView.setOnMenuClickListener(new OptionMenuView.OnOptionMenuClickListener() {

@Override

public boolean onOptionMenuClick(int position, OptionMenu menu) {

getDatas().remove(deletePosition);

if (!getDatas().get(getDatas().size() - 1).equals("")) {

//列表最后一张不是添加按钮时,加入添加按钮

getDatas().add("");

}

notifyDataSetChanged();

return true;

}

});

}

复制代码

在item填充的函数中完成图片的显示,点击和长按的监听

@Override

protected void convert(ViewHolder viewHolder, String item, final int position) {

ImageView ivThum = viewHolder.getView(R.id.iv_thum);

ImageView ivAdd = viewHolder.getView(R.id.iv_add);

if (item.equals("")) {

//item为添加按钮

ivThum.setVisibility(View.GONE);

ivAdd.setVisibility(View.VISIBLE);

} else {

//item为普通图片

ivThum.setVisibility(View.VISIBLE);

ivAdd.setVisibility(View.GONE);

}

Glide.with(mContext).load(item).into(ivThum);

ivThum.setOnClickListener(new PicturesClickListener(position));

ivAdd.setOnClickListener(new PicturesClickListener(position));

ivThum.setOnLongClickListener(new View.OnLongClickListener() {

@Override

public boolean onLongClick(View view) {

deletePosition = position;

//最上面的三个删除按钮是往下的 其他的都是往上的

if (position < 3) {

menuView.setSites(PopupView.SITE_BOTTOM);

} else {

menuView.setSites(PopupView.SITE_TOP);

}

menuView.show(view);

return false;

}

});

}

复制代码

点击事件代码

private class PicturesClickListener implements View.OnClickListener {

int position;

public PicturesClickListener(int position) {

this.position = position;

}

@Override

public void onClick(View view) {

switch (view.getId()) {

case R.id.iv_thum:

//点击图片

config.setNowThumbnailIndex(position);

config.setSourceImageList(getDatas());

transferee.apply(config).show();

break;

case R.id.iv_add:

//点击添加按钮

if (listener != null)

listener.onAdd();

break;

}

}

}

复制代码

#四、关于老v7项目的问题

前段时间也是刚把自己的项目从v7手动改为androidx的,忙活了半天,后来发现android studio有一键将v7项目改为新的androidx的项目,算是给自己记个笔记

有问题和建议都可以在评论区给我留言哦

android仿微信发布动态功能,Android仿微信朋友圈发布动态功能相关推荐

  1. Android实现仿微信朋友圈发布动态(拍照、图库选择、照片压缩、显示、保存、缩略图、点击缩略图删除对应文件等)

    原址: http://blog.csdn.net/zhang3776813/article/details/52092591 /*** 仿微信朋友圈发布动态* 拍照或图库选择 * 压缩图片并保存**/ ...

  2. Android实现仿微信朋友圈发布动态(拍照、图库选择、照片压缩、显示、保存、缩略图、点击缩略图删除对应文件等)附源码

             原创作品,转载请注明出处:http://blog.csdn.net/zhang3776813/article/details/52092591 最近项目需求中要用到类似微信朋友圈发布 ...

  3. php mysql仿微信朋友圈评论表设计_PHP仿qq空间或朋友圈发布动态、评论动态、回复评论、删除动态或评论的功能(上)...

    我们大部分人都发过动态,想必都知道发动态.回复评论.删除动态的整个过程,那么作为初学者,要模仿这些功能有点复杂的,最起码表的关系得弄清楚~~ 先把思路理一下: (1)用户登录,用session读取当前 ...

  4. php 朋友圈留言,php实例-PHP仿qq空间或朋友圈发布动态、评论动态、回复评论、删除动态或评论的功能(上)...

    我们大部分人都发过动态,想必都知道发动态.回复评论.删除动态的整个过程,那么这个功能是如何实现的呢?下面小编给大家带来了实例代码,对PHP仿qq空间或朋友圈发布动态.评论动态.回复评论.删除动态或评论 ...

  5. 小程序动态class_微盛小程序“圈子动态”来了!仿朋友圈发布动态,引流拓客神器...

    微盛小程序"圈子动态",是一款和微信朋友圈有着相似功能,支持用户动态发布.帖子分享.点赞.评论等,能够集合小程序用户于一个圈子,给他们提供分享商品.交流沟通的平台,帮助商家提高客户 ...

  6. android朋友圈动态视频,安卓版微信7.0.5尝鲜,朋友圈可发30秒视频,网友最爱的功能是?...

    原标题:安卓版微信7.0.5尝鲜,朋友圈可发30秒视频,网友最爱的功能是? 微信现在已经是成为人们每天最常使用的聊天工具之一,因此微信的每一次更新和变化都会引起人们的注意.这不,安卓版的微信又悄悄推出 ...

  7. Flutter高仿微信-第16篇-朋友圈-发布作品(图片)

     Flutter高仿微信系列共59篇,从Flutter客户端.Kotlin客户端.Web服务器.数据库表结构.Xmpp即时通讯服务器.视频通话服务器.腾讯云服务器全面讲解. 详情请查看 效果图: 实现 ...

  8. iphone android 朋友圈,最近很火的微信空白朋友圈发布教程!安卓、苹果通用!

    原标题:最近很火的微信空白朋友圈发布教程!安卓.苹果通用! 各位小伙伴,晚上好啊!已经一个月没有更新了,这篇文章几天之前就要推送了,一直拖到现在,真是名副其实的"拖更王". 微信作 ...

  9. android微信朋友圈视频无法播放,微信朋友圈不能分享手机视频怎么回事?微信朋友圈大视频功能安卓不能用吗?...

    微信朋友圈不能分享手机视频怎么回事?微信朋友圈大视频功能安卓不能用吗?最近微信更新,用户可以进行分享自己手机里的视频,这一举措受到很多人的喜欢.那么微信朋友圈不能分享手机视频怎么回事?微信朋友圈大视频 ...

最新文章

  1. HTML样式offset[Direction] 和 style.[direction]的区别
  2. java异常怎么输出到页面_怎么把抛出的异常信息输出到SWING 界面上
  3. Android 使用 ActivityResult 处理 Activity 之间的数据通信及调起拍照实例
  4. win7 x64 系统无故卡死 360惹的祸 搞了我大半年
  5. Doug Cutting—访谈录
  6. 搜索引擎设计实用教程(3)-以百度为例
  7. 两步路轨迹文件位置_最新Uber ATG的轨迹预测方法LiRaNet介绍
  8. 全网都在用的超全【面试刷题小程序】,最新版激活教程
  9. 程序员的压力有多大?
  10. 如何进行可视化大屏视觉设计?
  11. 中职计算机优质课课件ppt,中职优质课 交集课件.ppt
  12. bbsmax mysql_mysql 常用,使用经验
  13. 睡眠时间 数据_我测试了Apple Watch睡眠追踪以节省您的时间和电池寿命
  14. 请求服务器获取微信openid,Golang通过小程序获取微信openid的方法示例
  15. SLM2110 600V 2A 逆变电源专用芯片替代IR2110S 移动储能解决方案
  16. 如何免费使用jrebel 和eclipse 项目配合完成热部署功能
  17. matlab导入数据画二维云图,matlab中用xyz三组数据画出2维云图
  18. Beyond Compare实现Class文件对比
  19. Win10 新版Edge浏览器Flash Player不兼容,总是显示flash与地区不兼容(完美解决)
  20. 小学一年级计算机社团计划,小学科技兴趣小组活动计划

热门文章

  1. 浅谈vue双向绑定原理
  2. 计算机毕业设计源代码java项目开发实例ssm+mysql实现简单的物流快递管理系统[包运行成功]
  3. 2014年TI杯邀请赛——简易高速差分探头 题目解析
  4. 【运筹学】匈牙利法 ( 匈牙利法步骤 | 第一步 : 使行列出现 0 元素示例 )
  5. 【产品宣传广告片制作软件】Focusky教程 | 前景设置功能
  6. matlab fir stm32,求一个完整的STM32运算FIR滤波程序
  7. JS 对象属性的两种表示方法
  8. OSPF及一类LSA、二类LSA
  9. oracle汉字默认排序,oracle对汉字排序
  10. 电脑连接不上网络(梯子原因)