Вы не можете получить доступ к onDraw-методу экземпляра SurfaceView, объявленного и добавленного в макет следующим образом:
<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
в качестве параметров. И не забывайте, что ваш вид поверхности должен реализовывать SurfaceHolder.Callback
и регистрироваться в своем SurfaceHolder:
public MySurfaceView(Context context, AttributeSet attributeSet) {
super(context, attributeSet);
getHolder().addCallback(this);
}
Метод draw не будет вызываться автоматически, но вы можете убедиться, что начальное состояние вашего вида отображается при инициализации вида поверхности. Будет выполнен обратный вызов на surfaceCreated
, где вы можете вызвать метод draw:
public void surfaceCreated(SurfaceHolder holder) {
Canvas c = getHolder().lockCanvas();
draw(c);
getHolder().unlockCanvasAndPost(c);
}
вуаля!