public class NineRectView extends ViewGroup {

private Context ctx;

private int wSize,hSize,row,column,count,childWidth,childHeight,parent_padding_top_bottom;//布局方式按照默认wSize=Hsize

//间距都相同

private int childMargin =4;

private int parent_padding;

private int first_row_num;

private int childCorner=2;

private String childAvatarUrlAppend;

private int childDefaultImageId = R.drawable.tt_default_user_portrait_corner;

public void setChildCorner(int corner)

{

this.childCorner = corner;

}

public void setAvatarUrlAppend(String avatarUrlAppend)

{

this.childAvatarUrlAppend = avatarUrlAppend;

}

public void setChildDefaultImageId(int id)

{

this.childDefaultImageId = id;

}

public void setChildMargin(int margin)

{

this.childMargin = margin;

}

public NineRectView(Context context) {

super(context);

this.ctx = context;

}

public NineRectView(Context context, AttributeSet attrs) {

super(context, attrs);

this.ctx = context;

}

public NineRectView(Context context, AttributeSet attrs,int defStyle) {

super(context, attrs,defStyle);

this.ctx = context;

}

public void setAvatarUrls(List<String> urlList)

{

count = urlList.size();

double m = Math.sqrt(count);

int k = (int)m;

if(m-k==0)

{

column = k;

first_row_num = column;

}

else

{

column = k+1;

}

if(count%column==0)

{

row = count/column;

first_row_num = column;

}

else

{

row = count/column+1;

first_row_num = count%column;

}

this.removeAllViews();

for (int i=0;i<count;i++)

{

IMBaseImageView imageView=new IMBaseImageView(ctx);

imageView.setCorner(childCorner);

imageView.setDefaultImageRes(childDefaultImageId);

imageView.setAvatarAppend(childAvatarUrlAppend);

imageView.setImageUrl(urlList.get(i));

this.addView(imageView);

}

}

@Override

protected void onLayout(boolean changed, int left, int top, int right, int bottom) {

if(row*column>=count)

{

parent_padding=getPaddingLeft();

this.wSize = getWidth();

this.hSize = getHeight();

computePoint();

if(count==1)//为1的特殊处理

{

int cw=(wSize-parent_padding*2-childMargin)/2;

int ch = (hSize-parent_padding*2-childMargin)/2;

int x = (wSize-cw)/2;

int y = (wSize-ch)/2;

View child = getChildAt(0);

child.layout(x, y, x+cw, y+ch);

}

else

{

for (int i = 0; i < count; i++) {

View child = getChildAt(i);

child.layout(startCoordinates.get(i).x, startCoordinates.get(i).y, startCoordinates.get(i).x+childWidth, startCoordinates.get(i).y+childHeight);

}

}

}

}

/**

* 计算坐标

*/

private void  computePoint()

{

startCoordinates.clear();

childWidth = (wSize- parent_padding*2-(column-1)* childMargin)/column;

childHeight = childWidth;//正方形

parent_padding_top_bottom = (hSize - row*childHeight - (row-1)*childMargin)/2;

//计算整排 按照从下向上的顺序计算

for (int i=0;i<row;i++)

{

for (int j=0;j<column;j++)

{

int x,y;

y = parent_padding_top_bottom+i*childHeight+i*childMargin;

if(i==0)

{

if(j<first_row_num)

{

x = (wSize-first_row_num*childWidth-(first_row_num-1)*childMargin)/2+j*childMargin+j*childWidth;

}

else

{

break;

}

}

else

{

x = parent_padding+j*childWidth+j*childMargin;

}

startCoordinates.add(new StartCoordinate(x,y));

}

}

}

private ArrayList<StartCoordinate> startCoordinates = new ArrayList<StartCoordinate>();

class StartCoordinate {

int x ,y;

public StartCoordinate(int x, int y){

this.x = x;

this.y = y;

}

}

}

最新文章

  1. linux svn 用户配置
  2. C#语言基础-类——string增加内容
  3. CCNA实验4:HDLC和PPP
  4. c#之线程池
  5. android 开启或者隐藏软键盘
  6. winform 拖动无边框窗体(调用Windows API)
  7. [置顶] 关于CSDN2013博客之星的一些看法
  8. Open source operational tools
  9. day 23 对象的名称空间 类,对象属性和方法 封装 接口提供
  10. 通用addEventListener方法
  11. Shell获取指定时间
  12. t default] Failed to discover available identity versions when contacting http://ahswj-cloud-controller:35357. Attempting to parse version from URL.: ConnectFailure
  13. arping 帮助——翻译
  14. C#反射学习
  15. C# 解析excel时,字段内有内容,却读取不到的解决方法
  16. Direct3D中 SetStreamSource 函数与数据流
  17. Xavier——Understanding the difficulty of training deep feedforward neural networks
  18. Bash Shell启动配置脚本的顺序
  19. 【javascript】浏览器用户代理检测脚本实现
  20. linux系统使用过程遇到的bug

热门文章

  1. Triangle LOVE(拓扑排序)
  2. 第19章 Redis的一些常用技术
  3. 彻底弄懂px em rem
  4. Mysql数据库概述
  5. lua队列实现
  6. Intel VTune Amplifier XE 使用
  7. JavaScript实现复选框的全选、不选、反选
  8. Android 自定义控件——图片剪裁
  9. C# 获得指定路径扩展名 , 去除扩展名
  10. Django 的 一些基本操作:视图函数,路由配置