自定义view梯形布局

本文介绍了一个自定义的Android布局组件MyView及其子组件MyTitle,通过重写onMeasure和onLayout方法实现了特定的布局逻辑。MyTitle包含标题和按钮,并在点击按钮时动态添加TextView。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package com.example.dell.zhoukaomoni;

import android.content.Context;
import android.util.DisplayMetrics;

/**
 * Created by DELL on 2018/6/9.
 */

public class AppUtils {
    public static int screenWidth(Context context){
        DisplayMetrics metrics = context.getResources().getDisplayMetrics();
        return  metrics.widthPixels;
    }

}

package com.example.dell.zhoukaomoni;

import android.content.Context;
import android.graphics.Color;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;

/**
 * Created by DELL on 2018/6/9.
 */

public class MyTitle extends LinearLayout implements View.OnClickListener {

    private TextView title;
    private Button add;
    int context=0;
    public MyTitle(Context context) {
        super(context);
        initView(context,null);
    }

    public MyTitle(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        initView(context,attrs);
    }

    private void initView(Context context, AttributeSet attrs) {
        View view=inflate(context,R.layout.title_view,this);
        title = view.findViewById(R.id.tv_title);
        add = view.findViewById(R.id.btn_add);
        title.setOnClickListener(this);
        add.setOnClickListener(this);
        if (attrs==null){
            return;
        }
    }

    public MyTitle(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    public void onClick(View v) {
        String content="";
        if (v.equals(title)){

        }else if (v.equals(add)){
            context++;

               TextView textView = new TextView(v.getContext());
                int width=AppUtils.screenWidth(v.getContext());
            MyView cc = findViewById(R.id.cc);
            textView.setWidth(width/2);
                textView.setHeight(100);
                textView.setText(""+context);
                textView.setGravity(Gravity.CENTER);
                textView.setTextColor(Color.BLUE);
                textView.setBackgroundColor(Color.YELLOW);
                cc.addView(textView);

            }
    }
}
package com.example.dell.zhoukaomoni;

import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;

/**
 * Created by DELL on 2018/6/9.
 */

public class MyView extends ViewGroup {

    public MyView(Context context) {
        super(context);
    }

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

    public MyView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        measureChildren(widthMeasureSpec, heightMeasureSpec);
        int widthSize = MeasureSpec.getSize(widthMeasureSpec);
        int widthMode = MeasureSpec.getMode(widthMeasureSpec);
        int heightSize = MeasureSpec.getSize(heightMeasureSpec);
        int heightMode = MeasureSpec.getMode(heightMeasureSpec);

        int width = 0;
        int height = 0;
        int linewidth = 0;
        int lineheight = 0;
        int totalheight = 0;
        View childView;
        int childwidth = 0;
        int childheight = 0;
        for (int i=0; i<getChildCount(); i++ ){
            childView = getChildAt(i);
            childwidth = childView.getMeasuredWidth();
//            if (childwidth>widthSize){
//
//            }
            childheight=childView.getMeasuredHeight();
            if (linewidth+childwidth>widthSize){
                width = widthSize;
                linewidth=childwidth;
                totalheight+= lineheight = Math.max(lineheight,childheight);
            }else{
                linewidth += childwidth;
                totalheight+= lineheight = Math.max(lineheight,childheight);

                width = Math.max(width,linewidth);
            }
            if (i== getChildCount()-1){
                totalheight += lineheight;
                height = totalheight;
            }
        }
        width = widthMode == MeasureSpec.EXACTLY ? widthSize:width;
        height = heightMode == MeasureSpec.EXACTLY ? heightSize:height;
        setMeasuredDimension(width,height);


    }

    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        int linewidth = 0;
        int lineheight = 0;
        int totalheight = 0;
        View childView;
        int childwidth = 0;
        int childheight = 0;
        for(int i=0;i<getChildCount();i++){
            childView = getChildAt(i);
            childwidth = childView.getMeasuredWidth();
            childheight = childView.getMeasuredHeight();
            if (linewidth + childwidth>getMeasuredWidth()){


                LayoutChildView(childView, 0,totalheight, childwidth, totalheight + childheight);
                linewidth=childwidth;
                totalheight+=childheight;
            }else{


                LayoutChildView(childView, linewidth,totalheight,linewidth + childwidth, totalheight + childheight);
                totalheight+=childheight;
                linewidth+=childwidth;
            }
        }

    }

    private void LayoutChildView(View childView, int l, int t, int r, int b) {
        childView.layout(l,t,r,b);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值