从布局xml中绘制SurfaceView

对于我从代码创build的SurfaceView,我可以覆盖onDraw()
但是,如何从布局XML中定义的SurfaceView覆盖onDraw() ? 有什么方法可以访问draw()方法吗?

Solutions Collecting From Web of "从布局xml中绘制SurfaceView"

您不能访问声明的SurfaceView实例的onDraw方法,并将其添加到布局中,如下所示:

 <SurfaceView android:layout_width="fill_parent" android:layout_height="fill_parent" /> 

上面的声明创build了一个android.view.SurfaceView的实例,并将其添加到您的布局。 您不能更改该实例上的onDraw方法的行为,而不能更改任何其他已编译的类中的代码/行为。

为了实现你所要求的,你可以创build你自己的SurfaceView的子类:

 package myapp.views; import android.view.SurfaceView; public MySurfaceView extends SurfaceView implements Callback { ... } 

然后,要添加到您的布局,而不是原始的香草SurfaceView,您只需将您的类的完全限定的名称作为您的布局中的XML元素引用:

 <myapp.views.MySurfaceView android:layout_width="fill_parent" android:layout_height="fill_parent" /> 

您的SurfaceView子类必须声明一个构造函数,它将ContextAttributeSet作为参数。 不要忘记你的表面视图应该实现SurfaceHolder.Callback并注册到它的SurfaceHolder:

 public MySurfaceView(Context context, AttributeSet attributeSet) { super(context, attributeSet); getHolder().addCallback(this); } 

绘制方法不会自动调用,但可以确保在初始化表面视图时绘制视图的初始状态。 一个callback将被做到surfaceCreated ,你可以调用draw-method:

 public void surfaceCreated(SurfaceHolder holder) { Canvas c = getHolder().lockCanvas(); draw(c); getHolder().unlockCanvasAndPost(c); } 

瞧!