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

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

在Android开发中,onDraw 方法是用于自定义视图绘制的关键方法。然而,仅仅调用 onDraw 并不一定能确保视图被正确绘制。以下是一些可能导致 LinearLayout 未绘制的原因及其解决方法:

基础概念

  1. 视图绘制流程
    • measure:测量视图的大小。
    • layout:确定视图的位置。
    • draw:实际绘制视图。
  • onDraw 方法
    • 这是一个回调方法,当视图需要被绘制时,系统会自动调用它。
    • 通常在这个方法中进行自定义绘制操作。

可能的原因及解决方法

1. 视图未被正确添加到布局中

确保 LinearLayout 已经被正确添加到一个父布局中,并且这个父布局已经被添加到当前活动的视图中。

代码语言:txt
复制
LinearLayout linearLayout = new LinearLayout(this);
linearLayout.setLayoutParams(new LinearLayout.LayoutParams(
        LinearLayout.LayoutParams.MATCH_PARENT,
        LinearLayout.LayoutParams.MATCH_PARENT));
setContentView(linearLayout);

2. 视图的可见性设置为 GONE 或 INVISIBLE

检查 LinearLayout 的可见性设置,确保它不是 GONEINVISIBLE

代码语言:txt
复制
linearLayout.setVisibility(View.VISIBLE);

3. 没有正确重写 onDraw 方法

如果你重写了 onDraw 方法,确保你调用了 super.onDraw(canvas),否则可能会导致视图无法正常绘制。

代码语言:txt
复制
@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    // 自定义绘制代码
}

4. 布局参数问题

确保 LinearLayout 的布局参数设置正确,特别是宽度和高度。

代码语言:txt
复制
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
        LinearLayout.LayoutParams.MATCH_PARENT,
        LinearLayout.LayoutParams.WRAP_CONTENT);
linearLayout.setLayoutParams(params);

5. 强制重绘

如果上述方法都无效,可以尝试强制重绘视图。

代码语言:txt
复制
linearLayout.invalidate();

应用场景

  • 自定义视图:当你需要创建一个具有特殊绘制逻辑的自定义视图时。
  • 动画效果:在实现复杂的动画效果时,可能需要手动控制视图的绘制过程。

示例代码

以下是一个简单的示例,展示如何正确设置和绘制一个 LinearLayout

代码语言:txt
复制
public class CustomLinearLayout extends LinearLayout {

    public CustomLinearLayout(Context context) {
        super(context);
        init();
    }

    public CustomLinearLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    private void init() {
        setLayoutParams(new LinearLayout.LayoutParams(
                LinearLayout.LayoutParams.MATCH_PARENT,
                LinearLayout.LayoutParams.MATCH_PARENT));
        setVisibility(View.VISIBLE);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        // 自定义绘制代码
        Paint paint = new Paint();
        paint.setColor(Color.RED);
        canvas.drawRect(0, 0, getWidth(), getHeight(), paint);
    }
}

Activity 中使用这个自定义视图:

代码语言:txt
复制
public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        CustomLinearLayout customLinearLayout = new CustomLinearLayout(this);
        setContentView(customLinearLayout);
    }
}

通过以上步骤,你应该能够解决 LinearLayout 未绘制的问题。如果问题依然存在,建议检查是否有其他代码或布局文件影响了视图的绘制过程。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

自定义View简单使用

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

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

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

    81530

    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

    78010

    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.9K50

    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 应用开发】自定义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

    55020

    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

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

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

    76330

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

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

    1.5K80

    Android查缺补漏(View篇)--自定义 View 的基本流程

    draw:对应 onDraw(),绘制View。在自定义 View 时我们也正是在 onDraw() 方法内可以在 Canvas 画布上随心所欲的画出我们想要的 View。...自定义 View 自定义 View 的方式不止一种,可以直接继承 View,重写 onDraw() 方法,也可以直接继承 ViewGroup,还可以继承现有的控件(如:TextView、LinearLayout...直接继承 View 来实现自定义 View 的这种方式比较灵活,可以实现很多复杂的效果,这种方式最关键的步骤就是重写 onDraw() 方法,通过 Paint 画笔等工具在 Canvas 画布上进行各种图案的绘制以达到我们想要的效果...但 padding 就不同了,是内间距,需要我们在控件的内部做处理才能让布局文件中对控件设置的 padding 生效。...在上面代码中通知 View 重绘时使用了 invalidate() 方法,其实 postInvalidate() 也可以通知 View 重绘,那么这两者有什么区别呢?

    858100

    View 的绘制过程

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

    63520

    【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.7K30

    教你搞定Android自定义View

    View绘制过程 View的绘制可以分为下面三个过程: Measure View会先做一次测量,算出自己需要占用多大的面积。...同样View给我们暴露了onDraw方法 protected void onDraw(Canvas canvas) { } 默认View类的onDraw没有一行代码,但是提供给我们了一张空白的画布...的代码写在第三个构造方法里面,但是我RainbowBar在线性布局中没有加style属性(),那按照我们上面的解释,inflate布局时应该会invoke第二个构造方法啊,但是我们在第二个构造方法里面调用了第三个构造方法...> 其实就是调用canvas的drawLine方法,然后每次将draw的起点向前推进,在方法的结尾,我们调用了invalidate方法,上面我们已经说明了,这个方法会让View重新调用onDraw方法,...所以就达到我们的进度条一直在向前绘制的效果。

    53570

    笔记——自定义View(三)

    MeausreSpec2.png ViewGroup的measure()-->onMeasure(),ViewGroup的onMeasure()是抽象方法,但其提供了measureChildren(),...如下:由变量w,h来控制绘制结束的矩形dst右下角终点坐标,矩形dst的区域显示图片资源 protected void onDraw(Canvas canvas) { super.onDraw(canvas...8、View绘制分三个步骤,顺序是:onMeasure,onLayout,onDraw。...经代码亲测,log输出显示:调用invalidate方法只会执行onDraw方法;调用requestLayout方法只会执行onMeasure方法和onLayout方法,并不会执行onDraw方法。...9、如若非使用Relativelayout,一般自定义组件的时候不会去基础RelativeLayout,因为它会进行两次绘制;故在能实现相同功能需求时更多的使用LinearLayout和FrameLayout

    48930

    自定义View | 基础概述 & 自定义TextView实战 & 基于源码分析自定义View继承自ViewGroup时无法正常绘制的问题

    . */ public static final int AT_MOST = 2 << MODE_SHIFT; onDraw()简述 主要用来绘制效果,利用参数...--style="@style/cstyle" />--> LinearLayout> 在Java逻辑中,编写自定义View的逻辑: 【注意三个构造函数的调用技巧, 把前两个改成this,使得始终调用第三个构造函数...()),下面究其原因 我们自定义TextView的时候是extends View去做的, 如果extends LinearLayout等ViewGroup、 且没有设置自定义TextView的background...的话,【有background还是可以绘制】 自定义TextView就无法正常绘制【不会调用onDraw()方法】; 由下面源码, // Step 3, draw the content if...public class TextView extends LinearLayout { ...

    1.1K30
    领券