Android实现朋友圈多图显示功能

本文实例为大家分享了Android实现朋友圈多图显示的具体代码,供大家参考,具体内容如下

Android实现朋友圈评论回复列表

Android实现朋友圈点赞列表

Android实现朋友圈多图显示功能

正文

先看一下效果图:

MultiImageView:

public class MultiImageView extends LinearLayout {
 public static int MAX_WIDTH = 0;

 // 照片的Url列表
 private List<String> imagesList;

 /**
 * 长度 单位为Pixel *
 */
 private int pxOneMaxWandH; // 单张图最大允许宽高
 private int pxMoreWandH = 0;// 多张图的宽高
 private int pxImagePadding = LvDPUtil.dip2px(3);// 图片间的间距

 private int MAX_PER_ROW_COUNT = 3;// 每行显示最大数

 private LayoutParams onePicPara;
 private LayoutParams morePara, moreParaColumnFirst;
 private LayoutParams rowPara;

 private OnItemClickListener mOnItemClickListener;

 public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
 mOnItemClickListener = onItemClickListener;
 }

 public MultiImageView(Context context) {
 super(context);
 }

 public MultiImageView(Context context, AttributeSet attrs) {
 super(context, attrs);
 }

 public void setList(List<String> lists) throws IllegalArgumentException {
 if (lists == null) {
  throw new IllegalArgumentException("imageList is null...");
 }
 imagesList = lists;

 if (MAX_WIDTH > 0) {
  // 如果需要两张和四张图横向铺满,这里去掉注释即可。
//  if (lists.size() == 2 || lists.size() == 4) {
//  pxMoreWandH = (MAX_WIDTH - pxImagePadding) / 2;
//  } else {
  pxMoreWandH = (MAX_WIDTH - pxImagePadding * 2) / 3; //解决右侧图片和内容对不齐问题
//  }
  pxOneMaxWandH = MAX_WIDTH * 2 / 3; // 一张图的时候,图片宽度
  initImageLayoutParams();
 }

 initView();
 }

 @Override
 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
 if (MAX_WIDTH == 0) {
  int width = measureWidth(widthMeasureSpec);
  if (width > 0) {
  MAX_WIDTH = width - getPaddingLeft() - getPaddingRight();
  if (imagesList != null && imagesList.size() > 0) {
   setList(imagesList);
  }
  }
 }
 super.onMeasure(widthMeasureSpec, heightMeasureSpec);
 }

 /**
 * Determines the width of this view
 *
 * @param measureSpec A measureSpec packed into an int
 * @return The width of the view, honoring constraints from measureSpec
 */
 private int measureWidth(int measureSpec) {
 int result = 0;
 int specMode = MeasureSpec.getMode(measureSpec);
 int specSize = MeasureSpec.getSize(measureSpec);

 if (specMode == MeasureSpec.EXACTLY) {
  // We were told how big to be
  result = specSize;
 } else {
  // Measure the text
  // result = (int) mTextPaint.measureText(mText) + getPaddingLeft()
  // + getPaddingRight();
  if (specMode == MeasureSpec.AT_MOST) {
  // Respect AT_MOST value if that was what is called for by
  // measureSpec
  result = Math.min(result, specSize);
  }
 }
 return result;
 }

 private void initImageLayoutParams() {
 int wrap = LayoutParams.WRAP_CONTENT;
 int match = LayoutParams.MATCH_PARENT;

 onePicPara = new LayoutParams(pxOneMaxWandH, wrap);

 moreParaColumnFirst = new LayoutParams(pxMoreWandH, pxMoreWandH);
 morePara = new LayoutParams(pxMoreWandH, pxMoreWandH);
 morePara.setMargins(pxImagePadding, 0, 0, 0);

 rowPara = new LayoutParams(match, wrap);
 }

 // 根据imageView的数量初始化不同的View布局,还要为每一个View作点击效果
 private void initView() {
 this.setOrientation(VERTICAL);
 this.removeAllViews();
 if (MAX_WIDTH == 0) {
  //为了触发onMeasure()来测量MultiImageView的最大宽度,MultiImageView的宽设置为match_parent
  addView(new View(getContext()));
  return;
 }

 if (imagesList == null || imagesList.size() == 0) {
  return;
 }

 if (imagesList.size() == 1) {
  addView(createImageView(0, false));
 } else {
  int allCount = imagesList.size();
  if (allCount == 4) {
  MAX_PER_ROW_COUNT = 2;
  } else {
  MAX_PER_ROW_COUNT = 3;
  }
  int rowCount = allCount / MAX_PER_ROW_COUNT
   + (allCount % MAX_PER_ROW_COUNT > 0 ? 1 : 0);// 行数
  for (int rowCursor = 0; rowCursor < rowCount; rowCursor++) {
  LinearLayout rowLayout = new LinearLayout(getContext());
  rowLayout.setOrientation(LinearLayout.HORIZONTAL);

  rowLayout.setLayoutParams(rowPara);
  if (rowCursor != 0) {
   rowLayout.setPadding(0, pxImagePadding, 0, 0);
  }

  int columnCount = allCount % MAX_PER_ROW_COUNT == 0 ? MAX_PER_ROW_COUNT
   : allCount % MAX_PER_ROW_COUNT;//每行的列数
  if (rowCursor != rowCount - 1) {
   columnCount = MAX_PER_ROW_COUNT;
  }
  addView(rowLayout);

  int rowOffset = rowCursor * MAX_PER_ROW_COUNT;// 行偏移
  for (int columnCursor = 0; columnCursor < columnCount; columnCursor++) {
   int position = columnCursor + rowOffset;
   rowLayout.addView(createImageView(position, true));
  }
  }
 }
 }

 private ImageView createImageView(final int position, final boolean isMultiImage) {
 String url = "";
 if (!TextUtils.isEmpty(imagesList.get(position))) {
  url = imagesList.get(position);
 }

 ImageView imageView = new ColorFilterImageView(getContext());
 if (isMultiImage) {
  imageView.setScaleType(ScaleType.CENTER_CROP);
  imageView.setLayoutParams(position % MAX_PER_ROW_COUNT == 0 ? moreParaColumnFirst : morePara);
 } else {
  imageView.setAdjustViewBounds(true);
  imageView.setScaleType(ScaleType.FIT_START);
  imageView.setMaxHeight(pxOneMaxWandH);
  imageView.setLayoutParams(onePicPara);
 }

 imageView.setId(url.hashCode());
 imageView.setOnClickListener(new OnClickListener() {
  @Override
  public void onClick(View v) {
  if (mOnItemClickListener != null) {
   mOnItemClickListener.onItemClick(v, position);
  }
  }
 });
 // 加载网络图片/设置图片显示
 Glide.with(getContext()).load(url).into(imageView);
 return imageView;
 }

 public interface OnItemClickListener {
 void onItemClick(View view, int position);
 }
}

