forked from suyu/suyu
android: Convert InputOverlayDrawableButton to Kotlin
This commit is contained in:
parent
a1c57de466
commit
0177e908e9
2 changed files with 118 additions and 139 deletions
|
@ -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
|
||||||
|
}
|
Loading…
Reference in a new issue