有些时候在论坛的图片排版问题上不想光用九宫格,因为不管每行回复是几张图片都用九宫格的话,有时候并不是那么整齐。所以有时候会根据UI的要求,对不同的张数进行不同的排版。比如

其实对于这种图片的排版,在实现上很简单。只不过是重写ViewGroup而已,没什么技术含量,下面直接贴出代码

/**
 * Created by LZC on 2017/1/6.
 */

public class MutilImageView extends ViewGroup{private List<String> mImagesList = new ArrayList<>();//图片宽高比都是8:5

    //屏幕两边的margin是10dp ,图片和图片之间是3dp
    private float mMargin;//屏幕两边的margin
    private float mPerMargin;//图片和图片之间
    private float mFirstLineHeight;//第一行高度
    private float mSecondLineHeight;//第二行高度
    private float mThirdLineHeight;//第三行高度
    private float mFirstLinePerWidth;//第一行每张图片的宽度
    private float mSecondLinePerWidth;//第二行每张图片的宽度
    private float mThirdLinePerWidth;//第三行每张图片的宽度

    private float mWidth;//整个控件宽度
    private float mHeight;//整个控件高度

    private int mCurrentRow;//正在排第几行
    private float mLineOnLayoutWidth;//某一行已经排了多宽
    public MutilImageView(Context context, AttributeSet attrs) {super(context, attrs);mMargin      = DisplayUtils.dip2px(context,10);mPerMargin   = DisplayUtils.dip2px(context,3);}@Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);mWidth = MeasureSpec.getSize(widthMeasureSpec);

mFirstLineHeight = 0;

mSecondLineHeight = 0;
   
mThirdLineHeight = 0;