点击有阴影的 ImageView :

public class ColorFilterImageView extends ImageView implements OnTouchListener {
 public ColorFilterImageView(Context context) {
 this(context, null, 0);
 }

 public ColorFilterImageView(Context context, AttributeSet attrs) {
 this(context, attrs, 0);
 }

 public ColorFilterImageView(Context context, AttributeSet attrs, int defStyle) {
 super(context, attrs, defStyle);
 init();
 }

 private void init() {
 setOnTouchListener(this);
 }

 @Override
 public boolean onTouch(View v, MotionEvent event) {
 switch (event.getAction()) {
  case MotionEvent.ACTION_DOWN: // 按下时图像变灰
  setColorFilter(Color.GRAY, Mode.MULTIPLY);
  break;
  case MotionEvent.ACTION_UP: // 手指离开或取消操作时恢复原色
  case MotionEvent.ACTION_CANCEL:
  setColorFilter(Color.TRANSPARENT);
  break;
  default:
  break;
 }
 return false;
 }
}

用法

<com.lvfq.myworkingtest.dynamic.view.MultiImageView
 android:id="@+id/multi_image"
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:padding="@dimen/dp_10" />

MultiImageView multiImageView = findViewById(R.id.multi_image);
multiImageView.setList(imgs); // List<String> 类型的图片地址列表
multiImage.setOnItemClickListener(new MultiImageView.OnItemClickListener() {
   @Override
   public void onItemClick(View view, int position) {
   // To do something or 查看大图.
   }
  });

代码已整理到Github

