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;

}

}

}

android 九宫格(16宫格)控件的更多相关文章

  1. Android高效率编码-细节,控件,架包,功能,工具,开源汇总,你想要的这里都有

    Android高效率编码-细节,控件,架包,功能,工具,开源汇总 其实写博客的初衷也并不是说什么分享技术,毕竟咱还只是个小程序员,最大的目的就是对自我的知识积累,以后万一编码的时候断片了,也可以翻出来 ...

  2. Android自动化测试中AccessibilityService获取控件信息(1)

    Android自动化测试中AccessibilityService获取控件信息(1) 分类: android自动化测试2014-03-24 15:31 3455人阅读 评论(16) 收藏 举报 and ...

  3. Android开源的精美日历控件,热插拔设计的万能自定义UI

    Android开源的精美日历控件,热插拔设计的万能自定义UI UI框架应该逻辑与界面实现分离,该日历控件使用了热插拔的设计 ,简单几步即可实现你需要的UI效果,热插拔的思想是你提供你的实现,我提供我的 ...

  4. Android自定义控件之自定义组合控件

    前言: 前两篇介绍了自定义控件的基础原理Android自定义控件之基本原理(一).自定义属性Android自定义控件之自定义属性(二).今天重点介绍一下如何通过自定义组合控件来提高布局的复用,降低开发 ...

  5. Android 开源组件 ----- Android LoopView无限自动轮转控件

    Android 开源组件 ----- Android LoopView无限自动轮转控件 2015-12-28 15:26 by 杰瑞教育, 32 阅读, 0 评论, 收藏, 编辑 一.组件介绍 App ...

  6. android学习日记03--常用控件button/imagebutton

    常用控件 控件是对数据和方法的封装.控件可以有自己的属性和方法.属性是控件数据的简单访问者.方法则是控件的一些简单而可见的功能.所有控件都是继承View类 介绍android原生提供几种常用的控件bu ...

  7. Android开发中目前流行控件和知识点总结

    Android开发中目前流行控件和知识点总结   1.SlidingMenu 滑动菜单 应用案例:Facebook . Path 2.0 .人人.网易新闻 下载地址: https://github.c ...

  8. android - 自定义(组合)控件 + 自定义控件外观

    转载:http://www.cnblogs.com/bill-joy/archive/2012/04/26/2471831.html android - 自定义(组合)控件 + 自定义控件外观   A ...

  9. Android 使用shape定义不同控件的的颜色、背景色、边框色

    Android 使用shape定义不同控件的的颜色.背景色.边框色 设置按钮的右边框和底边框颜色为红色,边框大小为3dp: 在drawable新建一个 buttonstyle.xml的文件,内容如下: ...

  10. Android SDK提供的常用控件Widget “常用控件”“Android原生”

    Android提供一个标准的视图工具箱来帮助创建简单的UI界面.通过使用这些控件(必要时,可以对这些控件进行修改). 创建一个简单的.xml文件,从预览窗口可以看到Android SDK提供的原生控件 ...

随机推荐

  1. JavaScript Simple

    ylbtech-JavaScript: 1.返回顶部 1.   2. 2.返回顶部   3.返回顶部   4.返回顶部   5.返回顶部     6.返回顶部   作者:ylbtech出处:http: ...

  2. ELK+kafka日志收集

    一.服务器信息   版本 部署服务器 用途 备注 JDK jdk1.8.0_102 使用ELK5的服务器 Logstash 5.1.1 安装Tomcat的服务器 发送日志 Kafka降插件版本 Log ...

  3. kindoreditor上传图片

    <!doctype html><html> <head> <meta charset="utf-8" /> <title> ...

  4. vmware笔试题目

    http://discuss.acmcoder.com/topic/58db8e2ebb0f44ba0e94e670 上面是完整的题目,下面一下我自己的想法. http://discuss.acmco ...

  5. Hadoop MapReduce编程 API入门系列之wordcount版本5(九)

    这篇博客,给大家,体会不一样的版本编程. 代码 package zhouls.bigdata.myMapReduce.wordcount1; import java.io.IOException; i ...

  6. Oracle获取alter.log的方法

    10g下:可以在 admin\{sid}\pfile文件下的init.ora文件中找到以下内容:audit_file_dest = C:\ORACLE\PRODUCT\10.2.0\ADMIN\ORC ...

  7. 5) 十分钟学会android--ActionBar知识串烧

    建立ActionBar Action bar 最基本的形式,就是为 Activity 显示标题,并且在标题左边显示一个 app icon.即使在这样简单的形式下,action bar对于所有的 act ...

  8. okhttp3 ExceptionInInitializerError 异常处理

    okhttp3 在Android4.4上出现下面异常 java.lang.ExceptionInInitializerError at okhttp3.OkHttpClient.newSslSocke ...

  9. fabric.js 翻转,复制粘贴,隐藏, 删除,历史记录,撤销, 剪切, 图层,组合打散,锁定等功能

    用vue写的 显示,隐藏 hide(){ this.canvas.getActiveObject().set('opacity', 0).setCoords(); this.canvas.reques ...

  10. PHP 数组 & 字符串处理

    1:数组分割为字符串  implode 2:字符串分割为数组  explode() 3:替换字符串 eg: $a = "Hello world" str_replace(“H”,“ ...