if(mImagesList.size() > 0){ if(mImagesList.size() < 4){ //第一排每张图片的宽度 mFirstLinePerWidth = (mWidth - 2*mMargin - (mImagesList.size()-1)*mPerMargin)/mImagesList.size(); mFirstLineHeight = mFirstLinePerWidth * 5/8; }else if(mImagesList.size() == 4){ mFirstLinePerWidth = mSecondLinePerWidth = (mWidth - 2 * mMargin - mPerMargin)/2; mFirstLineHeight = mSecondLineHeight = mFirstLinePerWidth * 5/8; }else if(mImagesList.size() == 5){ mFirstLinePerWidth = (mWidth - 2*mMargin - 2*mPerMargin)/3; mSecondLinePerWidth = (mWidth - 2 * mMargin - mPerMargin)/2; mFirstLineHeight = mFirstLinePerWidth * 5/8; mSecondLineHeight = mSecondLinePerWidth * 5/8; }else{ mFirstLinePerWidth = mSecondLinePerWidth = mThirdLinePerWidth = (mWidth - 2*mMargin - 2*mPerMargin)/3; mFirstLineHeight = mSecondLineHeight = mThirdLineHeight = mFirstLinePerWidth * 5/8; } } mHeight = mFirstLineHeight + mSecondLineHeight + mThirdLineHeight + (mSecondLineHeight == 0?mSecondLineHeight : mPerMargin) + (mThirdLineHeight == 0 ? mThirdLineHeight: mPerMargin); setMeasuredDimension((int)mWidth,(int)mHeight); } private int mLeft; private int mTop; private int mRight; private int mBottom; @Override protected void onLayout(boolean b, int i, int i1, int i2, int i3) { if(getChildCount() > 0){ mCurrentRow = 0; mLineOnLayoutWidth = 0; for(int k = 0; k < getChildCount(); k ++){ if(mCurrentRow == 0){//第一行排版 if(mLineOnLayoutWidth + mFirstLinePerWidth > mWidth){//如果要换行 mCurrentRow = mCurrentRow + 1; mLineOnLayoutWidth = mMargin; mLeft = (int)mLineOnLayoutWidth; mTop = (int)(mFirstLineHeight + mPerMargin); mRight = (int)(mLineOnLayoutWidth + mSecondLinePerWidth); mBottom = (int)(mFirstLineHeight + mPerMargin + mSecondLineHeight); mLineOnLayoutWidth = mLineOnLayoutWidth + mPerMargin + mSecondLinePerWidth; }else{ mLeft = (int)(k == 0 ? mMargin : (mLineOnLayoutWidth + mPerMargin)); mTop = 0; mRight = (int)(mLineOnLayoutWidth + (k == 0?mMargin : mPerMargin)+mFirstLinePerWidth); mBottom = (int)mFirstLineHeight; mLineOnLayoutWidth = mLineOnLayoutWidth + (k== 0 ?mMargin : mPerMargin)+mFirstLinePerWidth; } }else if(mCurrentRow == 1){//第二行的排版 if(mLineOnLayoutWidth + mSecondLinePerWidth > mWidth){ mCurrentRow = mCurrentRow + 1; mLineOnLayoutWidth = mMargin; mLeft = (int)mLineOnLayoutWidth; mTop = (int)(mFirstLineHeight + 2*mPerMargin + mSecondLineHeight); mRight = (int)(mLineOnLayoutWidth +mThirdLinePerWidth); mBottom = (int)(mFirstLineHeight + 2*mPerMargin + mSecondLineHeight+mThirdLineHeight); mLineOnLayoutWidth = mLineOnLayoutWidth + mPerMargin+mFirstLinePerWidth; }else{ mLeft = (int)mLineOnLayoutWidth; mTop = (int)(mFirstLineHeight + mPerMargin); mRight = (int)(mLineOnLayoutWidth + mSecondLinePerWidth); mBottom = (int)(mFirstLineHeight + mPerMargin + mSecondLineHeight); mLineOnLayoutWidth = mLineOnLayoutWidth + mPerMargin + mSecondLinePerWidth; } }else if(mCurrentRow == 2){ if(mLineOnLayoutWidth + mThirdLinePerWidth > mWidth){//最多只有三行,最后一行再换行就不操作了 mCurrentRow = mCurrentRow + 1; mLineOnLayoutWidth = 0; }else{ mLeft = (int)mLineOnLayoutWidth; mTop = (int)(mFirstLineHeight + 2*mPerMargin + mSecondLineHeight); mRight = (int)(mLineOnLayoutWidth +mThirdLinePerWidth); mBottom = (int)(mFirstLineHeight + 2*mPerMargin + mSecondLineHeight+mThirdLineHeight); mLineOnLayoutWidth = mLineOnLayoutWidth + mPerMargin+mFirstLinePerWidth; } } getChildAt(k).layout(mLeft,mTop,mRight,mBottom); } } } public void setImageList(List<String> imageList){ if(imageList != null && imageList.size() > 0){ mImagesList.clear(); mImagesList.addAll(imageList); removeAllViews(); for(int i = 0; i < mImagesList.size(); i ++){ ImageView ratioImageView = new ImageView(getContext()); ratioImageView.setBackgroundResource(R.color.grey); ratioImageView.setScaleType(ImageView.ScaleType.FIT_XY); //给ratioImageView 加载网络图片 GlideImageLoadUtils.displayImage(getContext(),imageList.get(i),ratioImageView,0); addView(ratioImageView,i); } invalidate(); } }}

android开发中论坛帖子图片的排版相关推荐

  1. Android开发中微信分享图片有的图片分享不出去的问题解决

    最近一个项目做的源生微信分享,测试出现问题的可以分享出去, 发现有的可以分享出去有的不能分享出去 想半天想不出来,过了两天突然感觉是不是分享的图片太大了,  顿时就恍然大悟,原来我从网络上请求的图片转 ...

  2. Android开发中使用七牛云存储进行图片上传下载

    Android开发中的图片存储本来就是比较耗时耗地的事情,而使用第三方的七牛云,便可以很好的解决这些后顾之忧,最近我也是在学习七牛的SDK,将使用过程在这记录下来,方便以后使用. 先说一下七牛云的存储 ...

  3. android 最新 九宫格,Android开发中怎么显示一个九宫格图片

    Android开发中怎么显示一个九宫格图片 发布时间:2020-11-21 15:09:33 来源:亿速云 阅读:86 作者:Leah 本篇文章给大家分享的是有关Android开发中怎么显示一个九宫格 ...

  4. Android开发中根据图片名称获取在drawable中的ID

    在Android开发中图片资源是必不可少的,如ImageView需要图片资源的ID,ImageButton需要资源的ID等等,我们可以用R.drawable.XXX可以获取图片资源的ID,但是,在某些 ...

  5. android+显示html内容居中显示图片,Android开发中对HTML内容的显示

    摘 要 随着Android科技的发展,手机客户端接受了更多的HTML内容.本文作者采用WebView直接显示法结合人机 >> Android开发中的主题设置研究 线程在Android开发中 ...

  6. android开发中遇到的问题汇总

    android开发中遇到的问题汇总(五),android汇总127.ANDROID仿IOS时间_ANDROID仿IOS弹出提示框 http://dwtedx.com/itshare_297.html1 ...

  7. Android开发中dip,dpi,density,px等详解

    Android开发中的各种单位的解释 Px (Pixel像素) 也称为图像元素,是作为图像构成的基本单元,单个像素的大小并不固定,跟随屏幕大小和像素数量的关系变化(屏幕越大,像素越低,单个像素越大,反 ...

  8. Android开发中应避免的重大错误

    by Varun Barad 由Varun Barad Android开发中应避免的重大错误 (Critical mistakes to avoid in Android development) A ...

  9. 史上最全Android开发中100%会用到的开源框架整理(1/5)

    其实这个开源框架整理很久了,只是一直放在有道云笔记里面,笔者还有很多写得文章都放在有道云笔记里面,有时间都好好整理一下放出来,本篇文章也会不定期更新,由于整理的开源框架分类都有200多个,所有这次只将 ...

最新文章

  1. 【bzoj4566】[Haoi2016]找相同字符【后缀自动机】
  2. [论文阅读][SLAM]Targetless Calibration of LiDAR-IMU System Based on Continuous-time Batch Estimation
  3. LeetCode 166. 分数到小数
  4. LNMP环境搭建 centos7 nginx1.12 mysql5.6 php7
  5. AjaxControlToolKit插件tabContainer在IIS7以上版本部署后自动添加visibility:hidden属性 问题的解决方案...
  6. c#json对象转数组_C#中将json字符串转为List数组对象
  7. 就你赚的那点钱,我们家哪里有能力请护工?
  8. activity劫持反劫持
  9. 模糊c均值聚类算法原理详细讲解
  10. 20181216——自定义全局指令
  11. 你的宽带ip地址被100.64了吗?
  12. docer-compose
  13. parse_depend_manifests Could not find dependent assembly LMicrosoft.Windows.Common-Controls
  14. [bzoj4094]Optimal Milking
  15. 如何阻止事件冒泡与默认事件?
  16. python列表比较方法_python列表常用方法
  17. 大数据云平台数据治理规划方案(PPT)
  18. 今日睡眠质量记录73分
  19. 凸四边形上的双线性插值
  20. Ipad全线涨价;马斯克计划未来数月裁掉推特 75% 员工;支付宝已支持给微信QQ好友转账 | EA周报...

热门文章

  1. 安静:内向性格的竞争力 苏珊·凯恩
  2. Android 自定义折线图实现教程
  3. 风铃机器码修改器2.2单进程单ID硬件信息用于解除机器码硬件修改大师多开器部分游戏
  4. leetcode 1074. Number of Submatrices That Sum to Target(和为target的子矩阵个数)
  5. nginx交叉编译流程
  6. 对产品经理来说,在求职的时候,PMP和NPDP两个证书,哪一个权威性比较高,含金量比较大?
  7. base64照片压缩
  8. abs传感器电压有几伏电_汽车ABS传感器的正常电阻值一般为多少呢 还有没有其它检测方法呢 还有它的信号线怎么检测 一般...
  9. 离散数学__第2章命题逻辑的推理理论__析取范式和合取范式
  10. python mysql limit_数据库mysql中LIMIT取值