|
|
@@ -13,32 +13,30 @@ import android.graphics.Rect;
|
|
|
import android.graphics.drawable.BitmapDrawable;
|
|
|
import android.view.MotionEvent;
|
|
|
|
|
|
+import org.yuzu.yuzu_emu.NativeLibrary.ButtonState;
|
|
|
+
|
|
|
/**
|
|
|
* Custom {@link BitmapDrawable} that is capable
|
|
|
* of storing it's own ID.
|
|
|
*/
|
|
|
public final class InputOverlayDrawableDpad {
|
|
|
- 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;
|
|
|
public static final float VIRT_AXIS_DEADZONE = 0.5f;
|
|
|
// The ID identifying what type of button this Drawable represents.
|
|
|
- private int[] mButtonType = new int[4];
|
|
|
+ private int mUpButtonId;
|
|
|
+ private int mDownButtonId;
|
|
|
+ private int mLeftButtonId;
|
|
|
+ private int mRightButtonId;
|
|
|
private int mTrackId;
|
|
|
- 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;
|
|
|
+ private boolean mUpButtonState;
|
|
|
+ private boolean mDownButtonState;
|
|
|
+ private boolean mLeftButtonState;
|
|
|
+ private boolean mRightButtonState;
|
|
|
|
|
|
/**
|
|
|
* Constructor
|
|
|
@@ -65,64 +63,147 @@ public final class InputOverlayDrawableDpad {
|
|
|
mWidth = mDefaultStateBitmap.getIntrinsicWidth();
|
|
|
mHeight = mDefaultStateBitmap.getIntrinsicHeight();
|
|
|
|
|
|
- mButtonType[0] = buttonUp;
|
|
|
- mButtonType[1] = buttonDown;
|
|
|
- mButtonType[2] = buttonLeft;
|
|
|
- mButtonType[3] = buttonRight;
|
|
|
+ mUpButtonId = buttonUp;
|
|
|
+ mDownButtonId = buttonDown;
|
|
|
+ mLeftButtonId = buttonLeft;
|
|
|
+ mRightButtonId = buttonRight;
|
|
|
|
|
|
mTrackId = -1;
|
|
|
}
|
|
|
|
|
|
+ public boolean updateStatus(MotionEvent event, boolean dpad_slide) {
|
|
|
+ int pointerIndex = event.getActionIndex();
|
|
|
+ int xPosition = (int) event.getX(pointerIndex);
|
|
|
+ int yPosition = (int) event.getY(pointerIndex);
|
|
|
+ int pointerId = event.getPointerId(pointerIndex);
|
|
|
+ int motion_event = event.getAction() & MotionEvent.ACTION_MASK;
|
|
|
+ boolean isActionDown = motion_event == MotionEvent.ACTION_DOWN || motion_event == MotionEvent.ACTION_POINTER_DOWN;
|
|
|
+ boolean isActionUp = motion_event == MotionEvent.ACTION_UP || motion_event == MotionEvent.ACTION_POINTER_UP;
|
|
|
+
|
|
|
+ if (isActionDown) {
|
|
|
+ if (!getBounds().contains(xPosition, yPosition)) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ mTrackId = pointerId;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (isActionUp) {
|
|
|
+ if (mTrackId != pointerId) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ mTrackId = -1;
|
|
|
+ mUpButtonState = false;
|
|
|
+ mDownButtonState = false;
|
|
|
+ mLeftButtonState = false;
|
|
|
+ mRightButtonState = false;
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (mTrackId == -1) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!dpad_slide && !isActionDown) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (int i = 0; i < event.getPointerCount(); i++) {
|
|
|
+ if (mTrackId != event.getPointerId(i)) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ float touchX = event.getX(i);
|
|
|
+ float touchY = event.getY(i);
|
|
|
+ float maxY = getBounds().bottom;
|
|
|
+ float maxX = getBounds().right;
|
|
|
+ touchX -= getBounds().centerX();
|
|
|
+ maxX -= getBounds().centerX();
|
|
|
+ touchY -= getBounds().centerY();
|
|
|
+ maxY -= getBounds().centerY();
|
|
|
+ final float AxisX = touchX / maxX;
|
|
|
+ final float AxisY = touchY / maxY;
|
|
|
+
|
|
|
+ mUpButtonState = AxisY < -InputOverlayDrawableDpad.VIRT_AXIS_DEADZONE;
|
|
|
+ mDownButtonState = AxisY > InputOverlayDrawableDpad.VIRT_AXIS_DEADZONE;
|
|
|
+ mLeftButtonState = AxisX < -InputOverlayDrawableDpad.VIRT_AXIS_DEADZONE;
|
|
|
+ mRightButtonState = AxisX > InputOverlayDrawableDpad.VIRT_AXIS_DEADZONE;
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
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;
|
|
|
+
|
|
|
+ // Pressed up
|
|
|
+ if (mUpButtonState && !mLeftButtonState && !mRightButtonState) {
|
|
|
+ mPressedOneDirectionStateBitmap.draw(canvas);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ // Pressed down
|
|
|
+ if (mDownButtonState && !mLeftButtonState && !mRightButtonState) {
|
|
|
+ canvas.save();
|
|
|
+ canvas.rotate(180, px, py);
|
|
|
+ mPressedOneDirectionStateBitmap.draw(canvas);
|
|
|
+ canvas.restore();
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ // Pressed left
|
|
|
+ if (mLeftButtonState && !mUpButtonState && !mDownButtonState) {
|
|
|
+ canvas.save();
|
|
|
+ canvas.rotate(270, px, py);
|
|
|
+ mPressedOneDirectionStateBitmap.draw(canvas);
|
|
|
+ canvas.restore();
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ // Pressed right
|
|
|
+ if (mRightButtonState && !mUpButtonState && !mDownButtonState) {
|
|
|
+ canvas.save();
|
|
|
+ canvas.rotate(90, px, py);
|
|
|
+ mPressedOneDirectionStateBitmap.draw(canvas);
|
|
|
+ canvas.restore();
|
|
|
+ return;
|
|
|
}
|
|
|
+
|
|
|
+ // Pressed up left
|
|
|
+ if (mUpButtonState && mLeftButtonState && !mRightButtonState) {
|
|
|
+ mPressedTwoDirectionsStateBitmap.draw(canvas);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ // Pressed up right
|
|
|
+ if (mUpButtonState && !mLeftButtonState && mRightButtonState) {
|
|
|
+ canvas.save();
|
|
|
+ canvas.rotate(180, px, py);
|
|
|
+ mPressedTwoDirectionsStateBitmap.draw(canvas);
|
|
|
+ canvas.restore();
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ // Pressed down left
|
|
|
+ if (mDownButtonState && mLeftButtonState && !mRightButtonState) {
|
|
|
+ canvas.save();
|
|
|
+ canvas.rotate(270, px, py);
|
|
|
+ mPressedTwoDirectionsStateBitmap.draw(canvas);
|
|
|
+ canvas.restore();
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ // Pressed down right
|
|
|
+ if (mDownButtonState && !mLeftButtonState && mRightButtonState) {
|
|
|
+ canvas.save();
|
|
|
+ canvas.rotate(180, px, py);
|
|
|
+ mPressedTwoDirectionsStateBitmap.draw(canvas);
|
|
|
+ canvas.restore();
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ // Not pressed
|
|
|
+ mDefaultStateBitmap.draw(canvas);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -130,38 +211,40 @@ public final class InputOverlayDrawableDpad {
|
|
|
*
|
|
|
* @return the requested InputOverlayDrawableDpad's button ID.
|
|
|
*/
|
|
|
- public int getId(int direction) {
|
|
|
- return mButtonType[direction];
|
|
|
+ public int getUpId() {
|
|
|
+ return mUpButtonId;
|
|
|
+ }
|
|
|
+
|
|
|
+ public int getDownId() {
|
|
|
+ return mDownButtonId;
|
|
|
+ }
|
|
|
+
|
|
|
+ public int getLeftId() {
|
|
|
+ return mLeftButtonId;
|
|
|
+ }
|
|
|
+
|
|
|
+ public int getRightId() {
|
|
|
+ return mRightButtonId;
|
|
|
}
|
|
|
|
|
|
public int getTrackId() {
|
|
|
return mTrackId;
|
|
|
}
|
|
|
|
|
|
- public void setTrackId(int trackId) {
|
|
|
- mTrackId = trackId;
|
|
|
+ public int getUpStatus() {
|
|
|
+ return mUpButtonState ? ButtonState.PRESSED : ButtonState.RELEASED;
|
|
|
}
|
|
|
|
|
|
- public boolean onConfigureTouch(MotionEvent event) {
|
|
|
- int pointerIndex = event.getActionIndex();
|
|
|
- int fingerPositionX = (int) event.getX(pointerIndex);
|
|
|
- int fingerPositionY = (int) event.getY(pointerIndex);
|
|
|
- switch (event.getAction()) {
|
|
|
- case MotionEvent.ACTION_DOWN:
|
|
|
- mPreviousTouchX = fingerPositionX;
|
|
|
- mPreviousTouchY = fingerPositionY;
|
|
|
- break;
|
|
|
- case MotionEvent.ACTION_MOVE:
|
|
|
- mControlPositionX += fingerPositionX - mPreviousTouchX;
|
|
|
- mControlPositionY += fingerPositionY - mPreviousTouchY;
|
|
|
- setBounds(mControlPositionX, mControlPositionY, getWidth() + mControlPositionX,
|
|
|
- getHeight() + mControlPositionY);
|
|
|
- mPreviousTouchX = fingerPositionX;
|
|
|
- mPreviousTouchY = fingerPositionY;
|
|
|
- break;
|
|
|
+ public int getDownStatus() {
|
|
|
+ return mDownButtonState ? ButtonState.PRESSED : ButtonState.RELEASED;
|
|
|
+ }
|
|
|
|
|
|
- }
|
|
|
- return true;
|
|
|
+ public int getLeftStatus() {
|
|
|
+ return mLeftButtonState ? ButtonState.PRESSED : ButtonState.RELEASED;
|
|
|
+ }
|
|
|
+
|
|
|
+ public int getRightStatus() {
|
|
|
+ return mRightButtonState ? ButtonState.PRESSED : ButtonState.RELEASED;
|
|
|
}
|
|
|
|
|
|
public void setPosition(int x, int y) {
|
|
|
@@ -186,8 +269,4 @@ public final class InputOverlayDrawableDpad {
|
|
|
public int getHeight() {
|
|
|
return mHeight;
|
|
|
}
|
|
|
-
|
|
|
- public void setState(int pressState) {
|
|
|
- mPressState = pressState;
|
|
|
- }
|
|
|
}
|