Add Android physic buttons input detection

- Added functions for detect when pressed, during down and when
released.
- Added defines for back, menu, volume up and down button numbers.
This commit is contained in:
victorfisac 2016-01-04 21:00:20 +01:00
parent 0c539cbf32
commit ea50092356
2 changed files with 55 additions and 3 deletions

View File

@ -122,6 +122,8 @@ static int ident, events;
static bool windowReady = false; // Used to detect display initialization
static bool appEnabled = true; // Used to detec if app is active
static bool contextRebindRequired = false; // Used to know context rebind required
static int previousButtonState[512] = { 1 }; // Required to check if button pressed/released once
static int currentButtonState[512] = { 1 }; // Required to check if button pressed/released once
#elif defined(PLATFORM_RPI)
static EGL_DISPMANX_WINDOW_T nativeWindow; // Native window (graphic device)
@ -365,6 +367,13 @@ void InitWindow(int width, int height, struct android_app *state)
TraceLog(INFO, "Android app initialized successfully");
// Init button states values (default up)
for(int i = 0; i < 512; i++)
{
currentButtonState[i] = 1;
previousButtonState[i] = 1;
}
// Wait for window to be initialized (display and context)
while (!windowReady)
{
@ -1101,6 +1110,34 @@ Vector2 GetTouchPosition(void)
return position;
}
bool IsButtonPressed(int button)
{
bool pressed = false;
if ((currentButtonState[button] != previousButtonState[button]) && (currentButtonState[button] == 0)) pressed = true;
else pressed = false;
return pressed;
}
// Detect if a button is being pressed (button held down)
bool IsButtonDown(int button)
{
if (currentButtonState[button] == 0) return true;
else return false;
}
// Detect if a button has been released once
bool IsButtonReleased(int button)
{
bool released = false;
if ((currentButtonState[button] != previousButtonState[button]) && (currentButtonState[button] == 1)) released = true;
else released = false;
return released;
}
#endif
//----------------------------------------------------------------------------------
@ -1648,12 +1685,14 @@ static int32_t AndroidInputCallback(struct android_app *app, AInputEvent *event)
{
int32_t keycode = AKeyEvent_getKeyCode(event);
//int32_t AKeyEvent_getMetaState(event);
currentButtonState[keycode] = AKeyEvent_getAction (event); // Down = 0, Up = 1
//if (keycode == AKEYCODE_HOME) { }
//if (keycode == AKEYCODE_POWER) { }
if (keycode == AKEYCODE_BACK)
if (keycode == AKEYCODE_POWER) { return 1; }
if ((keycode == AKEYCODE_BACK) || (keycode == AKEYCODE_MENU))
{
// Eat BACK_BUTTON, just do nothing... and don't let to be handled by OS!
// Eat BACK_BUTTON and AKEYCODE_MENU, just do nothing... and don't let to be handled by OS!
return 1;
}
else if ((keycode == AKEYCODE_VOLUME_UP) || (keycode == AKEYCODE_VOLUME_DOWN))
@ -1778,6 +1817,7 @@ static void PollInputEvents(void)
// TODO: Remove this requirement...
UpdateGestures();
#endif
#if defined(PLATFORM_DESKTOP) || defined(PLATFORM_WEB)
@ -1806,6 +1846,9 @@ static void PollInputEvents(void)
glfwPollEvents(); // Register keyboard/mouse events... and window events!
#elif defined(PLATFORM_ANDROID)
// Register previous keys states
for (int i = 0; i < 512; i++) previousButtonState[i] = currentButtonState[i];
// Poll Events (registered events)
// NOTE: Activity is paused if not enabled (appEnabled)
while ((ident = ALooper_pollAll(appEnabled ? 0 : -1, NULL, &events,(void**)&source)) >= 0)

View File

@ -186,6 +186,12 @@
// TODO: Review Xbox360 USB Controller Buttons
// Android Physic Buttons
#define ANDROID_BACK 4
#define ANDROID_MENU 82
#define ANDROID_VOLUME_UP 24
#define ANDROID_VOLUME_DOWN 25
// Some Basic Colors
// NOTE: Custom raylib color palette for amazing visuals on WHITE background
#define LIGHTGRAY (Color){ 200, 200, 200, 255 } // Light Gray
@ -581,6 +587,9 @@ bool IsGamepadButtonUp(int gamepad, int button); // Detect if a gamepad b
int GetTouchX(void); // Returns touch position X (relative to screen size)
int GetTouchY(void); // Returns touch position Y (relative to screen size)
Vector2 GetTouchPosition(void); // Returns touch position XY (relative to screen size)
bool IsButtonPressed(int button); // Detect if an android physic button has been pressed
bool IsButtonDown(int button); // Detect if an android physic button is being pressed
bool IsButtonReleased(int button); // Detect if an android physic button has been released
//------------------------------------------------------------------------------------
// Gestures and Touch Handling Functions (Module: gestures)