从布局xml中绘制SurfaceView

Fug*_*ugo 7 android surfaceview android-layout

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

svj*_*son 29

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

<SurfaceView
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" />
Run Code Online (Sandbox Code Playgroud)

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

要实现您的要求,您可以创建自己的SurfaceView子类:

package myapp.views;

import android.view.SurfaceView;

public MySurfaceView extends SurfaceView implements Callback {
   ...
}
Run Code Online (Sandbox Code Playgroud)

然后,要将其添加到您的布局而不是orignal vanilla SurfaceView,您只需将类的完全限定名称称为布局中的XML元素:

<myapp.views.MySurfaceView
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" />
Run Code Online (Sandbox Code Playgroud)

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

public MySurfaceView(Context context, AttributeSet attributeSet) {
    super(context, attributeSet);
    getHolder().addCallback(this);
}
Run Code Online (Sandbox Code Playgroud)

不会自动调用draw-method,但可以确保在初始化曲面视图时绘制视图的初始状态.将回调surfaceCreated您可以调用draw-method的位置:

public void surfaceCreated(SurfaceHolder holder) {
    Canvas c = getHolder().lockCanvas();
    draw(c);
    getHolder().unlockCanvasAndPost(c);
}
Run Code Online (Sandbox Code Playgroud)

瞧!

  • 您没有“导入”您的包名称,您只需指出您自己的 SurfaceView 实现,它将被实例化并添加到您的布局中,而不是普通的 SurfaceView。我已经编辑了上面的答案以澄清这一点。我希望这有帮助。 (2认同)