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子类必须声明一个带Context和AttributeSet作为参数的构造函数.并且不要忘记您的表面视图应该实现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)
瞧!
| 归档时间: |
|
| 查看次数: |
25295 次 |
| 最近记录: |