SurfaceView и ANativeWindow
У меня есть вопрос относительно создания SurfaceView и последующего получения от него ANativeWindow.
- Это правильно делать
mSurfaceView = new SurfaceView(this);
в:onCreate()
onStart()
Причина, по которой я спрашиваю: насколько я понимаю, SurfaceView разрушается, когда мы теряем фокус (что-то еще покрывает весь экран), поэтому нам нужно будет заново создавать его каждый раз, когда мы получаем фокус (выполняется onStart()). Или SurfaceView остается бездействующим и пригодным для повторного использования?
Теперь я хотел бы создать собственное окно из вышеупомянутой поверхности (в нативном коде). Это правильно делать
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 ответ
Вы пытались использовать android.view.Surface
вместо android.view.SurfaceView
?