committed by
bunnei
2 changed files with 118 additions and 139 deletions
-
139src/android/app/src/main/java/org/yuzu/yuzu_emu/overlay/InputOverlayDrawableButton.java
-
118src/android/app/src/main/java/org/yuzu/yuzu_emu/overlay/InputOverlayDrawableButton.kt
@ -1,139 +0,0 @@ |
|||||
/** |
|
||||
* Copyright 2013 Dolphin Emulator Project |
|
||||
* Licensed under GPLv2+ |
|
||||
* Refer to the license.txt file included. |
|
||||
*/ |
|
||||
|
|
||||
package org.yuzu.yuzu_emu.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 org.yuzu.yuzu_emu.NativeLibrary.ButtonState; |
|
||||
|
|
||||
|
|
||||
/** |
|
||||
* Custom {@link BitmapDrawable} that is capable |
|
||||
* of storing it's own ID. |
|
||||
*/ |
|
||||
public final class InputOverlayDrawableButton { |
|
||||
// The ID value what type of button this Drawable represents. |
|
||||
private int mButtonId; |
|
||||
|
|
||||
// The ID value what motion event is tracking |
|
||||
private int mTrackId; |
|
||||
|
|
||||
// The drawable position on the screen |
|
||||
private int mButtonPositionX, mButtonPositionY; |
|
||||
private int mWidth; |
|
||||
private int mHeight; |
|
||||
private BitmapDrawable mDefaultStateBitmap; |
|
||||
private BitmapDrawable mPressedStateBitmap; |
|
||||
private boolean mPressedState = false; |
|
||||
|
|
||||
/** |
|
||||
* Constructor |
|
||||
* |
|
||||
* @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 buttonId Identifier for this type of button. |
|
||||
*/ |
|
||||
public InputOverlayDrawableButton(Resources res, Bitmap defaultStateBitmap, |
|
||||
Bitmap pressedStateBitmap, int buttonId) { |
|
||||
mDefaultStateBitmap = new BitmapDrawable(res, defaultStateBitmap); |
|
||||
mPressedStateBitmap = new BitmapDrawable(res, pressedStateBitmap); |
|
||||
mButtonId = buttonId; |
|
||||
mTrackId = -1; |
|
||||
|
|
||||
mWidth = mDefaultStateBitmap.getIntrinsicWidth(); |
|
||||
mHeight = mDefaultStateBitmap.getIntrinsicHeight(); |
|
||||
} |
|
||||
|
|
||||
/** |
|
||||
* Updates button status based on the motion event. |
|
||||
* |
|
||||
* @return true if value was changed |
|
||||
*/ |
|
||||
public boolean updateStatus(MotionEvent event) { |
|
||||
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; |
|
||||
boolean current_state = mPressedState; |
|
||||
|
|
||||
if (isActionDown) { |
|
||||
if (!getBounds().contains(xPosition, yPosition)) { |
|
||||
return false; |
|
||||
} |
|
||||
mPressedState = true; |
|
||||
mTrackId = pointerId; |
|
||||
return true; |
|
||||
} |
|
||||
|
|
||||
if (isActionUp) { |
|
||||
if (mTrackId != pointerId) { |
|
||||
return false; |
|
||||
} |
|
||||
mPressedState = false; |
|
||||
mTrackId = -1; |
|
||||
return true; |
|
||||
} |
|
||||
|
|
||||
return false; |
|
||||
} |
|
||||
|
|
||||
public void setPosition(int x, int y) { |
|
||||
mButtonPositionX = x; |
|
||||
mButtonPositionY = 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); |
|
||||
} |
|
||||
|
|
||||
/** |
|
||||
* Gets this InputOverlayDrawableButton's button ID. |
|
||||
* |
|
||||
* @return this InputOverlayDrawableButton's button ID. |
|
||||
*/ |
|
||||
public int getId() { |
|
||||
return mButtonId; |
|
||||
} |
|
||||
|
|
||||
public int getTrackId() { |
|
||||
return mTrackId; |
|
||||
} |
|
||||
|
|
||||
public int getStatus() { |
|
||||
return mPressedState ? ButtonState.PRESSED : ButtonState.RELEASED; |
|
||||
} |
|
||||
|
|
||||
private Rect getBounds() { |
|
||||
return mDefaultStateBitmap.getBounds(); |
|
||||
} |
|
||||
|
|
||||
public int getWidth() { |
|
||||
return mWidth; |
|
||||
} |
|
||||
|
|
||||
public int getHeight() { |
|
||||
return mHeight; |
|
||||
} |
|
||||
} |
|
||||
@ -0,0 +1,118 @@ |
|||||
|
/** |
||||
|
* Copyright 2013 Dolphin Emulator Project |
||||
|
* Licensed under GPLv2+ |
||||
|
* Refer to the license.txt file included. |
||||
|
*/ |
||||
|
package org.yuzu.yuzu_emu.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 org.yuzu.yuzu_emu.NativeLibrary.ButtonState |
||||
|
|
||||
|
/** |
||||
|
* Custom [BitmapDrawable] that is capable |
||||
|
* of storing it's own ID. |
||||
|
* |
||||
|
* @param res [Resources] instance. |
||||
|
* @param defaultStateBitmap [Bitmap] to use with the default state Drawable. |
||||
|
* @param pressedStateBitmap [Bitmap] to use with the pressed state Drawable. |
||||
|
* @param buttonId Identifier for this type of button. |
||||
|
*/ |
||||
|
class InputOverlayDrawableButton( |
||||
|
res: Resources, |
||||
|
defaultStateBitmap: Bitmap, |
||||
|
pressedStateBitmap: Bitmap, |
||||
|
buttonId: Int |
||||
|
) { |
||||
|
/** |
||||
|
* Gets this InputOverlayDrawableButton's button ID. |
||||
|
* |
||||
|
* @return this InputOverlayDrawableButton's button ID. |
||||
|
*/ |
||||
|
// The ID value what type of button this Drawable represents. |
||||
|
val id: Int |
||||
|
|
||||
|
// The ID value what motion event is tracking |
||||
|
var trackId: Int |
||||
|
|
||||
|
// The drawable position on the screen |
||||
|
private var buttonPositionX = 0 |
||||
|
private var buttonPositionY = 0 |
||||
|
val width: Int |
||||
|
val height: Int |
||||
|
private val defaultStateBitmap: BitmapDrawable |
||||
|
private val pressedStateBitmap: BitmapDrawable |
||||
|
private var pressedState = false |
||||
|
|
||||
|
init { |
||||
|
this.defaultStateBitmap = BitmapDrawable(res, defaultStateBitmap) |
||||
|
this.pressedStateBitmap = BitmapDrawable(res, pressedStateBitmap) |
||||
|
id = buttonId |
||||
|
trackId = -1 |
||||
|
width = this.defaultStateBitmap.intrinsicWidth |
||||
|
height = this.defaultStateBitmap.intrinsicHeight |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Updates button status based on the motion event. |
||||
|
* |
||||
|
* @return true if value was changed |
||||
|
*/ |
||||
|
fun updateStatus(event: MotionEvent): Boolean { |
||||
|
val pointerIndex = event.actionIndex |
||||
|
val xPosition = event.getX(pointerIndex).toInt() |
||||
|
val yPosition = event.getY(pointerIndex).toInt() |
||||
|
val pointerId = event.getPointerId(pointerIndex) |
||||
|
val motionEvent = event.action and MotionEvent.ACTION_MASK |
||||
|
val isActionDown = |
||||
|
motionEvent == MotionEvent.ACTION_DOWN || motionEvent == MotionEvent.ACTION_POINTER_DOWN |
||||
|
val isActionUp = |
||||
|
motionEvent == MotionEvent.ACTION_UP || motionEvent == MotionEvent.ACTION_POINTER_UP |
||||
|
|
||||
|
if (isActionDown) { |
||||
|
if (!bounds.contains(xPosition, yPosition)) { |
||||
|
return false |
||||
|
} |
||||
|
pressedState = true |
||||
|
trackId = pointerId |
||||
|
return true |
||||
|
} |
||||
|
|
||||
|
if (isActionUp) { |
||||
|
if (trackId != pointerId) { |
||||
|
return false |
||||
|
} |
||||
|
pressedState = false |
||||
|
trackId = -1 |
||||
|
return true |
||||
|
} |
||||
|
|
||||
|
return false |
||||
|
} |
||||
|
|
||||
|
fun setPosition(x: Int, y: Int) { |
||||
|
buttonPositionX = x |
||||
|
buttonPositionY = y |
||||
|
} |
||||
|
|
||||
|
fun draw(canvas: Canvas?) { |
||||
|
currentStateBitmapDrawable.draw(canvas!!) |
||||
|
} |
||||
|
|
||||
|
private val currentStateBitmapDrawable: BitmapDrawable |
||||
|
get() = if (pressedState) pressedStateBitmap else defaultStateBitmap |
||||
|
|
||||
|
fun setBounds(left: Int, top: Int, right: Int, bottom: Int) { |
||||
|
defaultStateBitmap.setBounds(left, top, right, bottom) |
||||
|
pressedStateBitmap.setBounds(left, top, right, bottom) |
||||
|
} |
||||
|
|
||||
|
val status: Int |
||||
|
get() = if (pressedState) ButtonState.PRESSED else ButtonState.RELEASED |
||||
|
private val bounds: Rect |
||||
|
get() = defaultStateBitmap.bounds |
||||
|
} |
||||
Write
Preview
Loading…
Cancel
Save
Reference in new issue