Android实现朋友圈多图显示功能
程序员文章站
2023-11-24 18:54:46
本文实例为大家分享了android实现朋友圈多图显示的具体代码,供大家参考,具体内容如下
android实现朋友圈评论回复列表
android实现朋友圈点赞列表
an...
本文实例为大家分享了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 项目仿微信实现的朋友圈
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。