SurfaceView и ANativeWindow

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

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

    mSurfaceView = new SurfaceView (this); в:

    • onCreate ()
    • onStart ()

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

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

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

    • onSurfaceCreated_native (..., поверхность объекта задания)
    • onSurfaceChanged_native (..., поверхность объекта задания)

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

onSurfaceCreated_native (JNIEnv env, ..., поверхность объекта задания) {
myWeakObjectGlobal = env-> NewWeakGlobalRef (поверхность);
}

onSurfaceChanged_native (JNIEnv env, ..., поверхность объекта задания) {

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.

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

6
задан gadget 20 February 2012 в 19:14
поделиться