附:如果需要完整朋友圈项目的话,这里推荐一个 Github 项目仿微信实现的朋友圈

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Android GridView仿微信朋友圈显示图片

    最近项目要求上传多图并且多图显示,而且要规则的显示,就像微信朋友圈的图片显示一样. 利用GridView再适合不过了,GridView可以动态加载图片的数量,而且还比较规律,下面说一下自己的思路: 1.获取网络图片 2.初始化gridview,自定义适配器 3.根据图片数量设置gridview的列数 4.更新适配器 下面贴上部分源码并给大家解析一下 一.首先是GridView的item <com.view.SquareLayout xmlns:android="http://schemas

  • Android实现朋友圈多图显示功能

    本文实例为大家分享了Android实现朋友圈多图显示的具体代码,供大家参考,具体内容如下 Android实现朋友圈评论回复列表 Android实现朋友圈点赞列表 Android实现朋友圈多图显示功能 正文 先看一下效果图: MultiImageView: public class MultiImageView extends LinearLayout { public static int MAX_WIDTH = 0; // 照片的Url列表 private List<String> imag

  • Android实现朋友圈评论回复列表

    本文实例为大家分享了Android实现朋友圈评论回复列表的具体代码,供大家参考,具体内容如下 Android实现朋友圈评论回复列表 Android实现朋友圈点赞列表 Android实现朋友圈多图显示功能 正文 还是老流程,先来看一下效果图: 然后是主要实现代码: CommentsView public class CommentsView extends LinearLayout { private Context mContext; private List<CommentsBean> mD

  • Android实现朋友圈点赞列表

    本文实例为大家分享了Android朋友圈点赞列表的具体代码,供大家参考,具体内容如下 Android实现朋友圈评论回复列表 Android实现朋友圈点赞列表 Android实现朋友圈多图显示功能 正文 效果图: 具体实现代码 LikesView public class LikesView extends TextView { private Context mContext; private List<UserBean> list; public LikesView(Context cont

  • 微信小程序点击生成朋友圈分享图(遇到的坑)

    上个月boss交给我个微信小程序的活,告诉我只需要负责前端页面这块,问我多久做完,于是我不知天高地厚的说 一礼拜就能完工,哈哈哈,果然,现实总是那么无情的来打脸了...磨磨蹭蹭一共用了将近3个礼拜才算完事. 今天就来总结下遇到的各种坑好了~~~ 由于做的是仿照包你说的小程序,这里就借用包你说的截图好啦 (这个做出来是模拟器跟真机上都会显示生成的图片的,鬼知道是为啥..) 唔,不废话了,直接上代码好啦 A:wxml(一定要加上image标签,如果你没有加的话,那么即使图片生成了,在页面上也是不会显

  • android实现多图文分享朋友圈功能

    很多安卓程序员都在寻找如何调用系统分享可以实现朋友圈多图加文字分享的功能,小编经过测试入坑后,为你整理以下内容: private void shareMultiplePictureToTimeLine(File... files) { Intent intent = new Intent(); ComponentName comp = new ComponentName("com.tencent.mm", "com.tencent.mm.ui.tools.ShareToTim

  • Android仿微信朋友圈点赞和评论功能

    最近在做朋友圈的项目,所以写一个Android仿朋友圈点赞和评论功能Demo,代码就是简单实现了一下功能,没有做优化,凑合看 图文排列是用的RecyclerView实现的,弹窗效果是用的自定义的PopupWindow,点赞应该是在本地请求数据库,设置一个flag,获取当前用户的id后,带着id向服务器post一个flag,评论就比较简单了,也是获取当前朋友id(或者昵称),带着内容,向服务器post 贴代码: package com.example.lenovo.dianzandemo; imp

  • 微信小程序实现分享朋友圈的图片功能示例

    本文实例讲述了微信小程序实现分享朋友圈的图片功能.分享给大家供大家参考,具体如下: 由于微信小程序只支持分享给朋友或者群,不支持分享到朋友圈,又有分享到朋友圈这个需求,那就要想办法实现这个需求.查阅各种资料,发现基本思路有两种,一种是后端实现,另一种是前端实现,后端实现的方式这里就不讨论了,因为我是不懂后端的,只会前端的东西,所以这里就记录一下前端的实现方法. 前端要实现分享到朋友群,都是通过canvas做一张图片,然后用户手动分享朋友圈.前端具体要做的就是把要分享的页面用canvas重做一遍,

  • Android实现微信朋友圈发本地视频功能

    一.前言 前一篇文章已经详细介绍了如何使用Xposed框架编写第一个微信插件:摇骰子和猜拳作弊器 本文继续来介绍如何使用Xposed框架编写第二个微信插件,可以将本地小视频发布到朋友圈的功能.在这之前我们还是要有老套路,准备工作要做好,这里还是使用微信6.3.9版本进行操作,准备工作: 1.使用apktool工具进行反编译,微信没有做加固防护,所以这个版本的微信包反编译是没有任何问题的. 2.借助于可视化反编译工具Jadx打开微信包,后续几乎重要分析都是借助这个工具来操作的. 二.猜想与假设 做

  • Android+Html5混合开发仿微信朋友圈

    开发之前 大约从去年开始吧, 也可能是前年 Html5好像火得不得了, 不得了...总能从网上听说到 XXX混合开发, 为了紧跟潮流(虽然有点儿晚了), 咱们也看看Android+Html5混合开发是怎样的! 今天带来的案例是微信的朋友圈, 因为我觉得是微信把H5给"捧红了". 不过丑话说在前头, 咱们的仿朋友圈可是"低仿", 只是把混合开发的大致流程说说, 界面可能不堪入目...见谅.. 开发环境 Android Studio 2.2.2 JDK1.7 API 2

随机推荐