Возможно ли создать элементы пользовательского интерфейса с помощью NDK? – отсутствие спецификаций в Android-документах

После прочтения связанных документов я не понимаю, могу ли я создавать такие вещи, как кнопки или другие элементы пользовательского интерфейса, используемые для ввода пользовательских входов с использованием кода C ++ / C, скомпилированного с NDK.

Нет проблем, когда я хочу обрабатывать «окно» или активность, которая должна оставаться в фокусе, но я не понимаю, как создать пользовательский интерфейс с элементами для обратных вызовов и ввода пользователем.

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

Могу ли я создавать сенсорные кнопки или виртуальный геймпад с NDK?


Я ценю усилия и тот факт, что мы приближаемся к моему моменту, но, по-видимому, я недостаточно объяснял себя.

Я нашел этот образ здесь Введите описание изображения здесь

Теперь моя проблема и основное внимание в этом вопросе:

Предположим, что я могу разместить и нарисовать этот виртуальный джойстик, как я могу обнаружить только движения и иметь обратный вызов, такой как Joystick.onUp или Joystick.onDown с Android и использование только NDK?

Если в NDK нет обратных вызовов такого типа, я должен каждый раз определять позицию [x, y], сравнивать его с местоположением моего джойстика, сохранять предыдущую позицию, сравнивать предыдущую позицию и следующую Получить направление?

Поскольку датчик выбрасывает события с очень высокой скоростью, я думаю, что построение этого самостоятельно, учитывая только сырую пару X, Y, закончится тем, что будет иметь действительно неэффективную систему управления, потому что она не будет оптимизирована на уровне ОС с соответствующим Сенсорные вызовы.

Согласно примеру NativeActivity, также неясно, как обрабатывать несколько точек касания, например, как я могу обрабатывать 2 события касания одновременно?

Просто рассмотрите изображение выше и подумайте о наличии только координаты x, y для 1 точки касания и о том, как я могу решить эту проблему эффективным образом, который поддерживается NDK.

Благодарю.

Что вы можете. Прочтитесь при вызове Java из C (++) и вызовите соответствующие функции Java – либо создайте элементы интерфейса (макеты, кнопки и т. Д.) Один за другим, либо загрузите XML-макет. Для этого не существует C-специфического интерфейса, но Java-вызов должен быть вызван.

Если это не игра, и вы намерены сделать свой собственный рисунок через OpenGL ES. Я не уверен, что вы можете смешивать и сочетать.

В NativeActivity вы все равно можете получить указатель на объект Java Activity и вызвать его методы – это член ANativeActivity структуры ANativeActivity который передается вашему android_main в качестве параметра через структуру android_app . Возьмите этот указатель, возьмите JNIEnv* из того же самого и назначьте макет.

Как это будет взаимодействовать с графикой OpenGL, я не уверен.

EDIT: о создании собственной обработки ввода. Ключевым обратным вызовом является onInputEvent(struct android_app* app, AInputEvent* event) в структуре android_app . Поместите туда свою обратную связь, Android вызовет ее, когда это необходимо. Используйте AInputEvent_getType(event) для получения типа события; События касания имеют тип AINPUT_EVENT_TYPE_MOTION.

EDIT2: вот минимальное родное приложение, которое захватывает события касания:

 #include <jni.h> #include <android_native_app_glue.h> #include <android/log.h> static int32_t OnInput(struct android_app* app, AInputEvent* event) { __android_log_write(ANDROID_LOG_ERROR, "MyNativeProject", "Hello input event!"); return 0; } extern "C" void android_main(struct android_app* App) { app_dummy(); App->onInputEvent = OnInput; for(;;) { struct android_poll_source* source; int ident; int events; while ((ident = ALooper_pollAll(-1, NULL, &events, (void**)&source)) >= 0) { if(source != NULL) source->process(App, source); if (App->destroyRequested != 0) return; } } } 

Естественно, вам нужно добавить проект вокруг него, с манифестом, Android.mk и всем остальным. Android.mk потребуется следующая строка:

 $(call import-module,android/native_app_glue) 

Свойство native_app_glue представляет собой статическую библиотеку, которая предоставляет некоторые мосты C для API, которые обычно используются через Java.

Вы можете сделать это без библиотеки клея. Но тогда вам нужно будет предоставить свою собственную функцию ANativeActivity_onCreate и множество других обратных вызовов. android_main / android_app – это интерфейс, определенный библиотекой клея.

EDIT: для сенсорных координат используйте AMotionEvent_getX/Y() , передавая объект события в качестве первого параметра и указателя указателя как второго. Используйте AMotionEvent_getPointerCount() чтобы получить количество указателей (точек касания). Это ваша собственная обработка мультитач-событий.

Я должен каждый раз определять позицию [x, y], сравнивать ее с местоположением моего джойстика, сохранять предыдущую позицию, сравнивать предыдущую позицию и следующую, чтобы получить направление?

Короче говоря, да. Для виртуальных джойстиков нет встроенной поддержки платформы; Вы имеете дело с касаниями и координатами, и вы переводите это в метафору пользовательского интерфейса приложения. Это в значительной степени суть программирования.

Но не «каждый раз» – только когда он меняется. Android – это система, управляемая событиями.

Теперь о вашем настроении «Я хочу его на уровне ОС». Это НЕПРАВИЛЬНО на многих уровнях. Во-первых, ОС не обязана вам ничего. ОС – это то, что она есть, возьмите ее или оставьте. Во-вторых, нежелание прилагать усилия (AKA, ленивый), как правило, недооценивается в сообществе разработчиков программного обеспечения. В-третьих, код ОС по-прежнему является кодом. Перемещение чего-то в ОС может принести вам некоторую эффективность, но почему вы думаете, что это сделает пользователь ощутимой разницей? Это сенсорная обработка, о которой мы говорим, – не особенно сложная для ЦП задача. Вы действительно создали приложение, профиль и не нашли его производительность? Пока вы этого не сделаете, никогда не догадывайтесь, где будет узкое место. Слово для этого – «преждевременная оптимизация», и это то, о чем предупреждали бы вас все и кошка их дяди.

Intereting Posts
Как создать круг или круглый VideoView в Android? Обновите текстовое представление, даже если пользователь не использует мое приложение Как узнать, используется ли метрическая или имперская Telegram API release.keystore ERROR Как использовать разделенные APK, созданные при использовании мгновенного запуска, в самом Android? Как запуститьActivityForResult из адаптера, чтобы вернуть результат в фрагмент Почему я не должен устанавливать layout_width и layout_height в стиле? Ребенок RelativeLayout не заполняет высоту RelativeLayout Android Hardware Acceleration – использовать или не использовать? OutOfMemory на устройстве и эмуляторе Воспроизвести фоновый звук в приложениях для Android Установите старый образ системы с помощью инструментов Android R21 Android: Как создать ярлык для рабочего стола, чтобы запустить сценарий оболочки? VisualGDB или WinGDB для разработки Android с Visual Studio Диалог подтверждения Android возвращает true или false