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

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

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

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

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


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

Я нашел это изображение здесь enter image description here

теперь моя проблема и фокус этого вопроса:

предположим, что я могу разместить и нарисовать этот виртуальный джойстик, как я могу обнаружить только движение. и иметь обратный вызов, как 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-это система, управляемая событиями.

теперь о вашем настроении "я хочу его на уровне ОС". Это неправильно на многих уровнях. Во-первых, ОС ничего вам не должна. ОС-это то, что она есть, бери или оставь. Во-вторых, нежелание прилагать усилия (он же ленивый) обычно не одобряется в сообществе разработчиков программного обеспечения. В-третьих, код ОС по-прежнему код. Перемещение чего-то в ОС может принести вам некоторые эффективность, но почему вы думаете, что это сделает пользователя ощутимой разницей? Это сенсорная обработка, о которой мы говорим, - не особенно интенсивная задача процессора. Вы действительно создали приложение, профиль и обнаружили, что его производительность отсутствует? Пока вы этого не сделаете, никогда не догадывайтесь, где будет узкое место. Слово для этого - "преждевременная оптимизация", и это то, о чем все и кошка их дяди предупредили бы вас.