Android自定义ViewGroup横向布局(1)
最近学习自定义viewgroup,我的目标是做一个可以很想滚动的listview,使用adapter填充数据,并且使用adapter.notifyDataSetChanged()更新数据。
不过一口吃不成一个胖子(我吃成这样可是好几年的积累下来的~~~~),我们一步一步来,这篇笔记首先写一个横向的布局。
代码:
packagecom.example.libingyuan.horizontallistview.ScrollViewGroup; importandroid.content.Context; importandroid.util.AttributeSet; importandroid.view.View; importandroid.view.ViewGroup; /** *自定义ViewGroup *很简单的横向布局,把所有的子View都横着排列起来,不可滚动 */ publicclassScrollViewGroupextendsViewGroup{ publicScrollViewGroup(Contextcontext){ this(context,null); } publicScrollViewGroup(Contextcontext,AttributeSetattrs){ this(context,attrs,0); } publicScrollViewGroup(Contextcontext,AttributeSetattrs,intdefStyleAttr){ super(context,attrs,defStyleAttr); } @Override protectedvoidonMeasure(intwidthMeasureSpec,intheightMeasureSpec){ //重新设置宽高 this.setMeasuredDimension(measureWidth(widthMeasureSpec,heightMeasureSpec),measureHeight(widthMeasureSpec,heightMeasureSpec)); } /** *测量宽度 */ privateintmeasureWidth(intwidthMeasureSpec,intheightMeasureSpec){ //宽度 intsizeWidth=MeasureSpec.getSize(widthMeasureSpec); //宽度的类型 intmodeWidth=MeasureSpec.getMode(widthMeasureSpec); //父控件的宽(wrap_content) intwidth=0; //子View的个数 intchildCount=getChildCount(); //重新测量子view的宽度,以及最大高度 for(inti=0;i<childCount;i++){ //获取子View Viewchild=getChildAt(i); //测量子View,无论什么模式,这句必须有否则界面不显示子View(一片空白) measureChild(child,widthMeasureSpec,heightMeasureSpec); //得到子View的边距 MarginLayoutParamslp=(MarginLayoutParams)child.getLayoutParams(); //得到宽度 intchildWidth=child.getMeasuredWidth()+lp.leftMargin+lp.rightMargin; //宽度累加 width+=childWidth; } //返回宽度 returnmodeWidth==MeasureSpec.EXACTLY?sizeWidth:width; } /** *测量高度 */ privateintmeasureHeight(intwidthMeasureSpec,intheightMeasureSpec){ //高度 intsizeHeight=MeasureSpec.getSize(heightMeasureSpec); //高度的模式 intmodeHeight=MeasureSpec.getMode(heightMeasureSpec); //父控件的高(wrap_content) intheight=0; //子View的个数 intchildCount=getChildCount(); //重新测量子view的宽度,以及最大高度 for(inti=0;i<childCount;i++){ //得到子View Viewchild=getChildAt(i); //测量 measureChild(child,widthMeasureSpec,heightMeasureSpec); //得到边距 MarginLayoutParamslp=(MarginLayoutParams)child.getLayoutParams(); //得到高度 intchildHeight=child.getMeasuredHeight()+lp.topMargin+lp.bottomMargin; //累加高度 height+=childHeight; } //求平均高度 height=height/childCount; //返回高度 returnmodeHeight==MeasureSpec.EXACTLY?sizeHeight:height; } @Override protectedvoidonLayout(booleanchanged,intl,intt,intr,intb){ intchildLeft=0;//子View左边的距离 intchildWidth;//子View的宽度 intheight=getHeight(); intchildCount=getChildCount(); for(inti=0;i<childCount;i++){ Viewchild=getChildAt(i); MarginLayoutParamslp=(MarginLayoutParams)child.getLayoutParams(); childWidth=child.getMeasuredWidth()+lp.leftMargin+lp.rightMargin; //最主要的一句话 child.layout(childLeft,0,childLeft+childWidth,height); childLeft+=childWidth; } } @Override publicLayoutParamsgenerateLayoutParams(AttributeSetattrs){ returnnewMarginLayoutParams(getContext(),attrs); } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。