热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

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

这篇文章主要为大家详细介绍了Android实现朋友圈多图显示功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

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

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

Android实现朋友圈点赞列表

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

正文

先看一下效果图:

MultiImageView:

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

 // 照片的Url列表
 private List 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 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 

点击有阴影的 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;
 }
}

用法



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

代码已整理到Github

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

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


推荐阅读
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • 【Windows】实现微信双开或多开的方法及步骤详解
    本文介绍了在Windows系统下实现微信双开或多开的方法,通过安装微信电脑版、复制微信程序启动路径、修改文本文件为bat文件等步骤,实现同时登录两个或多个微信的效果。相比于使用虚拟机的方法,本方法更简单易行,适用于任何电脑,并且不会消耗过多系统资源。详细步骤和原理解释请参考本文内容。 ... [详细]
  • 安卓select模态框样式改变_微软Office风格的多端(Web、安卓、iOS)组件库——Fabric UI...
    介绍FabricUI是微软开源的一套Office风格的多端组件库,共有三套针对性的组件,分别适用于web、android以及iOS,Fab ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • Google Play推出全新的应用内评价API,帮助开发者获取更多优质用户反馈。用户每天在Google Play上发表数百万条评论,这有助于开发者了解用户喜好和改进需求。开发者可以选择在适当的时间请求用户撰写评论,以获得全面而有用的反馈。全新应用内评价功能让用户无需返回应用详情页面即可发表评论,提升用户体验。 ... [详细]
  • 拥抱Android Design Support Library新变化(导航视图、悬浮ActionBar)
    转载请注明明桑AndroidAndroid5.0Loollipop作为Android最重要的版本之一,为我们带来了全新的界面风格和设计语言。看起来很受欢迎࿰ ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • Java验证码——kaptcha的使用配置及样式
    本文介绍了如何使用kaptcha库来实现Java验证码的配置和样式设置,包括pom.xml的依赖配置和web.xml中servlet的配置。 ... [详细]
  • windows便签快捷键_用了windows十几年,没想到竟然这么好用!隐藏的功能你知道吗?
    本文介绍了使用windows操作系统时的一些隐藏功能,包括便签快捷键、截图功能等。同时探讨了windows和macOS操作系统之间的优劣比较,以及人们对于这两个系统的不同看法。 ... [详细]
  • 本文介绍了在Win10上安装WinPythonHadoop的详细步骤,包括安装Python环境、安装JDK8、安装pyspark、安装Hadoop和Spark、设置环境变量、下载winutils.exe等。同时提醒注意Hadoop版本与pyspark版本的一致性,并建议重启电脑以确保安装成功。 ... [详细]
  • 如何基于ggplot2构建相关系数矩阵热图以及一个友情故事
    本文介绍了如何在rstudio中安装ggplot2,并使用ggplot2构建相关系数矩阵热图。同时,通过一个友情故事,讲述了真爱难觅的故事背后的数据量化和皮尔逊相关系数的概念。故事中的小伙伴们在本科时参加各种考试,其中有些沉迷网络游戏,有些热爱体育,通过他们的故事,展示了不同兴趣和特长对学习和成绩的影响。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 本文介绍了在Python中检查字符串是否为字母、数字或空白字符的几种方法,包括使用str.isalnum()、str.isalpha()、str.isdigit()和str.isspace()等函数进行判断。 ... [详细]
  • 本文讨论了如何在微信支付宝两套小程序中生成一张二维码,实现支付宝扫码进入支付宝小程序和微信扫码进入微信小程序的对应桌号进行点餐的功能,提供了一些实现方案供参考。 ... [详细]
author-avatar
喏焿你一辈子_997
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有