android 九宫格(16宫格)控件
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宫格)控件的更多相关文章
- Android高效率编码-细节,控件,架包,功能,工具,开源汇总,你想要的这里都有
Android高效率编码-细节,控件,架包,功能,工具,开源汇总 其实写博客的初衷也并不是说什么分享技术,毕竟咱还只是个小程序员,最大的目的就是对自我的知识积累,以后万一编码的时候断片了,也可以翻出来 ...
- Android自动化测试中AccessibilityService获取控件信息(1)
Android自动化测试中AccessibilityService获取控件信息(1) 分类: android自动化测试2014-03-24 15:31 3455人阅读 评论(16) 收藏 举报 and ...
- Android开源的精美日历控件,热插拔设计的万能自定义UI
Android开源的精美日历控件,热插拔设计的万能自定义UI UI框架应该逻辑与界面实现分离,该日历控件使用了热插拔的设计 ,简单几步即可实现你需要的UI效果,热插拔的思想是你提供你的实现,我提供我的 ...
- Android自定义控件之自定义组合控件
前言: 前两篇介绍了自定义控件的基础原理Android自定义控件之基本原理(一).自定义属性Android自定义控件之自定义属性(二).今天重点介绍一下如何通过自定义组合控件来提高布局的复用,降低开发 ...
- Android 开源组件 ----- Android LoopView无限自动轮转控件
Android 开源组件 ----- Android LoopView无限自动轮转控件 2015-12-28 15:26 by 杰瑞教育, 32 阅读, 0 评论, 收藏, 编辑 一.组件介绍 App ...
- android学习日记03--常用控件button/imagebutton
常用控件 控件是对数据和方法的封装.控件可以有自己的属性和方法.属性是控件数据的简单访问者.方法则是控件的一些简单而可见的功能.所有控件都是继承View类 介绍android原生提供几种常用的控件bu ...
- Android开发中目前流行控件和知识点总结
Android开发中目前流行控件和知识点总结 1.SlidingMenu 滑动菜单 应用案例:Facebook . Path 2.0 .人人.网易新闻 下载地址: https://github.c ...
- android - 自定义(组合)控件 + 自定义控件外观
转载:http://www.cnblogs.com/bill-joy/archive/2012/04/26/2471831.html android - 自定义(组合)控件 + 自定义控件外观 A ...
- Android 使用shape定义不同控件的的颜色、背景色、边框色
Android 使用shape定义不同控件的的颜色.背景色.边框色 设置按钮的右边框和底边框颜色为红色,边框大小为3dp: 在drawable新建一个 buttonstyle.xml的文件,内容如下: ...
- Android SDK提供的常用控件Widget “常用控件”“Android原生”
Android提供一个标准的视图工具箱来帮助创建简单的UI界面.通过使用这些控件(必要时,可以对这些控件进行修改). 创建一个简单的.xml文件,从预览窗口可以看到Android SDK提供的原生控件 ...
随机推荐
- 使用register_chrdev注册字符设备
1.2.2 使用register_chrdev注册字符设备 注册字符设备可以使用register_chrdev函数. int register_chrdev (unsigned int major, ...
- 国外物联网平台初探(五) ——Exosite Murano
定位 Murano是一个基于云的IoT软件平台,提供安全.可扩展的基础设施,支持端到端的生态系统,帮助客户安全.可扩展地开发.部署和管理应用.服务以及联网产品. 功能 Murano平台简化了整个IoT ...
- P4396 [AHOI2013]作业 分块+莫队
这个题正解是莫队+树状数组,但是我个人非常不喜欢树状数组这种东西,所以决定用分块来水这个题.直接在莫队维护信息的时候,维护单点同时维护块内信息就行了. 莫队就是这几行核心代码: void add(in ...
- javascript中异常处理案例
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Mac Terminal 快捷键
在Mac系统中并没有Home.End等键,所以在使用时并不是特别的顺手,但是有几个键位组合可以使Terminal的操作更加灵活方便. 1.将光标移动到行首:ctrl + a 2.将光标移动到行尾:ct ...
- BigDataMini导论
Q: BigDataMini从大量数据中挖掘有用的信息,对AI有何意义? A: 随着智能硬件化,DataMini可以作为AI的一种数据筛选方法,简化AI的设计进程.
- uva 1658 Admiral 【 最小费用最大流 】
拆点,每个点拆成 i,i' 在i 和i‘之间连一条费用为0,容量为1的边,就可以保证每个点只经过一次 特殊的点,1和n之间,,,n和2*n之间连一条费用为0,容量为2的边,可以求出两条路径 #incl ...
- 场景报错Error -27492: "HttpSendRequest" failed, Windows error code=12029 (cannot connect) and retry limit (0) exceeded for URL=""
1.现象:loadrunner场景执行,tps图是一段很平稳,然后直线触底,一段时间,直线恢复平稳,触底这段时间报错信息如下: Action.c(6): Error -27492: "Htt ...
- eeee
Math Behind Rx https://github.com/ReactiveX/RxSwift/blob/master/Documentation/MathBehindRx.md Gettin ...
- Binary Agents FreeCodeCamp
function binaryAgent(str) { var arr = str.split(" "); var newStr = ""; for(var i ...