对于我从代码中创建的SurfaceView,我可以覆盖onDraw()
但是如何从布局XML中定义的onDraw()
覆盖SurfaceView
?有没有办法访问draw()
方法?
答案 0 :(得分:29)
您无法访问声明并添加到布局的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 {
...
}
然后,要将其添加到您的布局而不是orignal vanilla SurfaceView,您只需将类的完全限定名称称为布局中的XML元素:
<myapp.views.MySurfaceView
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
您的SurfaceView子类必须声明一个以Context
和AttributeSet
为参数的构造函数。并且不要忘记表面视图应该实现SurfaceHolder.Callback
并将自己注册到SurfaceHolder:
public MySurfaceView(Context context, AttributeSet attributeSet) {
super(context, attributeSet);
getHolder().addCallback(this);
}
不会自动调用draw-method,但可以确保在初始化曲面视图时绘制视图的初始状态。将对surfaceCreated
进行回调,您可以在其中调用draw-method:
public void surfaceCreated(SurfaceHolder holder) {
Canvas c = getHolder().lockCanvas();
draw(c);
getHolder().unlockCanvasAndPost(c);
}
瞧!