Better touch events support

This commit is contained in:
Nikita Lisitsa 2024-08-22 18:36:37 +03:00
parent c3a859d358
commit 4e9a551452
10 changed files with 109 additions and 27 deletions

View file

@ -50,10 +50,20 @@ public class MainActivity extends Activity {
@Override @Override
public boolean onTouchEvent(MotionEvent e) { public boolean onTouchEvent(MotionEvent e) {
if (e.getAction() == MotionEvent.ACTION_DOWN) { switch (e.getActionMasked()) {
MainActivity.this.nativeApp.touch((int)e.getX(), (int)e.getY()); case MotionEvent.ACTION_DOWN:
} case MotionEvent.ACTION_POINTER_DOWN:
MainActivity.this.nativeApp.touchDown((int)e.getX(), (int)e.getY());
return true; return true;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_POINTER_UP:
MainActivity.this.nativeApp.touchUp((int)e.getX(), (int)e.getY());
return true;
case MotionEvent.ACTION_MOVE:
MainActivity.this.nativeApp.touchMove((int)e.getX(), (int)e.getY());
return true;
}
return false;
} }
} }

View file

@ -24,7 +24,9 @@ public class PsemekApplication {
private static native long createNativeApp(); private static native long createNativeApp();
private static native void destroyNativeApp(long ptr); private static native void destroyNativeApp(long ptr);
private static native void resizeNative(long ptr, int width, int height); private static native void resizeNative(long ptr, int width, int height);
private static native void touchNative(long ptr, int x, int y); private static native void touchDownNative(long ptr, int x, int y);
private static native void touchUpNative(long ptr, int x, int y);
private static native void touchMoveNative(long ptr, int x, int y);
private static native void drawFrameNative(long ptr); private static native void drawFrameNative(long ptr);
private static native int audioFrequencyNative(); private static native int audioFrequencyNative();
@ -65,13 +67,15 @@ public class PsemekApplication {
@Override @Override
public void run() { public void run() {
while (true) { while (!interrupted()) {
int samples = PsemekApplication.audioGetSamples(buffer, 0, buffer.length); int samples = PsemekApplication.audioGetSamples(buffer, 0, buffer.length);
PsemekApplication.this.audioTrack.write(buffer, 0, samples, AudioTrack.WRITE_BLOCKING); PsemekApplication.this.audioTrack.write(buffer, 0, samples, AudioTrack.WRITE_BLOCKING);
try { try {
Thread.sleep(1); Thread.sleep(1);
} }
catch (InterruptedException e) {} catch (InterruptedException e) {
break;
}
} }
} }
} }
@ -115,9 +119,19 @@ public class PsemekApplication {
resizeNative(nativeApp, width, height); resizeNative(nativeApp, width, height);
} }
public void touch(int x, int y) public void touchDown(int x, int y)
{ {
touchNative(nativeApp, x, y); touchDownNative(nativeApp, x, y);
}
public void touchUp(int x, int y)
{
touchUpNative(nativeApp, x, y);
}
public void touchMove(int x, int y)
{
touchMoveNative(nativeApp, x, y);
} }
public void drawFrame() { public void drawFrame() {
@ -127,7 +141,7 @@ public class PsemekApplication {
} }
public void destroy() { public void destroy() {
audioThread.stop(); audioThread.interrupt();
if (nativeApp != 0) if (nativeApp != 0)
destroyNativeApp(nativeApp); destroyNativeApp(nativeApp);
nativeApp = 0; nativeApp = 0;

View file

@ -93,11 +93,27 @@ extern "C" void Java_psemek_app_PsemekApplication_resizeNative(JNIEnv * env, jcl
}); });
} }
extern "C" void Java_psemek_app_PsemekApplication_touchNative(JNIEnv * env, jclass, jlong ptr, jint x, jint y) extern "C" void Java_psemek_app_PsemekApplication_touchDownNative(JNIEnv * env, jclass, jlong ptr, jint x, jint y)
{ {
try_native(env, [&]{ try_native(env, [&]{
auto app = reinterpret_cast<psemek::app::application *>(ptr); auto app = reinterpret_cast<psemek::app::application *>(ptr);
app->on_event(psemek::app::touch_event{{x, y}}); app->on_event(psemek::app::touch_down_event{{x, y}});
});
}
extern "C" void Java_psemek_app_PsemekApplication_touchUpNative(JNIEnv * env, jclass, jlong ptr, jint x, jint y)
{
try_native(env, [&]{
auto app = reinterpret_cast<psemek::app::application *>(ptr);
app->on_event(psemek::app::touch_up_event{{x, y}});
});
}
extern "C" void Java_psemek_app_PsemekApplication_touchMoveNative(JNIEnv * env, jclass, jlong ptr, jint x, jint y)
{
try_native(env, [&]{
auto app = reinterpret_cast<psemek::app::application *>(ptr);
app->on_event(psemek::app::touch_move_event{{x, y}});
}); });
} }

