一、测试
实现:

二、添加依赖包:

    implementation 'androidx.appcompat:appcompat:1.1.0'implementation 'androidx.recyclerview:recyclerview:1.1.0'implementation 'com.github.iielse:ImageWatcher:1.1.5'implementation 'com.github.bumptech.glide:glide:4.10.0'implementation 'com.github.tbruyelle:rxpermissions:0.10.2'implementation 'io.reactivex.rxjava2:rxjava:2.2.16'

二、理解
1.NineGridView九宫格,与微信朋友圈的差不多
2.ImageWatcher图片查看,在九宫格上点击某一个图片后预览:1.拖动,2.放大,3.左右滑动,4.长按保存到手机
2.1 长按预览图片保存到手机(/storage/emulated/0/Pictures/eWorld/1645595672.jpeg),代码:

    //长按预览图片保存到手机@Overridepublic void onPictureLongPress(ImageView v, final Uri uri, int pos) {final AlertDialog.Builder alert = new AlertDialog.Builder(this);alert.setTitle("保存图片");alert.setMessage("你确定要保存图片吗?");alert.setNegativeButton("取消", null);alert.setPositiveButton("确定", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {rxPermissions.request(Manifest.permission.WRITE_EXTERNAL_STORAGE).subscribe(new Consumer<Boolean>() {@Overridepublic void accept(Boolean granted) throws Exception {if (granted) {if (uri != null) {// Always true pre-M//图片保存到手机savePhoto(uri);}} else {Toast.makeText(MainActivity.this, "缺少必要权限,请授予权限", Toast.LENGTH_SHORT).show();}}});dialog.dismiss();}});alert.show();}....../*** 长按保存图片** @param uri 图片url地址*/private void savePhoto(Uri uri) {Glide.with(MainActivity.this).asBitmap().load(uri).listener(new RequestListener<Bitmap>() {@Overridepublic boolean onResourceReady(Bitmap resource, Object model, Target<Bitmap> target, DataSource dataSource, boolean isFirstResource) {String picPath = StorageUtil.getSystemImagePath();StorageUtil.init(MainActivity.this, picPath);dstPath = picPath + (System.currentTimeMillis() / 1000) + ".jpeg";Message message = Message.obtain();message.what = 1;message.obj = resource;myHandler.sendMessage(message);return false;}@Overridepublic boolean onLoadFailed(@Nullable GlideException e, Object model, Target target, boolean isFirstResource) {return false;}}).submit();}

3.九宫格图片数据用Glide从网上获取图片uri地址转换成图片:

    private List<List<String>> getLists() {for (int i = 0; i < 5; i++) {mList = new ArrayList<>();mList.add("https://img.ivsky.com/img/tupian/li/202107/20/maitian-005.jpg");mList.add("https://img.ivsky.com/img/tupian/li/202107/16/shandi-008.jpg");mList.add("https://img.ivsky.com/img/tupian/li/202107/14/feiyi_laguan-008.jpg");mList.add("https://img.ivsky.com/img/tupian/li/202107/15/xingkong-005.jpg");mList.add("https://img.ivsky.com/img/tupian/li/202107/12/maitian-011.jpg");mList.add("https://img.ivsky.com/img/tupian/li/202107/13/xueshan-031.jpg");mList.add("https://img.ivsky.com/img/tupian/li/202107/15/xingkong-005.jpg");mList.add("https://img.ivsky.com/img/tupian/li/202107/16/shandi-008.jpg");mList.add("https://img.ivsky.com/img/tupian/li/202107/05/maitian-005.jpg");mLists.add(mList);}return mLists;}

4.RecyclerView的适配器RvAdapter.java中:

    @Overridepublic void onBindViewHolder(@NonNull final MyViewHolder holder, final int rv_item_position) {holder.layout.setSingleImageSize(80, 120);if (mLists.get(rv_item_position) != null && mLists.get(rv_item_position).size() > 0) {holder.layout.setAdapter(new NineImageAdapter(mContext, mRequestOptions,mDrawableTransitionOptions, mLists.get(rv_item_position)));holder.layout.setOnImageClickListener(new NineGridView.OnImageClickListener() {@Overridepublic void onImageClick(int nine_gv_position, View view) {imageWatcher.show((ImageView) view, holder.layout.getImageViews(), getImageUriList(mLists.get(rv_item_position)));}});}}

4.1 九宫格图片NineGridView的适配器NineImageAdapter.java

public class NineImageAdapter implements NineGridView.NineGridAdapter<String> {private List<String> mImageBeans;private Context mContext;private RequestOptions mRequestOptions;private DrawableTransitionOptions mDrawableTransitionOptions;public NineImageAdapter(Context context, RequestOptions requestOptions, DrawableTransitionOptions drawableTransitionOptions, List<String> imageBeans) {this.mContext = context;this.mDrawableTransitionOptions = drawableTransitionOptions;this.mImageBeans = imageBeans;int itemSize = (ScreenUtils.getScreenWidth(mContext) - 2 * Utils.dp2px(4) - Utils.dp2px(54)) / 3;if (mImageBeans.size() > 1) {this.mRequestOptions = requestOptions.override(itemSize, itemSize);} else {this.mRequestOptions = requestOptions.override(itemSize, itemSize * 3 / 2);}}@Overridepublic int getCount() {return mImageBeans == null ? 0 : mImageBeans.size();}@Overridepublic String getItem(int position) {return mImageBeans == null ? null : position < mImageBeans.size() ? mImageBeans.get(position) : null;}@Overridepublic View getView(int position, View itemView) {ImageView imageView;if (itemView == null) {imageView = new ImageView(mContext);imageView.setBackgroundColor(ContextCompat.getColor(mContext, R.color.cf2f2f2));imageView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));} else {imageView = (ImageView) itemView;}String url = mImageBeans.get(position);if (url == null || url.equals("")) {mRequestOptions.error(R.color.color_grey_cccccc).placeholder(R.color.color_grey_cccccc);Glide.with(mContext).load(R.color.color_grey_cccccc).apply(mRequestOptions).transition(mDrawableTransitionOptions).into(imageView);} else {mRequestOptions.error(R.color.color_grey_cccccc).placeholder(R.color.color_grey_cccccc);Glide.with(mContext).load(url).apply(mRequestOptions).transition(mDrawableTransitionOptions).into(imageView);}return imageView;}
}

