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. WebP 文件及其编码解码工具(WebPconv)

    1. webp 文件 与JPEG相同,WebP 是一种有损压缩利用预测编码技术. WebP 是 Google 新推出的影像技术,它可让网页图档有效进行压缩,同时在质量相同的情况下,WebP 格式图像的 ...

  2. 2017-3-9 leetcode 283 287 289

    今天操作系统课,没能安心睡懒觉23333,妹抖龙更新,可惜感觉水分不少....怀念追RE0的感觉 =================================================== ...

  3. ettercap + driftnet 实现同网段下流量欺骗

    前言: 由于在局域网中,网关会不断地发送 ARP 数据包询问当前是否有新的客户端上线,如果我们可以欺骗当前局域网网段下的主机, 把我们当成网关地址,并且我们把欺骗的流量转发到真正的网关地址,这样我们就 ...

  4. python 飞机大战 实例

    飞机大战 #coding=utf-8 import pygame from pygame.locals import * import time import random class Base(ob ...

  5. 数组和String调用方法时,值是否改变(包含可变参数)

    package com.wh.encapsulation; import java.util.Arrays; /** * @author 王恒 * @datetime 2017年4月5日 上午9:33 ...

  6. Matplotlib库常用函数大全

    Python之Matplotlib库常用函数大全(含注释) plt.savefig(‘test’, dpi = 600) :将绘制的图画保存成png格式,命名为 test plt.ylabel(‘Gr ...

  7. 深入理解DIP、IoC、DI以及IoC容器(转载)

    <转载的这个up的其他的文章也很nice> 这几个词第一眼看,懵逼,第二眼看,更特么懵逼..... 面向对象设计(OOD)有助于我们开发出高性能.易扩展以及易复用的程序. 其中,OOD有一 ...

  8. 【原创】IBM Websphere 报错:JSPG0120E: 为 pageEncoding 属性和匹配 URI 模式的配置元素指定不同的值是非法的。

    websphere中间件,在打开一个jsp页面时报: IBM Websphere 报错:JSPG0120E: 为 pageEncoding 属性和匹配 URI 模式的配置元素指定不同的值是非法的. . ...

  9. 腾讯云TrustAsia DV SSL CA证书的申请及使用

    1.证书申请及管理     对于已经拥有域名及公网服务器的用户,可以通过腾讯云申请TrustAsia DV SSL CA证书,证书申请流程包含填写基本信息和域名认证两步,非常清晰和简单,没有什么需要过 ...

  10. 图解HTTP——阅读笔记

    基础部分 第1章 了解Web及网络基础 重点了解HTTP协议在网络中的作用,扮演了什么角色,以及网络传输中相关的一些角色. 3项重要的web构建技术:HTML,URL,HTTP HTTP协议位于应用层 ...