按照宽高比例显示
宽度精确值, 高度=宽度/比例
// 测量当前布局
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
//widthMeasureSpec 宽度的规则 包含了两部分 模式 值
int widthMode = MeasureSpec.getMode(widthMeasureSpec); // 模式
int widthSize = MeasureSpec.getSize(widthMeasureSpec);// 宽度大小
int width=widthSize-getPaddingLeft()-getPaddingRight();// 去掉左右两边的padding
int heightMode = MeasureSpec.getMode(heightMeasureSpec); // 模式
int heightSize = MeasureSpec.getSize(heightMeasureSpec);// 高度大小
int height=heightSize-getPaddingTop()-getPaddingBottom();// 去掉上下两边的padding
if(widthMode==MeasureSpec.EXACTLY&&heightMode!=MeasureSpec.EXACTLY){
// 修正一下 高度的值 让高度=宽度/比例
height=(int) (width/ratio+0.5f); // 保证4舍五入
}else if(widthMode!=MeasureSpec.EXACTLY&&heightMode==MeasureSpec.EXACTLY){
//由于高度是精确的值 ,宽度随着高度的变化而变化
width=(int) ( (height*ratio)+0.5f);
}
// 重新制作了新的规则
widthMeasureSpec=MeasureSpec.makeMeasureSpec(MeasureSpec.EXACTLY, width+getPaddingLeft()+getPaddingRight());
heightMeasureSpec=MeasureSpec.makeMeasureSpec(MeasureSpec.EXACTLY, height+getPaddingTop()+getPaddingBottom());
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
CategoryAdapter
@Override
public int getViewTypeCount() {
return super.getViewTypeCount() + 1; // 又额外多了一种条目类型 现在又三种 1 标题 2 内容 3 加载更多(没有显示)
}
@Override
protected int getInnerItemViewType(int position) {
if (datas.get(position).isTitle()) {
return ITEM_TITLE;
} else {
return super.getInnerItemViewType(position);
}
}
// 实现每个条目的界面
@Override
protected BaseHolder<CategoryInfo> getHolder() {
if (!datas.get(position).isTitle()) {
return new CategoryContentHolder();
}else{
return new CategoryTitleHolder();
}
}
自定义控件
第一步测量
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int widthMode = MeasureSpec.getMode(widthMeasureSpec);
int heightMode = MeasureSpec.getMode(heightMeasureSpec); // 获取当前父容器(Flowlayout)的模式
int width = MeasureSpec.getSize(widthMeasureSpec);
int height = MeasureSpec.getSize(heightMeasureSpec); // 获取到宽和高
int childeWidthMode;
int childeHeightMode;
// 为了测量每个孩子 需要指定每个孩子测量规则
childeWidthMode=widthMode==MeasureSpec.EXACTLY?MeasureSpec.AT_MOST:widthMode;
childeHeightMode=heightMode==MeasureSpec.EXACTLY?MeasureSpec.AT_MOST:heightMode;
int childWidthMeasureSpec=MeasureSpec.makeMeasureSpec(childeWidthMode, width);
int childHeightMeasureSpec=MeasureSpec.makeMeasureSpec(childeHeightMode, height);
for(int i=0;i<getChildCount();i++) {
View child=getChildAt(i);
// 测量每个孩子
child.measure(childWidthMeasureSpec, childHeightMeasureSpec);
}