Нарисуйте SurfaceView из макета XML - PullRequest
7 голосов
/ 05 марта 2011

для SurfaceView, который я сделал из кода, я могу переопределить onDraw().
Но как переопределить этот onDraw() из SurfaceView, который определен в макете XML? есть ли способ получить доступ к методу draw()?

1 Ответ

29 голосов
/ 08 марта 2011

Вы не можете получить доступ к 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);
}

вуаля!

...