三、下载源码github地址,点击链接:Android 实现仿微信朋友圈九宫格图片+NineGridView+ImageWatcher(图片查看:1.预览,2.拖动,3.放大,4.左右滑动,5.长按保存到手机)的功能

Android 实现仿微信朋友圈九宫格图片+NineGridView+ImageWatcher(图片查看:1.预览,2.拖动,3.放大,4.左右滑动,5.长按保存到手机)的功能相关推荐

  1. android com.mylhyl,Android 高仿微信朋友圈拍照上传功能

    模仿微信朋友圈发布动态,输入文字支持文字多少高度自增,有一个最小输入框高度,输入文字有限制,不过这些都很easy! 1. photopicker的使用 这是一个支持选择多张图片,点击图片放大,图片之间 ...

  2. android 微信高仿,Android 高仿微信朋友圈拍照上传功能

    模仿微信朋友圈发布动态,输入文字支持文字多少高度自增,有一个最小输入框高度,输入文字有限制,不过这些都很easy! 1. PhotoPicker的使用 这是一个支持选择多张图片,点击图片放大,图片之间 ...

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

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

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

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

  5. Android 高仿微信朋友圈动态, 支持双击手势放大并滑动查看图片。

    转载请注明出处: http://blog.csdn.net/sk719887916/article/details/40348873 作者skay: 最近参与了开发一款旅行APP,其中包含实时聊天和动 ...

  6. android 打开微信好友动态图片,Android GridView仿微信朋友圈显示图片

    最近项目要求上传多图并且多图显示,而且要规则的显示,就像微信朋友圈的图片显示一样. 利用GridView再适合不过了,GridView可以动态加载图片的数量,而且还比较规律,下面说一下自己的思路: 1 ...

  7. android开发--仿微信朋友圈界面

    话不多说,先来看两张效果图 看图片效果还凑合,就是"朋友圈"三个字和头像的动画过渡效果和微信朋友圈的实际效果还是有点差距,可以的话以后慢慢再优化吧,这里贴出相关的代码,可能部分代码 ...

  8. Android(安卓)高仿微信朋友圈九宫格列表

    目前基本复现微信的朋友圈的浏览效果 直接上效果图吧! 感觉不错的话多多支持吧 由于代码比较多,目前只将核心的适配器代码放出来,如果需要全部的话,下载源码吧,源码地址在最后 适配器代码: private ...

  9. php朋友圈九宫格怎么做,微信朋友圈九宫格视频怎么做 图片背景加九宫格视频随机播放的效果制作|微信九宫格视频...

    在如下图所示的新建项目窗口中,可以点击步骤一处的"浏览"按钮修改项目的存放位置,如果只是要输出为视频文件,这里的项目存放位置的设置用处也不大,最后输出视频文件后不保存项目即可:在步 ...

最新文章

  1. java线程安全性_Java并发-线程安全性
  2. 更新android应用到最新版本
  3. 使用Python+turtle绘制同心圆
  4. Effective Modern C++翻译(3)-条款2:明白auto类型推导
  5. Java和python哪个好,学哪个有用。
  6. oracle数据库if函数,Oracle NULLIF函数
  7. ps批量处理--像素大小修改
  8. win10系统安装jdk8,并且配置环境变量教程
  9. HDU 5869 Different GCD Subarray Query (数学gcd+树状数组离线查询)
  10. 【POJ3683】Priest John's Busiest Day(Special Judge)
  11. python交互编程模式_进入python交互模式的方法
  12. 2022 极术通讯-安谋科技迎来发展新机遇
  13. 配色神器ColorCube
  14. winUSB设备上位机驱动开发环境的搭建
  15. basename command
  16. 自动获取淘宝API数据访问的SessionKey
  17. BUUCTFweb题刷题记录(2020.09.14-2020.09.19)
  18. Oracle表分区概念和实战
  19. anki公司即将出品Vector家庭机器人(正在预售)
  20. 制造业ERP: 生产控制是核心

热门文章

  1. PMP学习笔记 第3章 项目经理的角色
  2. java 电脑模拟器_电脑java模拟器
  3. 安装 android 模拟器
  4. 古诗文欣赏-春夜宴桃李园序
  5. 11.8号软基2.2.2
  6. 计算机设计大赛应用软件组,组一览表(计算机设计大赛).pdf
  7. 如何理解特征函数characteristic function
  8. 刺激战场android闪退,刺激战场总是闪退怎么办?刺激战场闪退解决办法
  9. 中山计算机专硕不用发sci,最新!专硕发84篇SCI遭质疑,本人回应了
  10. 手机应用软件卸载【adb】