Intereting Posts
Android: при просмотре полноэкранного видео youtube я отжимаю назад, а активность завершается Как установить JRE или JDK для запуска средств Android Developer в Windows 7? Непритязание вытяжного устройства для AngularApple () не работает на угловом webapp (appium / chrome на реальном устройстве) Почему я не могу переопределить свойства макета включенных макетов в моем проекте Android? Android: как центрировать кнопку, программно созданную? Резервное копирование / восстановление общих настроек android Есть ли способ вызова «getBackgroundColor»? Добавление «emma» в триггеры сборки ant Antoid «исключение локального переменного типа» исключение Фрагмент не вызывает onSaveInstanceState при прокрутке ViewPager? Ошибка «Наблюдатель … не зарегистрирована» Как запустить Android-приложение без «android.intent.category.LAUNCHER» Использование библиотеки Picasso с ListView Динамически добавлять элементы в списокView Android Ошибка: не удалось найти цель с хэш-строкой 'android-14' в: Открыть Android SDK Manager Любимый контент отображается неправильно в веб-просмотре

SurfaceView и ANativeWindow

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

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

    mSurfaceView = new SurfaceView(this); в:

    • onCreate()
    • onStart()

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

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

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

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

Причина для запроса: onSurfaceChanged, кажется, всегда onSurfaceCreated после 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.

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

Solutions Collecting From Web of "SurfaceView и ANativeWindow"

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