从布局xml中绘制SurfaceView

时间:2011-03-05 11:34:27

标签: android android-layout surfaceview

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

1 个答案:

答案 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子类必须声明一个以ContextAttributeSet为参数的构造函数。并且不要忘记表面视图应该实现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);
}

瞧!