直接给代码吧:

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import android.util.TypedValue;
import java.util.ArrayList;
import java.util.List;/*** 描述:* 作者:HCH* 时间:2016/7/10*/
public abstract class NineGridLayout extends ViewGroup {private static final float DEFUALT_SPACING = 3f;private static final int MAX_COUNT = 9;protected Context mContext;private float mSpacing = DEFUALT_SPACING;private int mColumns;private int mRows;private int mTotalWidth;private int mSingleWidth;private boolean mIsShowAll = false;private boolean mIsFirst = true;protected List<String> mUrlList = new ArrayList<>();public NineGridLayout(Context context) {super(context);init(context);}public NineGridLayout(Context context, AttributeSet attrs) {super(context, attrs);TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.NineGridLayout);mSpacing = typedArray.getDimension(R.styleable.NineGridLayout_sapcing, DEFUALT_SPACING);typedArray.recycle();init(context);}private void init(Context context) {mContext = context;if (getListSize(mUrlList) == 0) {setVisibility(GONE);}}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);}@Overrideprotected void onLayout(boolean changed, int left, int top, int right, int bottom) {mTotalWidth = right - left;mSingleWidth = (int) ((mTotalWidth - mSpacing * (3 - 1)) / 3);if (mIsFirst) {notifyDataSetChanged();mIsFirst = false;}}/*** 设置间隔** @param spacing*/public void setSpacing(float spacing) {mSpacing = spacing;}/*** 设置是否显示所有图片(超过最大数时)** @param isShowAll*/public void setIsShowAll(boolean isShowAll) {mIsShowAll = isShowAll;}//设置图片url集合public void setUrlList(List<String> urlList) {if (getListSize(urlList) == 0) {setVisibility(GONE);return;}setVisibility(VISIBLE);mUrlList.clear();mUrlList.addAll(urlList);notifyDataSetChanged();}public void notifyDataSetChanged() {removeAllViews();int size = getListSize(mUrlList);if (size > 0) {setVisibility(VISIBLE);} else {setVisibility(GONE);}/*** 一张图片的时候自己处理下,下面是我的处理方法,在图片命名的时候,在最后面加图片的宽高比WH
* 例如:http://taohong10053458.image.myqcloud.com/1475846613.264475WH1.38
* 宽高比1.38    然后再根据宽高比去重新设定图片的宽高
*
*/if (size == 1) {String url = mUrlList.get(0);ImageView imageView = createImageView(0, url);//避免在ListView中一张图未加载成功时,布局高度受其他item影响LayoutParams params = getLayoutParams();String[] str = url.split("H");float weight = 0;if (str != null){int length = str.length;if (length >= 2) {try {weight = Float.valueOf(str[length - 1]);} catch (Exception e) {e.printStackTrace();}}}if (weight != 0 ){int width = 0;int height = 0;if (weight > 1){width = dp2px(mContext, 230);height = dp2px(mContext, 230/weight);params.height = height;setLayoutParams(params);imageView.layout(0, 0, width, height);}else {width = DensityUtil.dp2px(mContext, 180);height = DensityUtil.dp2px(mContext, 180/weight);params.height = height;setLayoutParams(params);imageView.layout(0, 0, width, height);}}else {params.height = mSingleWidth;setLayoutParams(params);imageView.layout(0, 0, mSingleWidth, mSingleWidth);}boolean isShowDefualt = displayOneImage(imageView, url, mTotalWidth);if (isShowDefualt) {layoutImageView(imageView, 0, url, false);} else {addView(imageView);}return;}generateChildrenLayout(size);layoutParams();for (int i = 0; i < size; i++) {String url = mUrlList.get(i);ImageView imageView;if (!mIsShowAll) {if (i < MAX_COUNT - 1) {imageView = createImageView(i, url);layoutImageView(imageView, i, url, false);} else { //第9张时if (size <= MAX_COUNT) {//刚好第9张imageView = createImageView(i, url);layoutImageView(imageView, i, url, false);} else {//超过9张imageView = createImageView(i, url);layoutImageView(imageView, i, url, true);break;}}} else {imageView = createImageView(i, url);layoutImageView(imageView, i, url, false);}}}private void layoutParams() {int singleHeight = mSingleWidth;//根据子view数量确定高度LayoutParams params = getLayoutParams();params.height = (int) (singleHeight * mRows + mSpacing * (mRows - 1));setLayoutParams(params);}private ImageView createImageView(final int i, final String url) {ImageView imageView = new ImageView(mContext);imageView.setBackgroundColor(getResources().getColor(R.color.image_default_bg));imageView.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {onClickImage(v, i, url, mUrlList);if (listener != null) listener.onClickImage(v, i, url, mUrlList.get(i));}});return imageView;}/*** @param imageView* @param url* @param showNumFlag 是否在最大值的图片上显示还有未显示的图片张数*/private void layoutImageView(ImageView imageView, int i, String url, boolean showNumFlag) {final int singleWidth = (int) ((mTotalWidth - mSpacing * (3 - 1)) / 3);int singleHeight = singleWidth;int[] position = findPosition(i);int left = (int) ((singleWidth + mSpacing) * position[1]);int top = (int) ((singleHeight + mSpacing) * position[0]);int right = left + singleWidth;int bottom = top + singleHeight;imageView.layout(left, top, right, bottom);addView(imageView);if (showNumFlag) {//添加超过最大显示数量的文本int overCount = getListSize(mUrlList) - MAX_COUNT;if (overCount > 0) {float textSize = 30;final TextView textView = new TextView(mContext);textView.setText("+" + String.valueOf(overCount));textView.setTextColor(Color.WHITE);textView.setPadding(0, singleHeight / 2 - getFontHeight(textSize), 0, 0);textView.setTextSize(textSize);textView.setGravity(Gravity.CENTER);textView.setBackgroundColor(Color.BLACK);textView.getBackground().setAlpha(120);textView.layout(left, top, right, bottom);addView(textView);}}displayImage(imageView, url);}//根据第几个找到它在屏幕上的位置private int[] findPosition(int childNum) {int[] position = new int[2];for (int i = 0; i < mRows; i++) {for (int j = 0; j < mColumns; j++) {if ((i * mColumns + j) == childNum) {position[0] = i;//行position[1] = j;//列break;}}}return position;}/*** 根据图片个数确定行列数量** @param length*/private void generateChildrenLayout(int length) {if (length <= 3) {mRows = 1;mColumns = length;} else if (length <= 6) {mRows = 2;mColumns = 3;if (length == 4) {mColumns = 2;}} else {mColumns = 3;if (mIsShowAll) {mRows = length / 3;int b = length % 3;if (b > 0) {mRows++;}} else {mRows = 3;}}}protected void setOneImageLayoutParams(RatioImageView imageView, int width, int height) {
//        imageView.setLayoutParams(new LayoutParams(width, height));imageView.layout(0, 0, width, height);LayoutParams params = getLayoutParams();
//        params.width = width;params.height = height;setLayoutParams(params);}private int getListSize(List<String> list) {if (list == null || list.size() == 0) {return 0;}return list.size();}private int getFontHeight(float fontSize) {Paint paint = new Paint();paint.setTextSize(fontSize);Paint.FontMetrics fm = paint.getFontMetrics();return (int) Math.ceil(fm.descent - fm.ascent);}public int dp2px(Context context, float dpVal) {return (int)               TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dpVal,   context.getResources().getDisplayMetrics());}private OnImageClickListener listener;public void setOnClickImageListener(OnImageClickListener listener){this.listener = listener;}public interface OnImageClickListener{void onClickImage(View view, int position, String url, String urlList);}/*** @param imageView* @param url* @param parentWidth 父控件宽度* @return true 代表按照九宫格默认大小显示,false 代表按照自定义宽高显示*/protected abstract boolean displayOneImage(ImageView imageView, String url, int parentWidth);protected abstract void displayImage(ImageView imageView, String url);protected abstract void onClickImage(View view, int position, String url, List<String> urlList);
}

