简述Requestlayout,onlayout,onDraw,DrawChild区别与联系 ?

参考回答:

requestLayout()onLayout()onDraw()drawChild() 是Android视图的生命周期方法,它们的功能和调用时机有所不同:
requestLayout():请求视图重新布局,通常用于视图的尺寸或位置发生变化时。
onLayout():在布局过程中,父视图用来测量并定位其子视图的位置和尺寸。
onDraw():视图的绘制方法,用于绘制视图的内容,如背景、文本、图形等。
drawChild():在父视图的onDraw()中调用,用于绘制子视图的内容。

详细讲解与拓展:

1. requestLayout()

  • 功能requestLayout()用于请求视图重新布局,它会触发父视图的onLayout()方法。在视图的尺寸或位置发生变化时,调用此方法来通知系统重新测量和布局该视图。
  • 调用时机:当视图的大小、位置或其他布局相关的属性发生变化时,调用requestLayout()请求重新布局。它会在下一轮布局周期中触发onLayout()方法。

    示例

    myView.requestLayout();
    
    Java

2. onLayout()

  • 功能onLayout()ViewGroup类的核心方法,用于测量并确定子视图的位置和大小。它会在视图的布局阶段被调用,父视图通过该方法布局其子视图。
  • 调用时机onLayout()requestLayout()方法调用后被触发,用于为每个子视图计算并设置它们的位置。

    示例

    @Override
    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
      // 布局子视图
      childView.layout(left, top, right, bottom);
    }
    
    Java

3. onDraw()

  • 功能onDraw()View的绘制方法,用于在视图的画布上绘制内容。它主要通过Canvas对象绘制各种图形,如背景、文本、图片等。
  • 调用时机onDraw()会在视图绘制阶段被调用,一般是在视图完成布局后执行。当视图需要更新显示内容时,系统会调用onDraw()进行绘制。

    示例

    @Override
    protected void onDraw(Canvas canvas) {
      super.onDraw(canvas);
      // 绘制视图内容
      canvas.drawColor(Color.RED);
    }
    
    Java

4. drawChild()

  • 功能drawChild()ViewGroup类中的方法,用于绘制子视图。它常在ViewGrouponDraw()方法中调用,用来绘制所有子视图。
  • 调用时机drawChild()会在父视图的onDraw()方法中被调用,在绘制父视图的背景或其他内容后,调用drawChild()绘制子视图。

    示例

    @Override
    protected void onDraw(Canvas canvas) {
      super.onDraw(canvas);
      // 绘制子视图
      drawChild(canvas, childView, getDrawingTime());
    }
    
    Java

5. 区别与联系

  • requestLayout():请求重新布局,触发onLayout()方法来重新计算视图的大小和位置。
  • onLayout():在视图的布局过程中调用,计算并设置子视图的尺寸和位置。
  • onDraw():视图的绘制方法,负责绘制视图内容,如背景、文本等。
  • drawChild():用于绘制子视图的内容,通常在父视图的onDraw()方法中调用。

这些方法共同协作来完成视图的布局和绘制流程。requestLayout()触发布局,onLayout()进行视图的布局,onDraw()进行视图的绘制,drawChild()则在父视图的绘制过程中绘制子视图。

总结:

  • requestLayout()请求重新布局,触发onLayout()方法;
  • onLayout()用于布局过程,设置子视图位置和大小;
  • onDraw()用于绘制视图内容;
  • drawChild()在父视图绘制时调用,用于绘制子视图。

发表评论

后才能评论