Можно ли создавать элементы пользовательского интерфейса с помощью NDK? - отсутствие спецификаций в документах Android
после чтения связанных документов я не получаю, могу ли я создавать такие вещи, как кнопки или другие элементы пользовательского интерфейса, используемые для получения пользовательских входов только с использованием кода C++/C, скомпилированного с NDK.
нет проблем, когда я хочу обработать "окно" или действие, которое должно оставаться в фокусе, но я не понимаю, как создать пользовательский интерфейс с элементами для обратных вызовов и ввода пользователя.
странно, что существует оконная структура, но без каких-либо следов обратных вызовов для Элементы пользовательского интерфейса.
можно ли создать сенсорные кнопки или виртуальный геймпад с помощью NDK ?
Я ценю усилия и тот факт, что мы приближаемся к моей точке зрения, но, по-видимому, я не объяснял себя достаточно хорошо.
Я нашел это изображение здесь
теперь моя проблема и фокус этого вопроса:
предположим, что я могу разместить и нарисовать этот виртуальный джойстик, как я могу обнаружить только движение. и иметь обратный вызов, как Joystick.onUp
или Joystick.onDown
С Android и с использованием только NDK ?
Если нет обратных вызовов такого рода, доступных из NDK, я должен каждый раз обнаруживать позицию [x,y], сравнивать ее с местоположением моего джойстика, хранить предыдущую позицию, сравнивать предыдущую позицию и следующую, чтобы получить направление ?
поскольку датчик выбрасывает события с очень быстрой скоростью, я думаю, что построение этого самостоятельно, учитывая только raw X, Y пара, в конечном итоге будет иметь действительно неэффективную систему управления, потому что она не будет оптимизирована на уровне ОС с соответствующими вызовами датчиков.
в соответствии с примером NativeActivity также неясно, как обрабатывать несколько точек касания, например, как я могу обрабатывать событие 2 касания одновременно ?
просто рассмотрите изображение выше и подумайте о том,чтобы иметь только координату x, y для 1 точки касания и как я могу решить это эффективным способом, который поддерживается НДК.
спасибо.
1 ответов
конечно, вы можете. Прочитайте вызов Java из C (++) и вызовите соответствующие функции Java - либо создайте элементы пользовательского интерфейса (макеты, кнопки и т. д.) один за другим, или загрузить XML-макет. Для этого нет интерфейса C-specific, но для вызова есть Java.
если это не игра, и вы намерены сделать свой собственный рисунок через OpenGL ES. Я не уверен, что вы можете смешивать и сочетать.
на NativeActivity
, вы все еще можете получить указатель на объект активности Java и вызвать его методы - это clazz
член 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 потребуется следующее:
$(call import-module,android/native_app_glue)
на native_app_glue
- это статическая библиотека, которая предоставляет некоторый мост C для API, которые обычно потребляются через Ява.
вы можете сделать это без библиотеки клея, а также. Но тогда вам нужно будет предоставить свою собственную функцию ANativeActivity_onCreate
, и куча других обратных вызовов. The android_main
/android_app
combo-это интерфейс, определенный библиотекой клея.
EDIT: для сенсорных координат используйте AMotionEvent_getX/Y()
, передавая объект события в качестве первого параметра и индекс указателя в качестве второго. Использовать AMotionEvent_getPointerCount()
для получения количества указателей (точек касания). Это ваша собственная обработка multitouch события.
я должен каждый раз определять положение [x,y], сравнивать его с расположение моего джойстика, сохранить предыдущее положение, сравнить предыдущая позиция и следующая, чтобы получить направление ?
короче говоря, да,вы. Нет встроенной поддержки платформы для виртуальных джойстиков; вы имеете дело с касаниями и координатами, и вы переводите это в метафору пользовательского интерфейса вашего приложения. Это в значительной степени суть программирование.
не "каждый раз", хотя - только когда он меняется. Android-это система, управляемая событиями.
теперь о вашем настроении "я хочу его на уровне ОС". Это неправильно на многих уровнях. Во-первых, ОС ничего вам не должна. ОС-это то, что она есть, бери или оставь. Во-вторых, нежелание прилагать усилия (он же ленивый) обычно не одобряется в сообществе разработчиков программного обеспечения. В-третьих, код ОС по-прежнему код. Перемещение чего-то в ОС может принести вам некоторые эффективность, но почему вы думаете, что это сделает пользователя ощутимой разницей? Это сенсорная обработка, о которой мы говорим, - не особенно интенсивная задача процессора. Вы действительно создали приложение, профиль и обнаружили, что его производительность отсутствует? Пока вы этого не сделаете, никогда не догадывайтесь, где будет узкое место. Слово для этого - "преждевременная оптимизация", и это то, о чем все и кошка их дяди предупредили бы вас.