Java 是什么导致调用OnDraw视图方法以及何时调用

Java 是什么导致调用OnDraw视图方法以及何时调用,java,android,android-view,super,Java,Android,Android View,Super,我在android的Textview类中看到了这一点: @Override protected void onDraw(Canvas canvas) { restartMarqueeIfNeeded(); // Draw the background for this view super.onDraw(canvas); 在android的View类中,我看到它是空的: /** * Implement this to do your drawing. * * @

我在android的Textview类中看到了这一点:

@Override
protected void onDraw(Canvas canvas) {
    restartMarqueeIfNeeded();

    // Draw the background for this view
    super.onDraw(canvas);
在android的
View
类中,我看到它是空的:

/**
 * Implement this to do your drawing.
 *
 * @param canvas the canvas on which the background will be drawn
 */
protected void onDraw(Canvas canvas) {
}
如果超类的方法是空的,为什么会有人调用它

使用参数canvas调用的方法在哪里

参数画布是否由android系统自动传递

ondraw方法何时调用,由谁调用

当它被重写时,是否调用子类的方法而不是超类“

这是我的自定义视图,例如:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(new MyView(this));


    }
}
class MyView extends View {


    public MyView(Context context) {
        super(context);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
    }
}
谁调用MyView.OnDraw方法


必须有一行代码调用Myview.Ondraw方法。不是吗?

来回答您的问题:

如果超类的方法是空的,为什么会有人调用它

因为如果您不确定实现是什么,那么调用super是一种很好的做法。例如,如果在库中有一个类的扩展类,但没有该扩展类的代码,则应该调用super方法。然而,在这种情况下,这是没有必要的,但我会推荐它

使用参数canvas调用的方法在哪里

我不完全清楚您的意思,但当您让类重写
视图
时,您可以重写
onDraw
,这样您就可以决定视图的外观

参数画布是否由android系统自动传递

ondraw方法何时调用,由谁调用

当它第一次可见时,它被附加到其生命周期某处的活动调用。你不必为此担心。当您在视图上调用
invalidate
或当它被认为是脏的(需要重新绘制)时,也会调用它。在您的示例中,将调用onDraw,但由于您没有在提供的画布上绘制任何内容,因此您不会在活动中看到任何内容。如果向函数添加一些日志,您将在logcat中看到它

当它被重写时,是否调用子类的方法而不是超类“


是的,这就是扩展类和重写方法的工作方式

当有人通过调用
invalidate
postinvalidationanimation
请求重画其子视图时,ViewRoot会调用
onDraw
。ViewRoot正在调用每个窗口子级的
onDraw
,这些子级依次绘制其可见子级(对于ViewGroup)或自己(对于视图),直到绘制最后一个视图

可以随时在主线程上执行绘图,这是正常的,在旧版本上是默认的,但在视觉上并不完美。或者,它可以推迟到下一个垂直同步通过。现代Android版本通过Choreographer安排所有对onDraw的调用,这是由无效和可绘制动画引起的

画布由Android窗口系统提供,该系统内部使用OpenGL ES和硬件组合来管理显示的窗口

当它被重写时,是否调用子类的方法而不是超类“


对。但是不调用超类的
onDraw
很少是一种有效的策略(为什么首先要对它进行子类化?!)如果不想绘制任何东西,可以调用
setWillNotDraw(true)
(顺便说一句,基本视图类的默认值已经是
true
).

除上述内容外:在调整窗口大小以合理地容纳“键盘”后,软键盘会导致一个视图.invalidate()-->View.onDraw()序列。自定义的视图.onDraw()必须使自身处于一种预期这种可能性的状态。

这也许可以解释为什么在带有蓝牙键盘的平板电脑上开发和测试的应用程序在现实世界中表现得出人意料。

我更新了我的问题。我的问题是:谁调用MyView.OnDraw方法?因为我只看到正在创建的Myview类的对象,并且在调用该构造函数之后。“setContentView(new Myview(this));”和“public Myview(Context Context){super(Context);}”必须有一行代码调用Myview.Ondraw方法。不是吗?使用
Thread#dumpStack()
内部
onDraw
并查看
logcat
的可能副本