对于我从代码中创建的SurfaceView,我可以重写onDraw()方法。
但是如何覆盖在布局XML中定义的SurfaceView中的onDraw()方法?是否有任何方法可以访问draw()方法?
但是如何覆盖在布局XML中定义的SurfaceView中的onDraw()方法?是否有任何方法可以访问draw()方法?
如果您像这样声明并将SurfaceView实例添加到布局中,那么您无法访问onDraw方法:
<SurfaceView
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
上述声明创建了一个android.view.SurfaceView实例并将其添加到您的布局中。您不能改变该实例的onDraw方法的行为,就像您不能更改任何其他已编译类中的代码/行为一样。
要实现您所要求的功能,您可以创建自己的SurfaceView子类:
package myapp.views;
import android.view.SurfaceView;
public MySurfaceView extends SurfaceView implements Callback {
...
}
然后,要将其添加到您的布局中,而不是原始的vanilla SurfaceView,您只需在布局中引用您的类的完全限定名称作为XML元素:
<myapp.views.MySurfaceView
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
你的SurfaceView子类必须声明一个构造函数,该构造函数以Context
和AttributeSet
作为参数。同时不要忘记你的SurfaceView应该实现SurfaceHolder.Callback
并将其注册到其SurfaceHolder中:
public MySurfaceView(Context context, AttributeSet attributeSet) {
super(context, attributeSet);
getHolder().addCallback(this);
}
draw方法不会自动调用,但你可以确保当SurfaceView初始化时,你的视图的初始状态被绘制。一个回调将在surfaceCreated中被调用,在那里你可以调用draw方法:
public void surfaceCreated(SurfaceHolder holder) {
Canvas c = getHolder().lockCanvas();
draw(c);
getHolder().unlockCanvasAndPost(c);
}
看这里!