加上attr:

<declare-styleable name="NineGridLayout"><attr name="sapcing" format="dimension"/></declare-styleable>

使用方便方便,继承上面的自定义NineGridLayout,实现最后三个方法,加载图片,及点击图片后的事件处理。

android 类似qq空间微博微信九宫格图片相关推荐

  1. android类似QQ空间,微信朋友圈,微博主页源码

    2019独角兽企业重金招聘Python工程师标准>>> 类似QQ空间,微信朋友圈,微博主页等,展示图片的九宫格控件,自动根据图片的数量确定图片大小和控件大小,使用Adapter模式设 ...

  2. 类似QQ空间,微信朋友圈,微博主页等,展示图片的九宫格控件

    类似QQ空间,微信朋友圈,微博主页等,展示图片的九宫格控件,自动根据图片的数量确定图片大小和控件大小,使用Adapter模式设置图片,对外提供接口回调,使用接口加载图片,支持任意的图片加载框架,如 G ...

  3. 全球社交网络排名:QQ空间/微博/微信前十

    社交网络巨头Facebook拥有庞大的用户人群,这一点早已为所有人熟知.但对于其他一些社交媒体公司的用户相关数据,很多人可能都不是那么熟悉. 美国科技博客BusinessInsider近日撰文指出,如 ...

  4. Android微信九宫格图片展示控件

    版权声明:本文为xing_star原创文章,转载请注明出处! 本文同步自http://javaexception.com/archives/214 Android微信九宫格图片展示控件 半年前,公司产 ...

  5. android批量上传图片(模仿QQ空间和微信发表说说)

    android批量上传图片(模仿QQ空间和微信发表说说) **请大家关注下我的微信公众号:哦哦猿 QQ群:552123831** 首先我们来看下效果 这个是启动方法:HttpPostUtil.save ...

  6. pc端常用的分享QQ、QQ空间、微信、微博、复制链接

    pc端常用的分享QQ.QQ空间.微信.微博.复制链接 网上太多的关于这个的了,但是都没有符合我要求的插件.只好自己写,顺带分享出来给小白们 直接上代码了用的是最基础的代码 这个下载好放到对应的位置 q ...

  7. Android学QQ空间相册浏览类型横向滑动效果显示多图片MyHorizontalScrollView

    Android学QQ空间相册浏览类型横向滑动效果显示多图片MyHorizontalScrollView 我们来定制一下吧 布局文件:activity_main.xml <LinearLayout ...

  8. android listview左右滑动动画效果,Android基于ListView实现类似QQ空间的滚动翻页与滚动加载效果...

    本文实例讲述了Android基于ListView实现类似QQ空间的滚动翻页与滚动加载效果.分享给大家供大家参考,具体如下: 1. 滚动加载 listView.setOnScrollListener(n ...

  9. 如何将自己的网站分享到QQ空间,微信,微博等等。

    逛一些网站的时候经常会看到右侧挂个分享栏,让用户把自己的站分享到qq空间,微信等等,所以自己也研究了下,把他加到了自己的网站上,喜欢的可以先看看效果:去转盘网,不多说了,直接上代码: window._ ...

最新文章

  1. 68位高考状元真实身份曝光:最好的教育,是拼爹!
  2. java buffer nio_Java NIO之Buffer(缓冲区)入门
  3. IdentityServer4 之Client Credentials走起来
  4. ajax回调给全局变量,jquery.Ajax回调成功后数据赋值给全局变量的问题
  5. libreoffice使用_使用LibreOffice Calc管理您的财务
  6. 95-220-020-源码-Idle-Flink中Idle停滞流机制
  7. Hive的UDF是什么?
  8. 千字搞定数据产品选型!报表、BI、大数据平台、中台都在这了
  9. 【Codevs 3115】高精度练习之减法
  10. swift -- 字典
  11. React开发(142):react中的json对比工具
  12. 使程序在后台运行,后台进程实现原理
  13. 一般试卷的纸张大小是多少_试卷标准字体大小是多少 考试试卷标准字体格式...
  14. PHP网上购物商城系统 毕业设计参考
  15. Hopcroft-Carp(有点难)
  16. Java综合实验1题目: 猜心术---猜姓氏游戏
  17. DLL的创建和使用(含代码)
  18. 我在哪?(寒假每日一题 35)
  19. win32程序窗口的创建
  20. 解决git clone提示Permission denied publickey 问题

热门文章

  1. #萌新日志#3.使用pix2pix CycleGAN和3d CycleGAN实现T1和T2加权模态的互转
  2. 面向Java开发者的ChatGPT提示词工程(2)
  3. Google账户二次验证取消
  4. 原来网易的lofter界面是模仿的是tumblr
  5. oracle12c用plsql连不上,PLSQL连接oracle12c
  6. 服务器固态硬盘接口区别,s s d固态硬盘和服务器配件硬盘的区别
  7. uniapp通过fir.im 实现应用更新
  8. 微软向开发者免费提供的Windows 10虚拟机镜像
  9. python中可迭代对象是什么意思_python可迭代对象概念讲解
  10. 趣店创新园举办开工奠基仪式 罗敏:总部迁至厦门 带来上千人才