首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

尽管调用了onDraw,但LinearLayout仍未绘制

是因为LinearLayout是一个ViewGroup,它的绘制过程需要经过measure、layout和draw三个步骤。调用onDraw只是在绘制过程的最后一步中绘制自身的内容,但在此之前,LinearLayout需要先测量子View的大小、确定子View的位置,并将子View布局到正确的位置上。

具体来说,LinearLayout的绘制过程如下:

  1. Measure(测量):在measure过程中,LinearLayout会遍历所有的子View,并调用每个子View的measure方法,测量子View的宽高。子View的measure方法会根据子View的布局参数(LayoutParams)和父View的测量要求(MeasureSpec)来计算子View的宽高。
  2. Layout(布局):在layout过程中,LinearLayout会根据子View的测量结果和自身的布局参数,确定每个子View的位置。LinearLayout会按照垂直或水平方向依次布局子View,可以通过设置LinearLayout的orientation属性来指定布局方向。
  3. Draw(绘制):在draw过程中,LinearLayout会遍历所有的子View,并调用每个子View的draw方法,将子View绘制到屏幕上。而调用LinearLayout的onDraw方法只是在绘制过程的最后一步中绘制LinearLayout自身的内容。

因此,如果只调用了LinearLayout的onDraw方法,而没有经过measure和layout步骤,LinearLayout的子View将无法正确布局和绘制,导致LinearLayout仍未绘制。

对于这个问题,可以尝试以下解决方案:

  1. 确保LinearLayout的宽高不为0:LinearLayout的宽高不能为0,否则子View无法正确布局和绘制。可以通过设置LinearLayout的布局参数(LayoutParams)来指定宽高,或者在布局文件中为LinearLayout设置固定的宽高。
  2. 确保LinearLayout的子View正确添加:在代码中,需要将子View添加到LinearLayout中,可以使用LinearLayout的addView方法将子View添加到LinearLayout中。
  3. 确保LinearLayout的measure和layout方法被调用:在调用LinearLayout的onDraw方法之前,需要确保LinearLayout的measure和layout方法被调用。可以在父View的onMeasure和onLayout方法中调用LinearLayout的measure和layout方法,或者在调用LinearLayout的onDraw方法之前手动调用LinearLayout的measure和layout方法。

腾讯云相关产品和产品介绍链接地址:

  • 腾讯云云服务器(CVM):提供弹性计算能力,满足各类业务需求。产品介绍链接
  • 腾讯云云数据库MySQL版:提供高性能、可扩展的MySQL数据库服务。产品介绍链接
  • 腾讯云对象存储(COS):提供安全、稳定、低成本的云端存储服务。产品介绍链接
  • 腾讯云人工智能(AI):提供丰富的人工智能服务,包括图像识别、语音识别、自然语言处理等。产品介绍链接
  • 腾讯云物联网(IoT):提供全面的物联网解决方案,帮助连接和管理物联网设备。产品介绍链接
  • 腾讯云移动开发平台(MTP):提供一站式移动应用开发、测试、分发和运营服务。产品介绍链接
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

自定义View简单使用

