SurfaceView и ANativeWindow - PullRequest
       77

SurfaceView и ANativeWindow

6 голосов
/ 20 февраля 2012

У меня есть вопрос относительно создания SurfaceView и последующего получения из него ANativeWindow.

  1. Правильно ли делать

    mSurfaceView = new SurfaceView(this); in:

    • onCreate()
    • onStart()

Причина, по которой я спрашиваю: насколько я понимаю, SurfaceView будет разрушен, когда мы проиграемfocus (что-то еще покрывает весь экран), поэтому нам нужно будет заново создавать его каждый раз, когда мы получаем фокус (onStart () выполняется).Или SurfaceView остается бездействующим и пригодным для повторного использования?

  1. Продолжая, теперь я хотел бы создать собственное окно из вышеупомянутой поверхности (в собственном коде).Правильно ли делать

    ANativeWindow* newwindow = ANativeWindow_fromSurface(jniEnv, joSurface) в:

    • onSurfaceCreated_native(..., jobject surface)
    • onSurfaceChanged_native(..., jobject surface)

Причина запроса: onSurfaceChanged, кажется, всегда вызывается после onSurfaceCreated, поэтому у нас есть выбор, когда создавать собственное окно.С одной стороны, кажется логичным сделать это в onSurfaceCreated, но два jobject surface, похоже, ссылаются на разные объекты!(Как проверено созданием слабой глобальной ссылки на поверхность в onSurfaceCreated и проверкой ее как на NULL, так и на поверхности в onSurfaceChanged, см. Код ниже)

onSurfaceCreated_native(JNIEnv env, ... ,jobject surface) {
myWeakObjectGlobal = env->NewWeakGlobalRef(surface);
}

onSurfaceChanged_native(JNIEnv env, ... ,jobject surface) {

if (env->IsSameObject(surface, myWeakObjectGlobal)) {
    LOGW("onSurfaceChanged_native: new surface is SAME as old surface");
} else {
    LOGW("onSurfaceChanged_native: new surface is DIFFERENT as old surface");
}

if (env->IsSameObject(NULL, myWeakObjectGlobal)) {
    LOGW("    furthermore, old surface is NULL");
} else {
    LOGW("    furthermore, old surface is NOT null");
}

}

Следовательно, если действительно есть два различных поверхностных объекта, отправляемых в onSurfaceCreated иonSurfaceChanged, тогда мы хотим использовать самую свежую и не зависать на устаревшей ссылке на поверхность, и, следовательно, сделать ANativeWindow_from_Surface в onSurfaceChanged.

Буду очень признателен, если кто-нибудь сможет пролить свет на этот вопрос для меня.

1 Ответ

0 голосов
/ 08 марта 2013

Вы пытались использовать android.view.Surface вместо android.view.SurfaceView?

...