谷歌电子市场笔记5

按照宽高比例显示

宽度精确值, 高度=宽度/比例

    // 测量当前布局 
    @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);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值