转载请注明出处:http://blog.csdn.net/lv_fq/article/details/77800928 – [发强博客]


系列博客

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();}@Overrideprotected 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 beresult = 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// measureSpecresult = 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_parentaddView(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() {@Overridepublic 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);}@Overridepublic 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.MultiImageViewandroid: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() {@Overridepublic void onItemClick(View view, int position) {// To do something or 查看大图.}});

代码已整理到 Github


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

Android 朋友圈之多图显示相关推荐

  1. Android 朋友圈之评论回复列表

    转载请注明出处:http://blog.csdn.net/lv_fq/article/details/77836700 – [发强博客] 系列博客 Android 朋友圈之多图显示 Android 朋 ...

  2. android朋友圈发文字换行,朋友圈发文字怎么才显示全文 多按几次换行(大概10次左右...

    导语:说到朋友圈,大家应该都熟悉,有朋友问怎么在朋友圈发一句话.,还有人想问朋友圈发文字怎么才显示全文,这到底是咋回事?事实上朋友圈发文字怎么才能不折叠呢,今天给大家说说朋友圈发文字怎么才显示全文,希 ...

  3. android朋友圈评论功能兼容沉浸式状态栏,九宫格图片显示

    android朋友圈评论功能,沉浸式状态栏,九宫格图片显示器,上拉加载下拉刷新功能,可直接用到项目中 背景 在前两个项目开发过程中用到了朋友圈这个功能,包含了评论回复.九宫格图片及大图展示展示,上拉加 ...

  4. 颠覆QQ, 干掉微信? 腾讯内测全新社交App,会是下一款国民社交APP吗? 微信朋友圈可斗图了!...

    综合自  中国基金报.上游新闻,马哥运维, 编辑:可可 拥有微信.QQ 两大社交平台的腾讯,近日,悄悄地内测一款拓展新朋友产品:朋友App.微信也在重大改版中. 这款产品尚处于测试当中,并未正式上架, ...

  5. 发朋友圈显示来自html5,朋友圈说说动态怎么显示来自iPhone XS 装逼技能get

    今天为大家分享一个新的装逼技能,能让大家误以为你入手了iPhone XS或者 Max呢.朋友圈说说动态怎么显示来自iPhone XS 呢?一起来看看吧. 微信朋友圈怎么显示来自iPhone XS 一. ...

  6. android朋友圈动态视频教程,Android--选择图片(仿微信发朋友圈)第一篇

    这篇博客主要写仿微信朋友圈选择图片发朋友圈.整个功能包括加载图片,显示图片.相册文件夹.预览图片,九宫格显示已经选择好的图片等等,大概会有三篇博客. 效果图 看上面的图,加载图片肯定是异步加载,耗时任 ...

  7. 自定义ViewGroup打造微信朋友圈之九宫图效果

    相信很多朋友用过微博和微信,比如在微博的首页里面有个九宫图的功能,请看下方我截的图,正如你看到的那样可以放九张图片,而且这九张图片拼在一起刚好是一个正方形.需要注意的是当四张图片的时候需要上面下面各两 ...

  8. 微信分享网络图片到朋友圈和收藏不显示图片的问题

    如图, 分享到朋友圈的界面,不显示图片,但可以点开,甚至可以删除图片,甚至可以分享成功,再看朋友圈显示的分享成功的界面,如下 显示带橙色的感叹号,不展示图片,也无法删除. 代码: WXImageObj ...

  9. android 朋友圈功能,Android仿微信朋友圈全文收起功能示例(附源码)

    在众多的社交类软件中,朋友圈是必不可少的,可以与好友.同学等分享自己的日常和有意思的事情,在开发社交类App时,朋友圈发表的内容你不可能让他全部显示,全部显示的话用户体验度会非常不好,这时就要用到全文 ...

最新文章

  1. java 常量pi_JAVA的常量
  2. 浅谈对离散型随机变量期望的理解
  3. Dispatch 方法简介
  4. 剑指 Offer 05. 替换空格(两种做法)
  5. 多线程编程反模式_编程反模式
  6. RabbitMQ 拓展基础组件封装思路
  7. springboot中获得app_Spring Boot 应用程序启动流程分析
  8. poj_3628 动态规划
  9. elasticsearch的java搜索语法
  10. 【程序人生】程序员接私活常用平台汇总
  11. 30岁,我从前端转型管理成功了
  12. FileZilla Server 设置
  13. Linux 串口读写
  14. Python手机App数据抓取实战:抖音用户的抓取
  15. 《阿凡达》超越《泰坦尼克号》冠影史(图)
  16. Human Pose Estimation浅述
  17. 奥运排行榜(25 分)
  18. 2565: 最长双回文串
  19. 面向机密计算的Enclave容器技术栈
  20. 【学术】我读科学网“马臻”老师博客体会

热门文章

  1. 只有微信账号,我可以查询聊天记录吗?
  2. Charles抓包(数据)
  3. 李宏毅DLHLP.21.Text Style Transfer
  4. 掌握web开发基础系列--物理像素、逻辑像素、css像素
  5. vuejs开发H5页面总结
  6. 编程是门艺术_是编程艺术吗?
  7. 甄选北京十大律师事务所排名榜(资深团队、胜诉率高)
  8. 形容计算机专业好句子,形容专业水平高的词句
  9. 2023最新SSM计算机毕业设计选题大全(附源码+LW)之java大学生学科竞赛管理系统t16zl
  10. vba设置Excel单元格左对齐、右对齐、居中对齐、字体、字号、字型