ScrollView和HorizontalScrollView中添加的自定义View控件无法显示问题

自定义View在ScrollView或HorizontalScrollView中无法显示通常与onMeasure方法的实现有关。重写onMeasure时需关注MeasureSpec的MODE值,确保在MODE为UNSPECIFIED时正确设置控件尺寸。忽视此值可能导致自定义View大小为0,从而消失。

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

一般自定义View控件,都要重写onMeasure(int widthMeasureSpec, int heightMeasureSpec)和onDraw(Canvas canvas)两个方法,其中onMeasure方法的作用是计算控件的大小,onDraw方法的作用是显示控件的内容。
因为onDraw方法网上都有很多教程,所以本文不讲。本文重点讲解的是onMeasure这个实用性很强,但又容易出现错误的方法。
重写onMeasure方法的有以下几个步骤:
1、获得控件宽度(width)的MODE值
2、根据MODE值获得width的大小
3、获得控件高度(height)的MODE值
4、根据MODE值获得height的大小
5、设置控件大小

@Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        // TODO Auto-generated method stub
        int width = 0;
        int height = 0;
        //获得宽度MODE
        int modeW = MeasureSpec.getMode(widthMeasureSpec);
        //获得宽度的值
        if (modeW == MeasureSpec.AT_MOST) {
            width = MeasureSpec.getSize(widthMeasureSpec);
        }
        if (modeW == MeasureSpec.EXACTLY) {
            width = widthMeasureSpec;
        }
        if (modeW == MeasureSpec.UNSPECIFIED) {
            width = 600;
        }
        //获得高度MODE
        int modeH = MeasureSpec.getMode(height);
        //获得高度的值
        if (modeH == MeasureSpec.AT_MOST) {
            height = MeasureSpec.getSize(heightMeasureSpec);
        }
        if (modeH == MeasureSpec.EXACTLY) {
            height = heightMeasureSpec;
        }
        if (modeH == MeasureSpec.UNSPECIFIED) {
            //ScrollView和HorizontalScrollView
            height = 400;
        }
        //设置宽度和高度
        setMeasuredDimension(width, height);
    }

很多人在重写onMeasure的时候,容易忽略MODE=MeasureSpec.UNSPECIFIED这个值,而忽略给width和height市值值了,以致控件在放置Scrollview和HorizontalScrollView控件的时候,自定义View就无法显示了,出现这个的原因是,自定义View的控件值一直是0,所以自定义View的大小是0,就理所当然的消失了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值