自定义九宫格

要完成自定义加载图片的九宫格的步骤

1:写一个类继承ViewGroup,同时实现他的构造方法,当然自己使用实现两个就完全可以了,不要忘了ViewGroup还有一个必须实现的方法onLaout

public classSudokuextendsViewGroup

publicSudoku(Context context) {this(context,null);}

publicSudoku(Context context, AttributeSet attrs) {this(context, attrs,0);}

publicSudoku(Context context, AttributeSet attrs,intdefStyleAttr)

 {super(context, attrs, defStyleAttr);    init(context,attrs);}

//这个方法是用来控制子view摆放的位置的这里我们不做处理

@Overrideprotected voidonLayout(booleanchanged,intl,intt,intr,intb) {}

//init方法是用来初始化属性的

private voidinit(Context context, AttributeSet attrs) {

this.context= context;    

TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.SudokulayoutStyle);//设置自定义属性

space= typedArray.getDimensionPixelSize(R.styleable.SudokulayoutStyle_space,10);//图片的间距

imColumn= typedArray.getInteger(R.styleable.SudokulayoutStyle_column_image,3);//一列有几张图

width=typedArray.getDimensionPixelSize(R.styleable.SudokulayoutStyle_total_width,720);//layout的宽度

maxheight=typedArray.getDimensionPixelSize(R.styleable.SudokulayoutStyle_oneimage_maxheight,810);//单张图片最大的高度

maxwidth=typedArray.getDimensionPixelSize(R.styleable.SudokulayoutStyle_oneimage_maxwidth,810);//单张图片最大的宽度    

typedArray.recycle();}

//在这里我们看到了自定义属性。怎么设置自定义属性呢?需要在res文件中的values文件夹里创建atts.xml文件,已有的就不用创建了

//自定义属性设置完了那我们就需要对外放开一个方法加载图片

public voidsetImageData(int[] image){  //这里我传的参数是一个数组,因为我把图片放到资源文件里了,实际中我们传的会是一个集合或bean里面有图片的地址

if(image.length==0){//如果数组的长度为0则证明,没有图片,实际中可能是集合没有图片宽高为0

itemW=0;itemH=0;    }e

lse if(image.length==1){//处理图片大小不能过界

if(getImgaeWidth(this.image[0])==0|| getImgaeHeight(this.image[0])==0){ //因为我的图片在res里所以我不知道宽和高,因此我创建了两个方法获得宽高,实际中集合的bean里应该已经包含宽和高了

itemW=(width-(imColumn+1)*space)/imColumn;

itemH=(width-(imColumn+1)*space)/imColumn;        }

else{

float scaleWidth=(float) getImgaeWidth(this.image[0])/maxwidth;

float scaleHeight=(float) getImgaeHeight(this.image[0])/maxheight;

if(scaleHeight<1&& scaleWidth<1) {itemW=getImgaeWidth(this.image[0])-space*2;

itemH=getImgaeHeight(this.image[0])-space*2;            }

else{

itemW= (int) (getImgaeWidth(this.image[0])/(scaleHeight>scaleWidth?scaleHeight:scaleWidth))-space*2;

itemH= (int) (getImgaeHeight(this.image[0])/(scaleHeight>scaleWidth?scaleHeight:scaleWidth))-space*2;            }        }    }

else{

itemW=(width-(imColumn+1)*space)/imColumn;itemH=(width-(imColumn+1)*space)/imColumn;    }//设置视图宽高

if(image.length==0) {        setLayoutParams(newLinearLayout.LayoutParams(0,0));    }else if(image.length==1) {        LinearLayout.LayoutParams params=newLinearLayout.LayoutParams(itemW,itemH);        params.leftMargin= CommonUtils.dp2px(context,45);        params.topMargin=CommonUtils.dp2px(context,10);        setLayoutParams(params);    }else{//总行数introw=(image.length-1)/imColumn+1;//最大列数intcolumn=0;if(imColumn> image.length) {            column= image.length;        }else{            column=imColumn;        }//通过每个item的宽高计算出layout整体宽高  这里要注意因为这里new的是linearLayout所以使用时布局一定要是linearlayout,否则会报错LinearLayout.LayoutParams params=newLinearLayout.LayoutParams(space*(column+1)+column*itemW,space*(row+1)+row*itemH);        params.leftMargin= CommonUtils.dp2px(context,45);        params.topMargin=CommonUtils.dp2px(context,10);        setLayoutParams(params);    }//添加视图

if(image.length!=0) {//从来没有创建过

if(oldNum==0) { //oldnum是判断是否复用过

for(inti : image) {               

ImageView imageView =newImageView(context);//这里我用的是imageview,实际中可以用自己的加载图片的方法以实现各种效果如背景默认加载什么的               

 addView(imageView);            }        }

else{//新创建的比之前的要少,则减去多余的部分

if(oldNum> image.length) {              

  removeViews(image.length-1,oldNum-this.image.length);            }//新创建的比之前的要少,则添加缺少的部分

else if(oldNum< image.length) {

for(inti =0; i < image.length-oldNum; i++) {           

         ImageView imageView =newImageView(context);                  

  addView(imageView);              

  }            }        }

oldNum= image.length;    }

else{        removeAllViews();oldNum=0;    }//设置每一个图片的宽高

for(inti =0; i < getChildCount(); i++) {

final inti_=i;        ImageView imageView= (ImageView) getChildAt(i);      imageView.setImageResource(image[i]);        imageView.setOnClickListener(newOnClickListener() {@Override

public voidonClick(View v) {if(listener!=null) {listener.click(i_);                }            }        });

introw=i/imColumn+1;intcolumn=i%imColumn+1;intleft=space*column +itemW*(column-1);

inttop=space*row +itemH*(row-1);intright=left+itemW;intbottom=top+itemH;        imageView.layout(left, top, right, bottom);    }

}

//获取宽和高的方法

private intgetImgaeWidth(intid){    Bitmap bitmap = BitmapFactory.decodeResource(this.getContext().getResources(), id);intwidth = bitmap.getWidth();returnwidth;}

private intgetImgaeHeight(intid){    Bitmap bitmap = BitmapFactory.decodeResource(this.getContext().getResources(), id);intheight = bitmap.getWidth();returnheight;}

以上就是自定义的所有方法了剩下的就剩在布局中使用了

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 156,907评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,546评论 1 289
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,705评论 0 238
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,624评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,940评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,371评论 1 210
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,672评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,396评论 0 195
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,069评论 1 238
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,350评论 2 242
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,876评论 1 256
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,243评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,847评论 3 231
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,004评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,755评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,378评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,266评论 2 259

推荐阅读更多精彩内容