Android案例自定义布局展开收起

本文介绍如何在Android中实现自定义布局的展开和收起功能。通过自定义ReceivingLinearLayout,结合XML布局和Java代码,实现点击触发布局的显示与隐藏效果。
摘要由CSDN通过智能技术生成

Android案例自定义布局展开收起

效果:
在这里插入图片描述
点击展开后:
在这里插入图片描述
代码:
先自定义一个ReceivingLinearLayout文件继承LinearLayout布局

public class ReceivingLinearLayout extends LinearLayout {
   

    /**
     * 折叠按钮图标
     */
    private ImageView mExpandBtn;
    private TextView ExpandBtn;

    /**
     * 是否折叠的临界高度
     */
    private int mLimitHeight = 200;

    /**
     * 是否展开了
     */
    private boolean mIsExpand = false;

    /**
     * 是否支持展开折叠功能
     */
    private boolean mSupportExpand = true;

    public ReceivingLinearLayout(Context context) {
   
        this(context, null);
    }

    public ReceivingLinearLayout(Context context, @Nullable AttributeSet attrs) {
   
        this(context, attrs, 0);
    }

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

    /**
     * 初始化
     */
    public void init() {
   
        setOrientation(VERTICAL);
    }


    /**
     * 重写onMeasure动态控制控件的高度
     *
     * @param widthMeasureSpec
     * @param heightMeasureSpec
     */
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
   
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);

        //获取自身的测量高度
        int measureHeight = getMeasuredHeight();

        //设置折叠按钮是否显示
        setExpandBtnVisiable(measureHeight <= mLimitHeight ? View.GONE : View.VISIBLE);

        //如果不支持折叠或者需要展开或者高度不到折叠高度,就保持默认测量
        if (!mSupportExpand || mIsExpand || measureHeight <= mLimitHeight) {
   
            return;
        }

        //重新设置高度测量参数
        heightMeasureSpec = MeasureSpec.makeMeasureSpec(mLimitHeight, MeasureSpec.EXACTLY);

        //重新测量
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }

    /**
     * 绑定展开折叠按钮图标
     *
     * @param view
     * @param expandRes
     * @param foldRes
     */
    public void bindExpandButton(ImageView view, TextView textView ,final int expandRes, final int foldRes) {
   
        mExpandBtn = view;
        ExpandBtn = textView;
        if (textView == null) {
   
            return;
        }
        textView.setOnClickListener(new OnClickListener() {
   
            @Override
            public void onClick(View v) {
   
                setIsExpand(!mIsExpand);
                mExpandBtn.setImageResource(mIsExpand ? foldRes : expandRes);
                ExpandBtn.setText(mIsExpand ? "收起":"展开");
            }
        });
        setExpandBtnVisiable(GONE);
    }

    /**
     * 获取临界折叠高度
     *
     * @return
     */
    public int getLimitHeight() {
   
        return mLimitHeight;
    }

    /**
     * 设置临界折叠高度
     *
     * @param limitHeight
     */
    public void setLimitHeight(int limitHeight) {
   
        this.mLimitHeight = limitHeight;
    }

    /**
     * 获取是否展开了
     *
     * @return
     */
    public boolean isIsExpand() {
   
        return mIsExpand;
    }

    /**
     * 设置是否展开
     *
     * @param isExpand
     */
    public void setIsExpand(boolean isExpand) {
   
        this.mIsExpand = isExpand;
        requestLayout();
    }

    /**
     * 获取当前是否支持折叠展开功能
     *
     * @return
     */
    public boolean isSupportExpand() {
   
        return mSupportExpand;
    }

    /**
     * 设置折叠还是展开
     *
     * @param supportExpand
     */
    public void setSupportExpand(boolean supportExpand) {
   
        this.mSupportExpand = supportExpand;
        setExpandBtnVisiable(GONE);
    }

    /**
     * 设置折叠图标是否显示
     *
     * @param visiable
     */
    private void setExpandBtnVisiable(int visiable) {
   
        if (mExpandBtn != null) {
   
            if (!mSupportExpand) {
   
                mExpandBtn
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值