如题。
SurfaceView是继承自View的类,View类中有一个onDraw函数,如果是继承自View的类是可以重写onDraw函数的。
那么为什么继承自View的子类SurfaceView的类不能重写onDraw函数呢?即使写了onDraw函数,也不会自动调用,需要自己调用。

解决方案 »

  1.   

    View的onDraw函数是protected的。
    protected 表明被它修饰的成员变量为保护类型,在同一个包里和 public 类型是一样的,也是能够访问到的。但是如果在不同包里的 protected 类型的成员变量就只能通过子类来访问,这个修饰符是区别于其他的修饰符的。
    所以SurfaceView可以访问。而SurfaceView里并没有重写onDraw,
    所以View子类的子类可以重写onDraw,但不能访问,所以像你说的:即使写了onDraw函数,也不会自动调用,需要自己调用。
      

  2.   

    JAVA中面向对象编程是非常微妙的,慢慢体会吧。
      

  3.   

    看一下sdk
    public void draw (Canvas canvas)Since: API Level 1
    Manually render this view (and all of its children) to the given Canvas. The view must have already done a full layout before this function is called. When implementing a view, do not override this method; instead, you should implement onDraw(Canvas).
    Parameters
    canvas The Canvas to which the View is rendered.虽然没用过SurfaceView,但是按照sdk的说明,应该是调用draw 以此来进入到ondraw的回调中。
      

  4.   

    多谢。
    没注意到这么细致的地方,虽然也看到了View中onDraw是protected。
      

  5.   

    打开你的sdk目录
    1.android-sdk-windows\doc\index.html
    2.选择Reference选项卡
    3.点击左侧上android.view包,左侧下在class里找到SurfaceView
    4.点击SurfaceView里面的public void draw (Canvas canvas)