[Android] Documentation and some cleanup.
This commit is contained in:
parent
1e90a838f2
commit
07765aa6f0
|
@ -45,7 +45,7 @@ public final class NativeLibrary
|
||||||
/**
|
/**
|
||||||
* Button states
|
* Button states
|
||||||
*/
|
*/
|
||||||
public class ButtonState
|
public static final class ButtonState
|
||||||
{
|
{
|
||||||
public static final int RELEASED = 0;
|
public static final int RELEASED = 0;
|
||||||
public static final int PRESSED = 1;
|
public static final int PRESSED = 1;
|
||||||
|
@ -60,12 +60,13 @@ public final class NativeLibrary
|
||||||
public static native void onTouchEvent(int Button, int Action);
|
public static native void onTouchEvent(int Button, int Action);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Handles touch events.
|
* Handles axis-related touch events.
|
||||||
*
|
*
|
||||||
* @param Button Key code identifying which button was pressed.
|
* @param Axis Axis ID for the type of axis being altered. (Example: Main stick up, down, left, right, etc).
|
||||||
* @param Action Mask for the action being performed.
|
* @param force How 'far down' the joystick is pushed down. 0.0f indicates center (or no force),
|
||||||
|
* 1.0f indicates max force (or joystick pushed all the way down in any arbitrary direction).
|
||||||
*/
|
*/
|
||||||
public static native void onTouchAxisEvent(int Axis, float loc);
|
public static native void onTouchAxisEvent(int Axis, float force);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Handles button press events for a gamepad.
|
* Handles button press events for a gamepad.
|
||||||
|
|
|
@ -13,9 +13,7 @@ import android.graphics.*;
|
||||||
import android.graphics.drawable.Drawable;
|
import android.graphics.drawable.Drawable;
|
||||||
import android.preference.PreferenceManager;
|
import android.preference.PreferenceManager;
|
||||||
import android.util.AttributeSet;
|
import android.util.AttributeSet;
|
||||||
import android.util.Log;
|
|
||||||
import android.view.MotionEvent;
|
import android.view.MotionEvent;
|
||||||
import android.view.SurfaceHolder;
|
|
||||||
import android.view.SurfaceView;
|
import android.view.SurfaceView;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.View.OnTouchListener;
|
import android.view.View.OnTouchListener;
|
||||||
|
@ -26,21 +24,16 @@ import org.dolphinemu.dolphinemu.R;
|
||||||
|
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.concurrent.CountDownLatch;
|
|
||||||
import java.util.concurrent.Semaphore;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Draws the interactive input overlay on top of the
|
* Draws the interactive input overlay on top of the
|
||||||
* {@link NativeGLSurfaceView} that is rendering emulation.
|
* {@link NativeGLSurfaceView} that is rendering emulation.
|
||||||
*/
|
*/
|
||||||
public final class InputOverlay extends SurfaceView implements OnTouchListener, Runnable
|
public final class InputOverlay extends SurfaceView implements OnTouchListener
|
||||||
{
|
{
|
||||||
private final Set<InputOverlayDrawableButton> overlayButtons = new HashSet<InputOverlayDrawableButton>();
|
private final Set<InputOverlayDrawableButton> overlayButtons = new HashSet<InputOverlayDrawableButton>();
|
||||||
private final Set<InputOverlayDrawableJoystick> overlayJoysticks = new HashSet<InputOverlayDrawableJoystick>();
|
private final Set<InputOverlayDrawableJoystick> overlayJoysticks = new HashSet<InputOverlayDrawableJoystick>();
|
||||||
Semaphore _sema;
|
|
||||||
|
|
||||||
SurfaceHolder surfaceHolder;
|
|
||||||
Thread thread = null;
|
|
||||||
/**
|
/**
|
||||||
* Constructor
|
* Constructor
|
||||||
*
|
*
|
||||||
|
@ -68,56 +61,40 @@ public final class InputOverlay extends SurfaceView implements OnTouchListener,
|
||||||
|
|
||||||
// Request focus for the overlay so it has priority on presses.
|
// Request focus for the overlay so it has priority on presses.
|
||||||
requestFocus();
|
requestFocus();
|
||||||
_sema = new Semaphore(0);
|
}
|
||||||
|
|
||||||
surfaceHolder = getHolder();
|
|
||||||
surfaceHolder.setFormat(PixelFormat.TRANSPARENT);
|
|
||||||
thread = new Thread(this);
|
|
||||||
thread.start();
|
|
||||||
}
|
|
||||||
private boolean Draw()
|
|
||||||
{
|
|
||||||
if(surfaceHolder.getSurface().isValid()){
|
|
||||||
// Draw everything
|
|
||||||
Canvas canvas = surfaceHolder.lockCanvas();
|
|
||||||
canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);
|
|
||||||
for (InputOverlayDrawableButton item : overlayButtons)
|
|
||||||
item.draw(canvas);
|
|
||||||
for (InputOverlayDrawableJoystick item : overlayJoysticks)
|
|
||||||
item.Draw(canvas);
|
|
||||||
surfaceHolder.unlockCanvasAndPost(canvas);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void draw(Canvas canvas)
|
||||||
boolean didFirstPost = false;
|
{
|
||||||
while(!didFirstPost)
|
super.onDraw(canvas);
|
||||||
if (Draw())
|
|
||||||
didFirstPost = true;
|
for (InputOverlayDrawableButton button : overlayButtons)
|
||||||
while(true){
|
{
|
||||||
try
|
button.draw(canvas);
|
||||||
{
|
}
|
||||||
_sema.acquire();
|
|
||||||
Draw();
|
for (InputOverlayDrawableJoystick joystick: overlayJoysticks)
|
||||||
} catch (InterruptedException ex) {}
|
{
|
||||||
|
joystick.draw(canvas);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean onTouch(View v, MotionEvent event)
|
public boolean onTouch(View v, MotionEvent event)
|
||||||
{
|
{
|
||||||
// Determine the button state to apply based on the MotionEvent action flag.
|
// Determine the button state to apply based on the MotionEvent action flag.
|
||||||
// TODO: This will not work when Axis support is added. Make sure to refactor this when that time comes
|
// TODO: This will not work when Axis support is added. Make sure to refactor this when that time comes
|
||||||
// The reason it won't work is that when moving an axis, you would get the event MotionEvent.ACTION_MOVE.
|
// The reason it won't work is that when moving an axis, you would get the event MotionEvent.ACTION_MOVE.
|
||||||
|
//
|
||||||
|
// TODO: Refactor this so we detect either Axis movements or button presses so we don't run two loops all the time.
|
||||||
|
//
|
||||||
int buttonState = (event.getAction() == MotionEvent.ACTION_DOWN) ? ButtonState.PRESSED : ButtonState.RELEASED;
|
int buttonState = (event.getAction() == MotionEvent.ACTION_DOWN) ? ButtonState.PRESSED : ButtonState.RELEASED;
|
||||||
|
for (InputOverlayDrawableButton button : overlayButtons)
|
||||||
for (InputOverlayDrawableButton item : overlayButtons)
|
|
||||||
{
|
{
|
||||||
// Check if there was a touch within the bounds of a drawable.
|
// Check if there was a touch within the bounds of a drawable.
|
||||||
if (item.getBounds().contains((int)event.getX(), (int)event.getY()))
|
if (button.getBounds().contains((int)event.getX(), (int)event.getY()))
|
||||||
{
|
{
|
||||||
switch (item.getId())
|
switch (button.getId())
|
||||||
{
|
{
|
||||||
case ButtonType.BUTTON_A:
|
case ButtonType.BUTTON_A:
|
||||||
NativeLibrary.onTouchEvent(ButtonType.BUTTON_A, buttonState);
|
NativeLibrary.onTouchEvent(ButtonType.BUTTON_A, buttonState);
|
||||||
|
@ -136,16 +113,18 @@ public final class InputOverlay extends SurfaceView implements OnTouchListener,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (InputOverlayDrawableJoystick item : overlayJoysticks)
|
|
||||||
|
for (InputOverlayDrawableJoystick joystick : overlayJoysticks)
|
||||||
{
|
{
|
||||||
item.TrackEvent(event);
|
joystick.TrackEvent(event);
|
||||||
int[] axisIDs = item.getAxisIDs();
|
int[] axisIDs = joystick.getAxisIDs();
|
||||||
float[] axises = item.getAxisValues();
|
float[] axises = joystick.getAxisValues();
|
||||||
|
|
||||||
for (int a = 0; a < 4; ++a)
|
for (int a = 0; a < 4; ++a)
|
||||||
|
{
|
||||||
NativeLibrary.onTouchAxisEvent(axisIDs[a], axises[a]);
|
NativeLibrary.onTouchAxisEvent(axisIDs[a], axises[a]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
_sema.release();
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -214,20 +193,37 @@ public final class InputOverlay extends SurfaceView implements OnTouchListener,
|
||||||
|
|
||||||
return overlayDrawable;
|
return overlayDrawable;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initializes an {@link InputOverlayDrawableJoystick}
|
||||||
|
*
|
||||||
|
* @param context The current {@link Context}
|
||||||
|
* @param resOuter Resource ID for the outer image of the joystick (the static image that shows the circular bounds).
|
||||||
|
* @param resInner Resource ID for the inner image of the joystick (the one you actually move around).
|
||||||
|
* @param axisUp Identifier for this type of axis.
|
||||||
|
* @param axisDown Identifier for this type of axis.
|
||||||
|
* @param axisLeft Identifier for this type of axis.
|
||||||
|
* @param axisRight Identifier for this type of axis.
|
||||||
|
*
|
||||||
|
* @return the initialized {@link InputOverlayDrawableJoystick}.
|
||||||
|
*/
|
||||||
private static InputOverlayDrawableJoystick initializeOverlayJoystick(Context context, int resOuter, int resInner, int axisUp, int axisDown, int axisLeft, int axisRight)
|
private static InputOverlayDrawableJoystick initializeOverlayJoystick(Context context, int resOuter, int resInner, int axisUp, int axisDown, int axisLeft, int axisRight)
|
||||||
{
|
{
|
||||||
// Resources handle for fetching the initial Drawable resource.
|
// Resources handle for fetching the initial Drawable resource.
|
||||||
final Resources res = context.getResources();
|
final Resources res = context.getResources();
|
||||||
|
|
||||||
// SharedPreference to retrieve the X and Y coordinates for the InputOverlayDrawableButton.
|
// SharedPreference to retrieve the X and Y coordinates for the InputOverlayDrawableJoystick.
|
||||||
final SharedPreferences sPrefs = PreferenceManager.getDefaultSharedPreferences(context);
|
final SharedPreferences sPrefs = PreferenceManager.getDefaultSharedPreferences(context);
|
||||||
|
|
||||||
// Initialize the InputOverlayDrawableButton.
|
// Initialize the InputOverlayDrawableJoystick.
|
||||||
final Bitmap bitmapOuter = BitmapFactory.decodeResource(res, resOuter);
|
final Bitmap bitmapOuter = BitmapFactory.decodeResource(res, resOuter);
|
||||||
final Bitmap bitmapInner = BitmapFactory.decodeResource(res, resInner);
|
final Bitmap bitmapInner = BitmapFactory.decodeResource(res, resInner);
|
||||||
|
|
||||||
// Now set the bounds for the InputOverlayDrawableButton.
|
// TODO: Load coordinates for the drawable from the SharedPreference keys
|
||||||
// This will dictate where on the screen (and the what the size) the InputOverlayDrawableButton will be.
|
// made from the overlay configuration window in the settings.
|
||||||
|
|
||||||
|
// Now set the bounds for the InputOverlayDrawableJoystick.
|
||||||
|
// This will dictate where on the screen (and the what the size) the InputOverlayDrawableJoystick will be.
|
||||||
int outerSize = bitmapOuter.getWidth() + 256;
|
int outerSize = bitmapOuter.getWidth() + 256;
|
||||||
int X = 0;
|
int X = 0;
|
||||||
int Y = 0;
|
int Y = 0;
|
||||||
|
|
|
@ -14,7 +14,7 @@ import android.graphics.drawable.BitmapDrawable;
|
||||||
* Custom {@link BitmapDrawable} that is capable
|
* Custom {@link BitmapDrawable} that is capable
|
||||||
* of storing it's own ID.
|
* of storing it's own ID.
|
||||||
*/
|
*/
|
||||||
public class InputOverlayDrawableButton extends BitmapDrawable
|
public final class InputOverlayDrawableButton extends BitmapDrawable
|
||||||
{
|
{
|
||||||
// The ID identifying what type of button this Drawable represents.
|
// The ID identifying what type of button this Drawable represents.
|
||||||
private int buttonType;
|
private int buttonType;
|
||||||
|
|
|
@ -14,22 +14,21 @@ import android.graphics.drawable.BitmapDrawable;
|
||||||
import android.view.MotionEvent;
|
import android.view.MotionEvent;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Custom {@link android.graphics.drawable.BitmapDrawable} that is capable
|
* Custom {@link BitmapDrawable} that is capable
|
||||||
* of storing it's own ID.
|
* of storing it's own ID.
|
||||||
*/
|
*/
|
||||||
public class InputOverlayDrawableJoystick extends BitmapDrawable
|
public final class InputOverlayDrawableJoystick extends BitmapDrawable
|
||||||
{
|
{
|
||||||
// The ID identifying what type of button this Drawable represents.
|
private final int[] axisIDs = {0, 0, 0, 0};
|
||||||
private int axisIDs[] = {0, 0, 0, 0};
|
private final float[] axises = {0f, 0f};
|
||||||
private float axises[] = {0f, 0f};
|
private final BitmapDrawable ringInner;
|
||||||
private int trackid = -1;
|
private int trackid = -1;
|
||||||
private BitmapDrawable ringInner;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor
|
* Constructor
|
||||||
*
|
*
|
||||||
* @param res {@link android.content.res.Resources} instance.
|
* @param res {@link Resources} instance.
|
||||||
* @param bitmapOuter {@link android.graphics.Bitmap} to use with this Drawable.
|
* @param bitmapOuter {@link Bitmap} to use with this Drawable.
|
||||||
* @param axisUp Identifier for this type of axis.
|
* @param axisUp Identifier for this type of axis.
|
||||||
* @param axisDown Identifier for this type of axis.
|
* @param axisDown Identifier for this type of axis.
|
||||||
* @param axisLeft Identifier for this type of axis.
|
* @param axisLeft Identifier for this type of axis.
|
||||||
|
@ -51,11 +50,15 @@ public class InputOverlayDrawableJoystick extends BitmapDrawable
|
||||||
this.axisIDs[2] = axisLeft;
|
this.axisIDs[2] = axisLeft;
|
||||||
this.axisIDs[3] = axisRight;
|
this.axisIDs[3] = axisRight;
|
||||||
}
|
}
|
||||||
public void Draw(Canvas canvas)
|
|
||||||
|
@Override
|
||||||
|
public void draw(Canvas canvas)
|
||||||
{
|
{
|
||||||
this.draw(canvas);
|
super.draw(canvas);
|
||||||
|
|
||||||
ringInner.draw(canvas);
|
ringInner.draw(canvas);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void TrackEvent(MotionEvent event)
|
public void TrackEvent(MotionEvent event)
|
||||||
{
|
{
|
||||||
int pointerIndex = event.getActionIndex();
|
int pointerIndex = event.getActionIndex();
|
||||||
|
@ -95,6 +98,7 @@ public class InputOverlayDrawableJoystick extends BitmapDrawable
|
||||||
|
|
||||||
SetInnerBounds();
|
SetInnerBounds();
|
||||||
}
|
}
|
||||||
|
|
||||||
public float[] getAxisValues()
|
public float[] getAxisValues()
|
||||||
{
|
{
|
||||||
float[] joyaxises = new float[4];
|
float[] joyaxises = new float[4];
|
||||||
|
@ -120,10 +124,12 @@ public class InputOverlayDrawableJoystick extends BitmapDrawable
|
||||||
}
|
}
|
||||||
return joyaxises;
|
return joyaxises;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int[] getAxisIDs()
|
public int[] getAxisIDs()
|
||||||
{
|
{
|
||||||
return axisIDs;
|
return axisIDs;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void SetInnerBounds()
|
private void SetInnerBounds()
|
||||||
{
|
{
|
||||||
float floatX = this.getBounds().centerX();
|
float floatX = this.getBounds().centerX();
|
||||||
|
|
Loading…
Reference in New Issue