View file

@ -16,7 +16,9 @@ namespace psemek::app
void on_event(mouse_move_event const &) override; void on_event(mouse_move_event const &) override;
void on_event(mouse_wheel_event const &) override; void on_event(mouse_wheel_event const &) override;
void on_event(mouse_button_event const &) override; void on_event(mouse_button_event const &) override;
void on_event(touch_event const &) override; void on_event(touch_down_event const &) override;
void on_event(touch_up_event const &) override;
void on_event(touch_move_event const &) override;
void on_event(key_event const &) override; void on_event(key_event const &) override;
void stop() override; void stop() override;

View file

@ -12,7 +12,9 @@ namespace psemek::app
virtual void on_event(mouse_move_event const &) {} virtual void on_event(mouse_move_event const &) {}
virtual void on_event(mouse_wheel_event const &) {} virtual void on_event(mouse_wheel_event const &) {}
virtual void on_event(mouse_button_event const &) {} virtual void on_event(mouse_button_event const &) {}
virtual void on_event(touch_event const &) {} virtual void on_event(touch_down_event const &) {}
virtual void on_event(touch_up_event const &) {}
virtual void on_event(touch_move_event const &) {}
virtual void on_event(key_event const &) {} virtual void on_event(key_event const &) {}
virtual ~event_handler() {} virtual ~event_handler() {}

View file

@ -44,7 +44,13 @@ namespace psemek::app
state.mouse_button_down.erase(event.button); state.mouse_button_down.erase(event.button);
} }
inline void apply(event_state &, touch_event const &) inline void apply(event_state &, touch_down_event const &)
{}
inline void apply(event_state &, touch_up_event const &)
{}
inline void apply(event_state &, touch_move_event const &)
{} {}
inline void apply(event_state & state, key_event const & event) inline void apply(event_state & state, key_event const & event)

View file

@ -39,7 +39,17 @@ namespace psemek::app
bool down; bool down;
}; };
struct touch_event struct touch_down_event
{
geom::point<int, 2> position;
};
struct touch_up_event
{
geom::point<int, 2> position;
};
struct touch_move_event
{ {
geom::point<int, 2> position; geom::point<int, 2> position;
}; };

View file

@ -14,7 +14,9 @@ namespace psemek::app
void on_event(mouse_move_event const &) override; void on_event(mouse_move_event const &) override;
void on_event(mouse_wheel_event const &) override; void on_event(mouse_wheel_event const &) override;
void on_event(mouse_button_event const &) override; void on_event(mouse_button_event const &) override;
void on_event(touch_event const &) override; void on_event(touch_down_event const &) override;
void on_event(touch_up_event const &) override;
void on_event(touch_move_event const &) override;
void on_event(key_event const &) override; void on_event(key_event const &) override;
void stop() override; void stop() override;

View file

@ -28,7 +28,17 @@ namespace psemek::app
apply(state_, event); apply(state_, event);
} }
void application_base::on_event(touch_event const & event) void application_base::on_event(touch_down_event const & event)
{
apply(state_, event);
}
void application_base::on_event(touch_up_event const & event)
{
apply(state_, event);
}
void application_base::on_event(touch_move_event const & event)
{ {
apply(state_, event); apply(state_, event);
} }

View file

@ -28,7 +28,17 @@ namespace psemek::app
on_event_impl(event); on_event_impl(event);
} }
void scene_application::on_event(touch_event const & event) void scene_application::on_event(touch_down_event const & event)
{
on_event_impl(event);
}
void scene_application::on_event(touch_up_event const & event)
{
on_event_impl(event);
}
void scene_application::on_event(touch_move_event const & event)
{ {
on_event_impl(event); on_event_impl(event);
} }