summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarkus Wick <degasus@users.noreply.github.com>2017-05-14 20:45:12 +0200
committerGitHub <noreply@github.com>2017-05-14 20:45:12 +0200
commit247cdca9b9c2eaae88da8a36d11cfd887540c9ff (patch)
treef71b65d8a4533e5820d8b1cca015ef83370e4888
parentad27e9026357cf4a2f5b56d81c0fcc594a397cca (diff)
parent216a7ceea89f02b0790d8adb925fdeb546dc7ba7 (diff)
Merge pull request #5398 from mahdihijazi/controls_states
Android: Add pressed state to the on-screen controllers
-rw-r--r--Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/overlay/InputOverlay.java180
-rw-r--r--Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/overlay/InputOverlayDrawableButton.java64
-rw-r--r--Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/overlay/InputOverlayDrawableDpad.java130
-rw-r--r--Source/Android/app/src/main/res/drawable-xxxhdpi/gcwii_dpad_pressed_one_direction.pngbin0 -> 15695 bytes
-rw-r--r--Source/Android/app/src/main/res/drawable-xxxhdpi/gcwii_dpad_pressed_two_directions.pngbin0 -> 20649 bytes
5 files changed, 291 insertions, 83 deletions
diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/overlay/InputOverlay.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/overlay/InputOverlay.java
index 7f4421b101..780b441012 100644
--- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/overlay/InputOverlay.java
+++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/overlay/InputOverlay.java
@@ -137,7 +137,9 @@ public final class InputOverlay extends SurfaceView implements OnTouchListener
// If a pointer enters the bounds of a button, press that button.
if (button.getBounds().contains((int)event.getX(pointerIndex), (int)event.getY(pointerIndex)))
{
+ button.setPressedState(true);
NativeLibrary.onGamePadEvent(NativeLibrary.TouchScreenDevice, button.getId(), ButtonState.PRESSED);
+ invalidate();
}
break;
case MotionEvent.ACTION_UP:
@@ -147,6 +149,9 @@ public final class InputOverlay extends SurfaceView implements OnTouchListener
{
NativeLibrary.onGamePadEvent(NativeLibrary.TouchScreenDevice, button.getId(), ButtonState.RELEASED);
}
+
+ button.setPressedState(false);
+ invalidate();
break;
}
}
@@ -162,22 +167,33 @@ public final class InputOverlay extends SurfaceView implements OnTouchListener
// If a pointer enters the bounds of a button, press that button.
if (dpad.getBounds().contains((int)event.getX(pointerIndex), (int)event.getY(pointerIndex)))
{
- if (dpad.getBounds().top + (dpad.getIntrinsicHeight() / 3) > (int)event.getY(pointerIndex))
+ boolean up = false;
+ boolean down = false;
+ boolean left = false;
+ boolean right = false;
+ if (dpad.getBounds().top + (dpad.getHeight() / 3) > (int)event.getY(pointerIndex))
{
NativeLibrary.onGamePadEvent(NativeLibrary.TouchScreenDevice, dpad.getId(0), ButtonState.PRESSED);
+ up = true;
}
- if (dpad.getBounds().bottom - (dpad.getIntrinsicHeight() / 3) < (int)event.getY(pointerIndex))
+ if (dpad.getBounds().bottom - (dpad.getHeight() / 3) < (int)event.getY(pointerIndex))
{
NativeLibrary.onGamePadEvent(NativeLibrary.TouchScreenDevice, dpad.getId(1), ButtonState.PRESSED);
+ down = true;
}
- if (dpad.getBounds().left + (dpad.getIntrinsicWidth() / 3) > (int)event.getX(pointerIndex))
+ if (dpad.getBounds().left + (dpad.getWidth() / 3) > (int)event.getX(pointerIndex))
{
NativeLibrary.onGamePadEvent(NativeLibrary.TouchScreenDevice, dpad.getId(2), ButtonState.PRESSED);
+ left = true;
}
- if (dpad.getBounds().right - (dpad.getIntrinsicWidth() / 3) < (int)event.getX(pointerIndex))
+ if (dpad.getBounds().right - (dpad.getWidth() / 3) < (int)event.getX(pointerIndex))
{
NativeLibrary.onGamePadEvent(NativeLibrary.TouchScreenDevice, dpad.getId(3), ButtonState.PRESSED);
+ right = true;
}
+
+ setDpadState(dpad, up, down, left, right);
+ invalidate();
}
break;
case MotionEvent.ACTION_UP:
@@ -190,6 +206,8 @@ public final class InputOverlay extends SurfaceView implements OnTouchListener
NativeLibrary.onGamePadEvent(NativeLibrary.TouchScreenDevice, dpad.getId(i), ButtonState.RELEASED);
}
}
+ dpad.setState(InputOverlayDrawableDpad.STATE_DEFAULT);
+ invalidate();
break;
}
}
@@ -323,43 +341,74 @@ public final class InputOverlay extends SurfaceView implements OnTouchListener
return true;
}
+ private void setDpadState(InputOverlayDrawableDpad dpad, boolean up, boolean down, boolean left, boolean right)
+ {
+ if (up)
+ {
+ if (left)
+ dpad.setState(InputOverlayDrawableDpad.STATE_PRESSED_UP_LEFT);
+ else if (right)
+ dpad.setState(InputOverlayDrawableDpad.STATE_PRESSED_UP_RIGHT);
+ else
+ dpad.setState(InputOverlayDrawableDpad.STATE_PRESSED_UP);
+ }
+ else if (down)
+ {
+ if (left)
+ dpad.setState(InputOverlayDrawableDpad.STATE_PRESSED_DOWN_LEFT);
+ else if (right)
+ dpad.setState(InputOverlayDrawableDpad.STATE_PRESSED_DOWN_RIGHT);
+ else
+ dpad.setState(InputOverlayDrawableDpad.STATE_PRESSED_DOWN);
+ }
+ else if (left)
+ {
+ dpad.setState(InputOverlayDrawableDpad.STATE_PRESSED_LEFT);
+ }
+ else if (right)
+ {
+ dpad.setState(InputOverlayDrawableDpad.STATE_PRESSED_RIGHT);
+ }
+ }
+
private void addGameCubeOverlayControls()
{
if (mPreferences.getBoolean("buttonToggleGc0", true))
{
- overlayButtons.add(initializeOverlayButton(getContext(), R.drawable.gcpad_a, ButtonType.BUTTON_A));
+ overlayButtons.add(initializeOverlayButton(getContext(), R.drawable.gcpad_a, R.drawable.gcpad_a_pressed, ButtonType.BUTTON_A));
}
if (mPreferences.getBoolean("buttonToggleGc1", true))
{
- overlayButtons.add(initializeOverlayButton(getContext(), R.drawable.gcpad_b, ButtonType.BUTTON_B));
+ overlayButtons.add(initializeOverlayButton(getContext(), R.drawable.gcpad_b, R.drawable.gcpad_b_pressed, ButtonType.BUTTON_B));
}
if (mPreferences.getBoolean("buttonToggleGc2", true))
{
- overlayButtons.add(initializeOverlayButton(getContext(), R.drawable.gcpad_x, ButtonType.BUTTON_X));
+ overlayButtons.add(initializeOverlayButton(getContext(), R.drawable.gcpad_x, R.drawable.gcpad_x_pressed, ButtonType.BUTTON_X));
}
if (mPreferences.getBoolean("buttonToggleGc3", true))
{
- overlayButtons.add(initializeOverlayButton(getContext(), R.drawable.gcpad_y, ButtonType.BUTTON_Y));
+ overlayButtons.add(initializeOverlayButton(getContext(), R.drawable.gcpad_y, R.drawable.gcpad_y_pressed, ButtonType.BUTTON_Y));
}
if (mPreferences.getBoolean("buttonToggleGc4", true))
{
- overlayButtons.add(initializeOverlayButton(getContext(), R.drawable.gcpad_z, ButtonType.BUTTON_Z));
+ overlayButtons.add(initializeOverlayButton(getContext(), R.drawable.gcpad_z, R.drawable.gcpad_z_pressed, ButtonType.BUTTON_Z));
}
if (mPreferences.getBoolean("buttonToggleGc5", true))
{
- overlayButtons.add(initializeOverlayButton(getContext(), R.drawable.gcpad_start, ButtonType.BUTTON_START));
+ overlayButtons.add(initializeOverlayButton(getContext(), R.drawable.gcpad_start, R.drawable.gcpad_start_pressed, ButtonType.BUTTON_START));
}
if (mPreferences.getBoolean("buttonToggleGc6", true))
{
- overlayButtons.add(initializeOverlayButton(getContext(), R.drawable.gcpad_l, ButtonType.TRIGGER_L));
+ overlayButtons.add(initializeOverlayButton(getContext(), R.drawable.gcpad_l, R.drawable.gcpad_l_pressed, ButtonType.TRIGGER_L));
}
if (mPreferences.getBoolean("buttonToggleGc7", true))
{
- overlayButtons.add(initializeOverlayButton(getContext(), R.drawable.gcpad_r, ButtonType.TRIGGER_R));
+ overlayButtons.add(initializeOverlayButton(getContext(), R.drawable.gcpad_r, R.drawable.gcpad_r_pressed, ButtonType.TRIGGER_R));
}
if (mPreferences.getBoolean("buttonToggleGc8", true))
{
overlayDpads.add(initializeOverlayDpad(getContext(), R.drawable.gcwii_dpad,
+ R.drawable.gcwii_dpad_pressed_one_direction, R.drawable.gcwii_dpad_pressed_two_directions,
ButtonType.BUTTON_UP, ButtonType.BUTTON_DOWN,
ButtonType.BUTTON_LEFT, ButtonType.BUTTON_RIGHT));
}
@@ -381,43 +430,45 @@ public final class InputOverlay extends SurfaceView implements OnTouchListener
{
if (mPreferences.getBoolean("buttonToggleWii0", true))
{
- overlayButtons.add(initializeOverlayButton(getContext(), R.drawable.wiimote_a, ButtonType.WIIMOTE_BUTTON_A));
+ overlayButtons.add(initializeOverlayButton(getContext(), R.drawable.wiimote_a, R.drawable.wiimote_a_pressed, ButtonType.WIIMOTE_BUTTON_A));
}
if (mPreferences.getBoolean("buttonToggleWii1", true))
{
- overlayButtons.add(initializeOverlayButton(getContext(), R.drawable.wiimote_b, ButtonType.WIIMOTE_BUTTON_B));
+ overlayButtons.add(initializeOverlayButton(getContext(), R.drawable.wiimote_b, R.drawable.wiimote_b_pressed, ButtonType.WIIMOTE_BUTTON_B));
}
if (mPreferences.getBoolean("buttonToggleWii2", true))
{
- overlayButtons.add(initializeOverlayButton(getContext(), R.drawable.wiimote_one, ButtonType.WIIMOTE_BUTTON_1));
+ overlayButtons.add(initializeOverlayButton(getContext(), R.drawable.wiimote_one, R.drawable.wiimote_one_pressed, ButtonType.WIIMOTE_BUTTON_1));
}
if (mPreferences.getBoolean("buttonToggleWii3", true))
{
- overlayButtons.add(initializeOverlayButton(getContext(), R.drawable.wiimote_two, ButtonType.WIIMOTE_BUTTON_2));
+ overlayButtons.add(initializeOverlayButton(getContext(), R.drawable.wiimote_two, R.drawable.wiimote_two_pressed, ButtonType.WIIMOTE_BUTTON_2));
}
if (mPreferences.getBoolean("buttonToggleWii4", true))
{
- overlayButtons.add(initializeOverlayButton(getContext(), R.drawable.wiimote_plus, ButtonType.WIIMOTE_BUTTON_PLUS));
+ overlayButtons.add(initializeOverlayButton(getContext(), R.drawable.wiimote_plus, R.drawable.wiimote_plus_pressed, ButtonType.WIIMOTE_BUTTON_PLUS));
}
if (mPreferences.getBoolean("buttonToggleWii5", true))
{
- overlayButtons.add(initializeOverlayButton(getContext(), R.drawable.wiimote_minus, ButtonType.WIIMOTE_BUTTON_MINUS));
+ overlayButtons.add(initializeOverlayButton(getContext(), R.drawable.wiimote_minus, R.drawable.wiimote_minus_pressed, ButtonType.WIIMOTE_BUTTON_MINUS));
}
if (mPreferences.getBoolean("buttonToggleWii6", true))
{
- overlayButtons.add(initializeOverlayButton(getContext(), R.drawable.wiimote_home, ButtonType.WIIMOTE_BUTTON_HOME));
+ overlayButtons.add(initializeOverlayButton(getContext(), R.drawable.wiimote_home, R.drawable.wiimote_home_pressed, ButtonType.WIIMOTE_BUTTON_HOME));
}
if (mPreferences.getBoolean("buttonToggleWii7", true))
{
if (mPreferences.getInt("wiiController", 3) == 2)
{
overlayDpads.add(initializeOverlayDpad(getContext(), R.drawable.gcwii_dpad,
+ R.drawable.gcwii_dpad_pressed_one_direction, R.drawable.gcwii_dpad_pressed_two_directions,
ButtonType.WIIMOTE_RIGHT, ButtonType.WIIMOTE_LEFT,
ButtonType.WIIMOTE_UP, ButtonType.WIIMOTE_DOWN));
}
else
{
overlayDpads.add(initializeOverlayDpad(getContext(), R.drawable.gcwii_dpad,
+ R.drawable.gcwii_dpad_pressed_one_direction, R.drawable.gcwii_dpad_pressed_two_directions,
ButtonType.WIIMOTE_UP, ButtonType.WIIMOTE_DOWN,
ButtonType.WIIMOTE_LEFT, ButtonType.WIIMOTE_RIGHT));
}
@@ -428,11 +479,11 @@ public final class InputOverlay extends SurfaceView implements OnTouchListener
{
if (mPreferences.getBoolean("buttonToggleWii8", true))
{
- overlayButtons.add(initializeOverlayButton(getContext(), R.drawable.nunchuk_c, ButtonType.NUNCHUK_BUTTON_C));
+ overlayButtons.add(initializeOverlayButton(getContext(), R.drawable.nunchuk_c, R.drawable.nunchuk_c_pressed, ButtonType.NUNCHUK_BUTTON_C));
}
if (mPreferences.getBoolean("buttonToggleWii9", true))
{
- overlayButtons.add(initializeOverlayButton(getContext(), R.drawable.nunchuk_z, ButtonType.NUNCHUK_BUTTON_Z));
+ overlayButtons.add(initializeOverlayButton(getContext(), R.drawable.nunchuk_z, R.drawable.nunchuk_z_pressed, ButtonType.NUNCHUK_BUTTON_Z));
}
if (mPreferences.getBoolean("buttonToggleWii10", true))
{
@@ -446,51 +497,52 @@ public final class InputOverlay extends SurfaceView implements OnTouchListener
{
if (mPreferences.getBoolean("buttonToggleClassic0", true))
{
- overlayButtons.add(initializeOverlayButton(getContext(), R.drawable.classic_a, ButtonType.CLASSIC_BUTTON_A));
+ overlayButtons.add(initializeOverlayButton(getContext(), R.drawable.classic_a, R.drawable.classic_a_pressed, ButtonType.CLASSIC_BUTTON_A));
}
if (mPreferences.getBoolean("buttonToggleClassic1", true))
{
- overlayButtons.add(initializeOverlayButton(getContext(), R.drawable.classic_b, ButtonType.CLASSIC_BUTTON_B));
+ overlayButtons.add(initializeOverlayButton(getContext(), R.drawable.classic_b, R.drawable.classic_b_pressed, ButtonType.CLASSIC_BUTTON_B));
}
if (mPreferences.getBoolean("buttonToggleClassic2", true))
{
- overlayButtons.add(initializeOverlayButton(getContext(), R.drawable.classic_x, ButtonType.CLASSIC_BUTTON_X));
+ overlayButtons.add(initializeOverlayButton(getContext(), R.drawable.classic_x, R.drawable.classic_x_pressed, ButtonType.CLASSIC_BUTTON_X));
}
if (mPreferences.getBoolean("buttonToggleClassic3", true))
{
- overlayButtons.add(initializeOverlayButton(getContext(), R.drawable.classic_y, ButtonType.CLASSIC_BUTTON_Y));
+ overlayButtons.add(initializeOverlayButton(getContext(), R.drawable.classic_y, R.drawable.classic_y_pressed, ButtonType.CLASSIC_BUTTON_Y));
}
if (mPreferences.getBoolean("buttonToggleClassic4", true))
{
- overlayButtons.add(initializeOverlayButton(getContext(), R.drawable.wiimote_plus, ButtonType.CLASSIC_BUTTON_PLUS));
+ overlayButtons.add(initializeOverlayButton(getContext(), R.drawable.wiimote_plus, R.drawable.wiimote_plus_pressed, ButtonType.CLASSIC_BUTTON_PLUS));
}
if (mPreferences.getBoolean("buttonToggleClassic5", true))
{
- overlayButtons.add(initializeOverlayButton(getContext(), R.drawable.wiimote_minus, ButtonType.CLASSIC_BUTTON_MINUS));
+ overlayButtons.add(initializeOverlayButton(getContext(), R.drawable.wiimote_minus, R.drawable.wiimote_minus_pressed, ButtonType.CLASSIC_BUTTON_MINUS));
}
if (mPreferences.getBoolean("buttonToggleClassic6", true))
{
- overlayButtons.add(initializeOverlayButton(getContext(), R.drawable.wiimote_home, ButtonType.CLASSIC_BUTTON_HOME));
+ overlayButtons.add(initializeOverlayButton(getContext(), R.drawable.wiimote_home, R.drawable.wiimote_home_pressed, ButtonType.CLASSIC_BUTTON_HOME));
}
if (mPreferences.getBoolean("buttonToggleClassic7", true))
{
- overlayButtons.add(initializeOverlayButton(getContext(), R.drawable.classic_l, ButtonType.CLASSIC_TRIGGER_L));
+ overlayButtons.add(initializeOverlayButton(getContext(), R.drawable.classic_l, R.drawable.classic_l_pressed, ButtonType.CLASSIC_TRIGGER_L));
}
if (mPreferences.getBoolean("buttonToggleClassic8", true))
{
- overlayButtons.add(initializeOverlayButton(getContext(), R.drawable.classic_r, ButtonType.CLASSIC_TRIGGER_R));
+ overlayButtons.add(initializeOverlayButton(getContext(), R.drawable.classic_r, R.drawable.classic_r_pressed, ButtonType.CLASSIC_TRIGGER_R));
}
if (mPreferences.getBoolean("buttonToggleClassic9", true))
{
- overlayButtons.add(initializeOverlayButton(getContext(), R.drawable.classic_zl, ButtonType.CLASSIC_BUTTON_ZL));
+ overlayButtons.add(initializeOverlayButton(getContext(), R.drawable.classic_zl, R.drawable.classic_zl_pressed, ButtonType.CLASSIC_BUTTON_ZL));
}
if (mPreferences.getBoolean("buttonToggleClassic10", true))
{
- overlayButtons.add(initializeOverlayButton(getContext(), R.drawable.classic_zr, ButtonType.CLASSIC_BUTTON_ZR));
+ overlayButtons.add(initializeOverlayButton(getContext(), R.drawable.classic_zr, R.drawable.classic_zr_pressed, ButtonType.CLASSIC_BUTTON_ZR));
}
if (mPreferences.getBoolean("buttonToggleClassic11", true))
{
overlayDpads.add(initializeOverlayDpad(getContext(), R.drawable.gcwii_dpad,
+ R.drawable.gcwii_dpad_pressed_one_direction, R.drawable.gcwii_dpad_pressed_two_directions,
ButtonType.CLASSIC_DPAD_UP, ButtonType.CLASSIC_DPAD_DOWN,
ButtonType.CLASSIC_DPAD_LEFT, ButtonType.CLASSIC_DPAD_RIGHT));
}
@@ -569,14 +621,15 @@ public final class InputOverlay extends SurfaceView implements OnTouchListener
* InputOverlayDrawableButton. Simply add it to the HashSet of overlay items and wait
* for Android to call the onDraw method.
*
- * @param context The current {@link Context}.
- * @param resId The resource ID of the {@link Drawable} to get the {@link Bitmap} of.
- * @param buttonId Identifier for determining what type of button the initialized InputOverlayDrawableButton represents.
+ * @param context The current {@link Context}.
+ * @param defaultResId The resource ID of the {@link Drawable} to get the {@link Bitmap} of (Default State).
+ * @param pressedResId The resource ID of the {@link Drawable} to get the {@link Bitmap} of (Pressed State).
+ * @param buttonId Identifier for determining what type of button the initialized InputOverlayDrawableButton represents.
*
* @return An {@link InputOverlayDrawableButton} with the correct drawing bounds set.
*
*/
- private static InputOverlayDrawableButton initializeOverlayButton(Context context, int resId, int buttonId)
+ private static InputOverlayDrawableButton initializeOverlayButton(Context context, int defaultResId, int pressedResId, int buttonId)
{
// Resources handle for fetching the initial Drawable resource.
final Resources res = context.getResources();
@@ -633,23 +686,21 @@ public final class InputOverlay extends SurfaceView implements OnTouchListener
scale /= 100;
// Initialize the InputOverlayDrawableButton.
- final Bitmap bitmap = resizeBitmap(context, BitmapFactory.decodeResource(res, resId), scale);
- final InputOverlayDrawableButton overlayDrawable = new InputOverlayDrawableButton(res, bitmap, buttonId);
+ final Bitmap defaultStateBitmap = resizeBitmap(context, BitmapFactory.decodeResource(res, defaultResId), scale);
+ final Bitmap pressedStateBitmap = resizeBitmap(context, BitmapFactory.decodeResource(res, pressedResId), scale);
+ final InputOverlayDrawableButton overlayDrawable = new InputOverlayDrawableButton(res, defaultStateBitmap, pressedStateBitmap, buttonId);
// The X and Y coordinates of the InputOverlayDrawableButton on the InputOverlay.
// These were set in the input overlay configuration menu.
int drawableX = (int) sPrefs.getFloat(buttonId + "-X", 0f);
int drawableY = (int) sPrefs.getFloat(buttonId + "-Y", 0f);
- // Intrinsic width and height of the InputOverlayDrawableButton.
- // For any who may not know, intrinsic width/height
- // are the original unmodified width and height of the image.
- int intrinWidth = overlayDrawable.getIntrinsicWidth();
- int intrinHeight = overlayDrawable.getIntrinsicHeight();
+ int width = overlayDrawable.getWidth();
+ int height = overlayDrawable.getHeight();
// Now set the bounds for the InputOverlayDrawableButton.
// This will dictate where on the screen (and the what the size) the InputOverlayDrawableButton will be.
- overlayDrawable.setBounds(drawableX, drawableY, drawableX + intrinWidth, drawableY + intrinHeight);
+ overlayDrawable.setBounds(drawableX, drawableY, drawableX + width, drawableY + height);
// Need to set the image's position
overlayDrawable.setPosition(drawableX, drawableY);
@@ -660,18 +711,25 @@ public final class InputOverlay extends SurfaceView implements OnTouchListener
/**
* Initializes an {@link InputOverlayDrawableDpad}
*
- * @param context The current {@link Context}.
- * @param resId The resource ID of the {@link Drawable} to get the {@link Bitmap} of.
- * @param buttonUp Identifier for the up button.
- * @param buttonDown Identifier for the down button.
- * @param buttonLeft Identifier for the left button.
- * @param buttonRight Identifier for the right button.
+ * @param context The current {@link Context}.
+ * @param defaultResId The {@link Bitmap} resource ID of the default sate.
+ * @param pressedOneDirectionResId The {@link Bitmap} resource ID of the pressed sate in one direction.
+ * @param pressedTwoDirectionsResId The {@link Bitmap} resource ID of the pressed sate in two directions.
+ * @param buttonUp Identifier for the up button.
+ * @param buttonDown Identifier for the down button.
+ * @param buttonLeft Identifier for the left button.
+ * @param buttonRight Identifier for the right button.
*
* @return the initialized {@link InputOverlayDrawableDpad}
*/
- private static InputOverlayDrawableDpad initializeOverlayDpad(Context context, int resId,
- int buttonUp, int buttonDown,
- int buttonLeft, int buttonRight)
+ private static InputOverlayDrawableDpad initializeOverlayDpad(Context context,
+ int defaultResId,
+ int pressedOneDirectionResId,
+ int pressedTwoDirectionsResId,
+ int buttonUp,
+ int buttonDown,
+ int buttonLeft,
+ int buttonRight)
{
// Resources handle for fetching the initial Drawable resource.
final Resources res = context.getResources();
@@ -699,8 +757,11 @@ public final class InputOverlay extends SurfaceView implements OnTouchListener
scale /= 100;
// Initialize the InputOverlayDrawableDpad.
- final Bitmap bitmap = resizeBitmap(context, BitmapFactory.decodeResource(res, resId), scale);
- final InputOverlayDrawableDpad overlayDrawable = new InputOverlayDrawableDpad(res, bitmap,
+ final Bitmap defaultStateBitmap = resizeBitmap(context, BitmapFactory.decodeResource(res, defaultResId), scale);
+ final Bitmap pressedOneDirectionStateBitmap = resizeBitmap(context, BitmapFactory.decodeResource(res, pressedOneDirectionResId), scale);
+ final Bitmap pressedTwoDirectionsStateBitmap = resizeBitmap(context, BitmapFactory.decodeResource(res, pressedTwoDirectionsResId), scale);
+ final InputOverlayDrawableDpad overlayDrawable = new InputOverlayDrawableDpad(res, defaultStateBitmap,
+ pressedOneDirectionStateBitmap, pressedTwoDirectionsStateBitmap,
buttonUp, buttonDown, buttonLeft, buttonRight);
// The X and Y coordinates of the InputOverlayDrawableDpad on the InputOverlay.
@@ -708,15 +769,12 @@ public final class InputOverlay extends SurfaceView implements OnTouchListener
int drawableX = (int) sPrefs.getFloat(buttonUp + "-X", 0f);
int drawableY = (int) sPrefs.getFloat(buttonUp + "-Y", 0f);
- // Intrinsic width and height of the InputOverlayDrawableDpad.
- // For any who may not know, intrinsic width/height
- // are the original unmodified width and height of the image.
- int intrinWidth = overlayDrawable.getIntrinsicWidth();
- int intrinHeight = overlayDrawable.getIntrinsicHeight();
+ int width = overlayDrawable.getWidth();
+ int height = overlayDrawable.getHeight();
// Now set the bounds for the InputOverlayDrawableDpad.
// This will dictate where on the screen (and the what the size) the InputOverlayDrawableDpad will be.
- overlayDrawable.setBounds(drawableX, drawableY, drawableX + intrinWidth, drawableY + intrinHeight);
+ overlayDrawable.setBounds(drawableX, drawableY, drawableX + width, drawableY + height);
// Need to set the image's position
overlayDrawable.setPosition(drawableX, drawableY);
diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/overlay/InputOverlayDrawableButton.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/overlay/InputOverlayDrawableButton.java
index 7d692c36ba..4d557b5f28 100644
--- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/overlay/InputOverlayDrawableButton.java
+++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/overlay/InputOverlayDrawableButton.java
@@ -8,33 +8,43 @@ package org.dolphinemu.dolphinemu.overlay;
import android.content.res.Resources;
import android.graphics.Bitmap;
+import android.graphics.Canvas;
import android.graphics.Rect;
import android.graphics.drawable.BitmapDrawable;
import android.view.MotionEvent;
-import android.view.View;
/**
* Custom {@link BitmapDrawable} that is capable
* of storing it's own ID.
*/
-public final class InputOverlayDrawableButton extends BitmapDrawable
+public final class InputOverlayDrawableButton
{
// The ID identifying what type of button this Drawable represents.
private int mButtonType;
private int mPreviousTouchX, mPreviousTouchY;
private int mControlPositionX, mControlPositionY;
+ private int mWidth;
+ private int mHeight;
+ private BitmapDrawable mDefaultStateBitmap;
+ private BitmapDrawable mPressedStateBitmap;
+ private boolean mPressedState = false;
/**
* Constructor
- *
- * @param res {@link Resources} instance.
- * @param bitmap {@link Bitmap} to use with this Drawable.
- * @param buttonType Identifier for this type of button.
+ *
+ * @param res {@link Resources} instance.
+ * @param defaultStateBitmap {@link Bitmap} to use with the default state Drawable.
+ * @param pressedStateBitmap {@link Bitmap} to use with the pressed state Drawable.
+ * @param buttonType Identifier for this type of button.
*/
- public InputOverlayDrawableButton(Resources res, Bitmap bitmap, int buttonType)
+ public InputOverlayDrawableButton(Resources res, Bitmap defaultStateBitmap, Bitmap pressedStateBitmap, int buttonType)
{
- super(res, bitmap);
+ mDefaultStateBitmap = new BitmapDrawable(res, defaultStateBitmap);
+ mPressedStateBitmap = new BitmapDrawable(res, pressedStateBitmap);
mButtonType = buttonType;
+
+ mWidth = mDefaultStateBitmap.getIntrinsicWidth();
+ mHeight = mDefaultStateBitmap.getIntrinsicHeight();
}
/**
@@ -61,7 +71,7 @@ public final class InputOverlayDrawableButton extends BitmapDrawable
case MotionEvent.ACTION_MOVE:
mControlPositionX += fingerPositionX - mPreviousTouchX;
mControlPositionY += fingerPositionY - mPreviousTouchY;
- setBounds(new Rect(mControlPositionX, mControlPositionY, getBitmap().getWidth() + mControlPositionX, getBitmap().getHeight() + mControlPositionY));
+ setBounds(mControlPositionX, mControlPositionY, getWidth() + mControlPositionX, getHeight() + mControlPositionY);
mPreviousTouchX = fingerPositionX;
mPreviousTouchY = fingerPositionY;
break;
@@ -75,4 +85,40 @@ public final class InputOverlayDrawableButton extends BitmapDrawable
mControlPositionX = x;
mControlPositionY = y;
}
+
+ public void draw(Canvas canvas)
+ {
+ getCurrentStateBitmapDrawable().draw(canvas);
+ }
+
+ private BitmapDrawable getCurrentStateBitmapDrawable()
+ {
+ return mPressedState ? mPressedStateBitmap : mDefaultStateBitmap;
+ }
+
+ public void setBounds(int left, int top, int right, int bottom)
+ {
+ mDefaultStateBitmap.setBounds(left, top, right, bottom);
+ mPressedStateBitmap.setBounds(left, top, right, bottom);
+ }
+
+ public Rect getBounds()
+ {
+ return mDefaultStateBitmap.getBounds();
+ }
+
+ public int getWidth()
+ {
+ return mWidth;
+ }
+
+ public int getHeight()
+ {
+ return mHeight;
+ }
+
+ public void setPressedState(boolean isPressed)
+ {
+ mPressedState = isPressed;
+ }
}
diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/overlay/InputOverlayDrawableDpad.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/overlay/InputOverlayDrawableDpad.java
index 56ee4b2e18..cd76ce8e87 100644
--- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/overlay/InputOverlayDrawableDpad.java
+++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/overlay/InputOverlayDrawableDpad.java
@@ -8,43 +8,123 @@ package org.dolphinemu.dolphinemu.overlay;
import android.content.res.Resources;
import android.graphics.Bitmap;
+import android.graphics.Canvas;
import android.graphics.Rect;
import android.graphics.drawable.BitmapDrawable;
import android.view.MotionEvent;
-import android.view.View;
/**
* Custom {@link BitmapDrawable} that is capable
* of storing it's own ID.
*/
-public final class InputOverlayDrawableDpad extends BitmapDrawable
+public final class InputOverlayDrawableDpad
{
// The ID identifying what type of button this Drawable represents.
private int[] mButtonType = new int[4];
private int mPreviousTouchX, mPreviousTouchY;
private int mControlPositionX, mControlPositionY;
+ private int mWidth;
+ private int mHeight;
+ private BitmapDrawable mDefaultStateBitmap;
+ private BitmapDrawable mPressedOneDirectionStateBitmap;
+ private BitmapDrawable mPressedTwoDirectionsStateBitmap;
+ private int mPressState = STATE_DEFAULT;
+
+ public static final int STATE_DEFAULT = 0;
+ public static final int STATE_PRESSED_UP = 1;
+ public static final int STATE_PRESSED_DOWN = 2;
+ public static final int STATE_PRESSED_LEFT = 3;
+ public static final int STATE_PRESSED_RIGHT = 4;
+ public static final int STATE_PRESSED_UP_LEFT = 5;
+ public static final int STATE_PRESSED_UP_RIGHT = 6;
+ public static final int STATE_PRESSED_DOWN_LEFT = 7;
+ public static final int STATE_PRESSED_DOWN_RIGHT = 8;
/**
* Constructor
*
- * @param res {@link Resources} instance.
- * @param bitmap {@link Bitmap} to use with this Drawable.
- * @param buttonUp Identifier for the up button.
- * @param buttonDown Identifier for the down button.
- * @param buttonLeft Identifier for the left button.
- * @param buttonRight Identifier for the right button.
+ * @param res {@link Resources} instance.
+ * @param defaultStateBitmap {@link Bitmap} of the default state.
+ * @param pressedOneDirectionStateBitmap {@link Bitmap} of the pressed state in one direction.
+ * @param pressedTwoDirectionsStateBitmap {@link Bitmap} of the pressed state in two direction.
+ * @param buttonUp Identifier for the up button.
+ * @param buttonDown Identifier for the down button.
+ * @param buttonLeft Identifier for the left button.
+ * @param buttonRight Identifier for the right button.
*/
- public InputOverlayDrawableDpad(Resources res, Bitmap bitmap,
- int buttonUp, int buttonDown,
- int buttonLeft, int buttonRight)
+ public InputOverlayDrawableDpad(Resources res,
+ Bitmap defaultStateBitmap,
+ Bitmap pressedOneDirectionStateBitmap,
+ Bitmap pressedTwoDirectionsStateBitmap,
+ int buttonUp, int buttonDown,
+ int buttonLeft, int buttonRight)
{
- super(res, bitmap);
+ mDefaultStateBitmap = new BitmapDrawable(res, defaultStateBitmap);
+ mPressedOneDirectionStateBitmap = new BitmapDrawable(res, pressedOneDirectionStateBitmap);
+ mPressedTwoDirectionsStateBitmap = new BitmapDrawable(res, pressedTwoDirectionsStateBitmap);
+
+ mWidth = mDefaultStateBitmap.getIntrinsicWidth();
+ mHeight = mDefaultStateBitmap.getIntrinsicHeight();
+
mButtonType[0] = buttonUp;
mButtonType[1] = buttonDown;
mButtonType[2] = buttonLeft;
mButtonType[3] = buttonRight;
}
+ public void draw(Canvas canvas)
+ {
+ int px = mControlPositionX + (getWidth()/2);
+ int py = mControlPositionY + (getHeight()/2);
+ switch (mPressState) {
+ case STATE_DEFAULT:
+ mDefaultStateBitmap.draw(canvas);
+ break;
+ case STATE_PRESSED_UP:
+ mPressedOneDirectionStateBitmap.draw(canvas);
+ break;
+ case STATE_PRESSED_RIGHT:
+ canvas.save();
+ canvas.rotate(90, px, py);
+ mPressedOneDirectionStateBitmap.draw(canvas);
+ canvas.restore();
+ break;
+ case STATE_PRESSED_DOWN:
+ canvas.save();
+ canvas.rotate(180, px, py);
+ mPressedOneDirectionStateBitmap.draw(canvas);
+ canvas.restore();
+ break;
+ case STATE_PRESSED_LEFT:
+ canvas.save();
+ canvas.rotate(270, px, py);
+ mPressedOneDirectionStateBitmap.draw(canvas);
+ canvas.restore();
+ break;
+ case STATE_PRESSED_UP_LEFT:
+ mPressedTwoDirectionsStateBitmap.draw(canvas);
+ break;
+ case STATE_PRESSED_UP_RIGHT:
+ canvas.save();
+ canvas.rotate(90, px, py);
+ mPressedTwoDirectionsStateBitmap.draw(canvas);
+ canvas.restore();
+ break;
+ case STATE_PRESSED_DOWN_RIGHT:
+ canvas.save();
+ canvas.rotate(180, px, py);
+ mPressedTwoDirectionsStateBitmap.draw(canvas);
+ canvas.restore();
+ break;
+ case STATE_PRESSED_DOWN_LEFT:
+ canvas.save();
+ canvas.rotate(270, px, py);
+ mPressedTwoDirectionsStateBitmap.draw(canvas);
+ canvas.restore();
+ break;
+ }
+ }
+
/**
* Gets one of the InputOverlayDrawableDpad's button IDs.
*
@@ -69,7 +149,7 @@ public final class InputOverlayDrawableDpad extends BitmapDrawable
case MotionEvent.ACTION_MOVE:
mControlPositionX += fingerPositionX - mPreviousTouchX;
mControlPositionY += fingerPositionY - mPreviousTouchY;
- setBounds(new Rect(mControlPositionX, mControlPositionY, getBitmap().getWidth() + mControlPositionX, getBitmap().getHeight() + mControlPositionY));
+ setBounds(mControlPositionX, mControlPositionY, getWidth() + mControlPositionX, getHeight() + mControlPositionY);
mPreviousTouchX = fingerPositionX;
mPreviousTouchY = fingerPositionY;
break;
@@ -83,4 +163,28 @@ public final class InputOverlayDrawableDpad extends BitmapDrawable
mControlPositionX = x;
mControlPositionY = y;
}
+
+ public void setBounds(int left, int top, int right, int bottom)
+ {
+ mDefaultStateBitmap.setBounds(left, top, right, bottom);
+ mPressedOneDirectionStateBitmap.setBounds(left, top, right, bottom);
+ mPressedTwoDirectionsStateBitmap.setBounds(left, top, right, bottom);
+ }
+
+ public Rect getBounds()
+ {
+ return mDefaultStateBitmap.getBounds();
+ }
+
+ public int getWidth() {
+ return mWidth;
+ }
+
+ public int getHeight() {
+ return mHeight;
+ }
+
+ public void setState(int pressState) {
+ mPressState = pressState;
+ }
}
diff --git a/Source/Android/app/src/main/res/drawable-xxxhdpi/gcwii_dpad_pressed_one_direction.png b/Source/Android/app/src/main/res/drawable-xxxhdpi/gcwii_dpad_pressed_one_direction.png
new file mode 100644
index 0000000000..4f0219b3a4
--- /dev/null
+++ b/Source/Android/app/src/main/res/drawable-xxxhdpi/gcwii_dpad_pressed_one_direction.png
Binary files differ
diff --git a/Source/Android/app/src/main/res/drawable-xxxhdpi/gcwii_dpad_pressed_two_directions.png b/Source/Android/app/src/main/res/drawable-xxxhdpi/gcwii_dpad_pressed_two_directions.png
new file mode 100644
index 0000000000..230a1486ef
--- /dev/null
+++ b/Source/Android/app/src/main/res/drawable-xxxhdpi/gcwii_dpad_pressed_two_directions.png
Binary files differ