一、概述 很多初入Android开发的程序员,对于Android自定义View可能比较恐惧,这又是高手进阶的必经之路,这里先不做过多学习,只是简单了解。...自绘控件:内容都是开发者自己绘制出来的,一般在View的onDraw方法中完成绘制。 组合控件:就是将一些小的控件组合起来形成一个新的控件,这些小的控件多是系统自带的控件。...onFinishInflate():这是一个回方法,当应用从XML布局文件加载该组件并利用它 来构建界面之后,该方法将会被回。...onSizeChanged(int, int, int, int):当该组件的大小被改变时回该方法。 onDraw(Canvas):当该组件将要绘制它的内容时回该方法进行绘制。...(Canvas canvas) { super.onDraw(canvas); mPaint.setColor(Color.BLUE); // 绘制一个填充色为蓝色的矩形

67650
  • HenCoder Android 自定义 View 1-5: 绘制顺序

    其实绘制方法不是只有一个的,而是有好几个,其中 onDraw()只是负责自身主体内容绘制的。而有的时候,你想要的遮盖关系无法通过 onDraw() 来实现,而是需要通过别的绘制方法。...例如,你继承了一个 LinearLayout,重写了它的 onDraw() 方法,在 super.onDraw() 中插入了你自己的绘制代码,使它能够在内部绘制一些斑点作为点缀: public class...对于上面这个例子来说,就是你的 LinearLayout 会在绘制完斑点后再去绘制它的子 View。那么在子 View 绘制完成之后,先前绘制的斑点就被子 View 盖住了。...回到刚才的问题:怎样才能让 LinearLayout绘制内容盖住子 View 呢?只要让它的绘制代码在子 View 的绘制之后再执行就好了。...)的绘制不会这几项全都包含,必然逃不出这几项,并且一定会严格遵守这个顺序。

    81030

    android自定义控件一站式入门

    理解onDraw方法 控件绘制其内容是在onDraw方法中进行的,方法原型: protected void onDraw(Canvas canvas); Canvas类表示画布:它定义了一系列方法用来绘制文本...draw方法本身做了一些统一操作,它内部调用了onDraw方法,前面已经接触了onDraw方法。所有View子类在onDraw方法中完成自身显示内容的绘制。 View子类几乎都有它的绘制逻辑。...用户操作最后被转变为不同的事件,它们触发各种回方法。然后我们可以重写这些回方法来响应用户。...(这是API 11中View类引入的方法,之前的版本可以通过canvas.rotate完成,这样的话操作就需要在onDraw中执行,为了通知系统执行某个View的onDraw方法,执行View.invalidate...转动动画的值的计算是Scroller完成的,这里使用ValueAnimator来获得每一帧的回。 在解决了如何实现让PieView不断绘制的问题后,下一个要解决的是每次绘制多少度的问题。

    1.8K50

    Android开发之漫漫长途 番外篇——自定义View的各种姿势1

    该系列引用了《Android开发艺术探索》以及《深入理解Android 卷Ⅰ,Ⅱ,Ⅲ》中的相关知识,另外也借鉴了其他的优质博客,在此向各位大神表示感谢,膜拜!!!...上篇文章中我们详细讲解了ViewRootImpl,我们知道了其5大过程,知道了View的测量、布局以及绘制。那么这些知识对我们有何用处呢。...PhoneWindow,然后会回我们MainActivity的onCreate函数,我们在MainActivity的onCreate函数中调用了setContentView(R.layout.activity_main1...,在这些工作的过程中会依次回我们在View以及其子类中重写的onMeasure、onLayout、onDraw等方法。...以我们上面的CircleView为例,,我们在布局文件中定义了一个LinearLayout并在LinearLayout内使用了我们自定义的CircleView,那么按照上一章讲解ViewRootImpl

    77210

    android自定义控件一站式入门

    理解onDraw方法 控件绘制其内容是在onDraw方法中进行的,方法原型: protected void onDraw(Canvas canvas); Canvas类表示画布:它定义了一系列方法用来绘制文本...draw方法本身做了一些统一操作,它内部调用了onDraw方法,前面已经接触了onDraw方法。所有View子类在onDraw方法中完成自身显示内容的绘制。 View子类几乎都有它的绘制逻辑。...用户操作最后被转变为不同的事件,它们触发各种回方法。然后我们可以重写这些回方法来响应用户。...(这是API 11中View类引入的方法,之前的版本可以通过canvas.rotate完成,这样的话操作就需要在onDraw中执行,为了通知系统执行某个View的onDraw方法,执行View.invalidate...转动动画的值的计算是Scroller完成的,这里使用ValueAnimator来获得每一帧的回。 在解决了如何实现让PieView不断绘制的问题后,下一个要解决的是每次绘制多少度的问题。

    1.7K00

    Android自定义控件实现带文字提示的SeekBar

    this.mIndicatorSeekBarChangeListener = listener; } /** * 进度监听 */ public interface OnIndicatorSeekBarChangeListener { /** * 进度监听回...方法: @Override protected synchronized void onDraw(Canvas canvas) { super.onDraw(canvas); String progressText...轴坐标可以这样计算【控件高度 / 2 + 文字高度 / 2】(getHeight() / 2f + mProgressTextRect.height() / 2f),注意drawText方法默认是从左下角开始绘制文字的...,如果对绘制文字还不太了解,可以看下这篇文章《Android 图解Canvas drawText文字居中的那些事》 指示器跟随滑块移动 在IndicatorSeekBar中,向外提供了一个setOnSeekBarChangeListener...方法用来回SeekBar的状态,其中onProgressChanged方法中的indicatorOffset参数就是指示器控件的X坐标,计算方式与上文中进度百分比文字的计算方式一致: // 【总宽度

    2.3K10

    【Android 应用开发】自定义View 和 ViewGroup

    protected void onFinishInflate() 回方法, 从XML布局中加载该重写的View组件的时候, 就会回这个方法; (3)测量方法 protected void onMeasure...自定义View 自定义一个View组件铺满全屏, 在绘制该View组件的时候, 在onDraw()方法中根据一个xy坐标绘制一个小球; 这个xy坐标在触摸回方法onTouchEvent()方法中动态改变..., 当检测到触摸位置发生改变, 那么就重新给xy坐标赋值, 并且调用invalidate()方法重绘该组件, invalidate()方法执行后, 会回onDraw()方法; public class...ViewGroup有View的一切属性, 可以当做View来使用, ViewGroup主要是当做容器使用; View是小控件widget和容器组件ViewGroup的父类, ViewGroup是布局如LinearLayout...ViewGroup可以无限嵌套; View和ViewGroup关系图解 :  抽象类 : ViewGroup是一个抽象类, 作为容器的类通常是ViewGroup的子类; ViewGroup子类对象有 : LinearLayout

    50320

    Android性能优化系列之布局优化

    ,不必要的节点和嵌套可通过hierarchy viewer(下面布局优工具中有具体介绍)或设置->开发者选项->显示布局边界查看。...分析到activity_main.xml的布局文件时,发现这里使用了多个嵌套的LinearLayout布局,而且每个LinearLayout都会使用一次android:background设置一次自己的背景颜色...,这时发现文本框布局已经不再是红色了 咋看之下一切都很完美,其实整个ui其实还含有一个隐含的绘制效果,那边是在activity中,使用setContentView(R.layout.activity_main...继续研究,发现过度绘制问题是由于OverDrawView类中的ondraw方法中多次绘制了矩形导致的,代码如下: @Override protected void onDraw(Canvas canvas...其他的矩形也是同样的道理,因此更改这里的代码为: @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas);

    1K20

    Android 中为RecyclerView控件添加分隔线

    ,这个方法会在RecyclerView中的子项绘制完成之前被调用 @Override public void onDraw(Canvas c, RecyclerView parent,...RecyclerView.State state) { super.onDraw(c, parent, state); } // 也可以在这个方法中绘制分隔线,这个方法会在...我们对布局方向进行判断,由此来调用正确的分隔线绘制方法 @Override public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State...我们注意到这里的分隔线使用了我们自定义的资源,因此,我们要在drawable文件夹中新建一个资源文件my_list_divider.xm: <?...在MainActivity中加了一个网格布局,并且设置排布方向和每一行显示的子项数,之后调用了MyItemDecoration的第二个适用于网格布局的构造方法。

    2.1K10

    Android视图绘制流程完全解析,带你一步步深入了解View(二)

    这些控件虽然是Android系统本身就提供好的,我们只需要拿过来使用就可以了,你知道它们是怎样被绘制到屏幕上的吗?多知道一些总是没有坏处的,那么我们赶快进入到本篇文章的正题内容吧。...接下来的第三步是在第34行执行的,这一步的作用是对视图的内容进行绘制。可以看到,这里去调用了一下onDraw()方法,那么onDraw()方法里又写了什么代码呢?进去一看你会发现,原来又是个空方法啊。...第三步完成之后紧接着会执行第四步,这一步的作用是对当前视图的所有子视图进行绘制如果当前的视图没有子视图,那么也就不需要进行绘制了。...绘制的方式主要是借助Canvas这个类,它会作为参数传入到onDraw()方法中,供给每个视图使用。...Paint就像是一个画笔一样,配合着Canvas就可以进行绘制了。这里我们的绘制逻辑比较简单,在onDraw()方法中先是把画笔设置成黄色,然后调用Canvas的drawRect()方法绘制一个矩形。

    1.5K80

    自定义View学习——三种实现方式

    可以继承TextView,ImageView,LinearLayout等。...,以及View的测量、布局、绘制等。...postInvalidate()和invadite()刷新控件的区别,这里简单说一下:invadite()必须在主线程中调用,而postInvalidate()内部是由Handler的消息机制实现的,所以在任何线程都可以调用,实时性没有...2、onDraw、dispatchDraw区别           onDraw()的意思是绘制视图自身,dispatchDraw()是绘制子视图,无论是View还是ViewGroup对它们俩的调用顺序都是...()的含义是绘制子控件,所以原则来上讲,在绘制View控件时,我们是重写onDraw()函数 得出结论:在绘制View控件时,需要重写onDraw()函数,在绘制ViewGroup时,需要重写dispatchDraw

    75530

    【Android 性能优化】布局渲染优化 ( 过渡绘制 | 背景设置产生的过度绘制 | Android 系统的渲染优化 | 自定义布局渲染优化 )

    背景设置产生的过度绘制 : ① 组件背景 : 每个组件每设置一次背景 , 该组件的区域就会增加一层绘制 , 如 LinearLayout 线性布局设置背景颜色 , TextView 设置背景颜色 , 都会增加该组件区域内的过渡绘制...Android 7.0 之后的优化机制 Android 7.0 之后的优化机制 : ① 7.0 系统优化前 : Android 7.0 之前调用 UI 组件的 invalidate 方法 , 组件会回...onLayout , onMeasure 和 onDraw 方法 ; ② 7.0 系统优化后 : Android 7.0 之后调用 UI 组件的 invalidate 方法 , 组件不会回 onLayout...自定义组件过度绘制问题描述 : 自定义控件 , 在自定义的 onDraw 方法中 , 绘制多张图片 , 如果图片之间产生重叠 , 重叠绘制的部分就出现了过度绘制 ; 2....实现上述图片 A 在 Canvas 画布上绘制部分图片方式 : ① 完整画布 : onDraw 函数中的 Canvas canvas 参数是完整的画布 ; ② 取出图片 A 绘制部分的 Canvas

    4.6K30

    Android 自定义View之边缘凹凸的优惠券效果的开发过程

    本篇文章讲的是自定义View之边缘凹凸的优惠券效果,之前有见过很多优惠券的效果都是使用了边缘凹凸的样式。和往常一样,主要总结一下在自定义View的开发过程中需要注意的一些地方。...(Canvas canvas) { super.onDraw(canvas); Log.d("mDebug", "onDraw"); } } 输出如下: 09-27 15:29:31.957...(Canvas canvas):负责将View绘制在屏幕上 三、View 的几个构造函数 1、public CouponDisplayView(Context context) — Java代码直接...()方法,简单的根据circleNum的数量将一个一个的圆绘制在屏幕上就可以了 @Override protected void onDraw(Canvas canvas) { super.onDraw...getHeight(), radius, mPaint); } } 这里remain/2是因为避免有一些情况:当计算出来的圆的数量不是整除时,这样就会出现右边最后一个间距会比其它的间距都要宽,所以我们在绘制第一个的时候加上了余下的间距的一半

    54600

    View 的绘制过程

    :测量、布局、绘制 分别对应了:onMeasure() onLayout() onDraw 当然这个过程中也会调用许多其他的方法,都是作为辅助,大的流程就这三步。...LinearLayout 是这样做的,当然我们可以根据我们想要的布局来进行自定义。...绘制 onDraw onDraw() 函数就是来绘制了,一般 ViewGroup 不会实现内部的方法,子控件才重写 onDraw() 方法。也是内部一层层分发绘制。...可以认为这三个方法内部调用了上面的方法。 上面 onMeaure onLayout onDraw() 都介绍完了,那么最根处的 View 是怎么调用的呢? ?...然后 draw() 的内部的执行就和上面介绍 onDraw() 中一样了 到此整个页面的测量、布局、绘制就全部分析完毕了。 可以查看:Activity 从启动到布局绘制的简单分析

    63020
    领券