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);
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。