diff --git a/app/src/main/java/com/erz/joystick/MainActivity.java b/app/src/main/java/com/erz/joystick/MainActivity.java index 1d16373..bea7f04 100644 --- a/app/src/main/java/com/erz/joystick/MainActivity.java +++ b/app/src/main/java/com/erz/joystick/MainActivity.java @@ -19,6 +19,10 @@ public class MainActivity extends AppCompatActivity implements JoyStick.JoyStick ((JoyStick)findViewById(R.id.joy1)).setPadColor(Color.parseColor("#55ffffff")); ((JoyStick)findViewById(R.id.joy1)).setButtonColor(Color.parseColor("#55ff0000")); ((JoyStick)findViewById(R.id.joy2)).setListener(this); + ((JoyStick)findViewById(R.id.joy2)).enableStayPut(true); + ((JoyStick)findViewById(R.id.joy2)).setButtonSize(50); + ((JoyStick)findViewById(R.id.joy2)).setButtonDrawable(R.drawable.droid); + ((JoyStick)findViewById(R.id.joy2)).setButtonAlpha(100); } @Override diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index a9e9a1c..e1d1986 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -2,7 +2,6 @@ + android:layout_gravity="bottom|right"/> \ No newline at end of file diff --git a/joysticklibrary/src/main/java/com/erz/joysticklibrary/JoyStick.java b/joysticklibrary/src/main/java/com/erz/joysticklibrary/JoyStick.java index 21bf916..e0299d5 100644 --- a/joysticklibrary/src/main/java/com/erz/joysticklibrary/JoyStick.java +++ b/joysticklibrary/src/main/java/com/erz/joysticklibrary/JoyStick.java @@ -18,9 +18,12 @@ package com.erz.joysticklibrary; import android.content.Context; import android.content.res.TypedArray; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; +import android.graphics.RectF; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; @@ -30,6 +33,8 @@ import android.view.View; */ public class JoyStick extends View { + JoyStickListener listener; + Paint paint; float width; float height; float centerX; @@ -39,12 +44,33 @@ public class JoyStick extends View { float posY; float radius; float buttonRadius; - double power; - double angle; + double power = -1; + double angle = -1; + RectF temp; + + //Background Color int padColor; + + //Stick Color int buttonColor; - Paint paint; - JoyStickListener listener; + + //Keeps joystick in last position + boolean stayPut; + + //Button Size percentage of the minimum(width, height) + int percentage = 25; + + //Background Bitmap + Bitmap padBGBitmap = null; + + //Button Bitmap + Bitmap buttonBitmap = null; + + //Background Alpha + int padAlpha = 255; + + //Button Alpha + int buttonAlpha = 255; public interface JoyStickListener { void onMove(JoyStick joyStick, double angle, double power); @@ -65,14 +91,33 @@ public class JoyStick extends View { paint.setStyle(Paint.Style.FILL); paint.setAntiAlias(true); - padColor = Color.BLACK; + temp = new RectF(); + + padColor = Color.WHITE; buttonColor = Color.RED; if (attrs != null) { TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.JoyStick); if (typedArray != null) { - padColor = typedArray.getColor(R.styleable.JoyStick_padColor, Color.BLACK); + padColor = typedArray.getColor(R.styleable.JoyStick_padColor, Color.WHITE); buttonColor = typedArray.getColor(R.styleable.JoyStick_buttonColor, Color.RED); + stayPut = typedArray.getBoolean(R.styleable.JoyStick_stayPut, false); + percentage = typedArray.getInt(R.styleable.JoyStick_percentage, 25); + if (percentage > 50) percentage = 50; + if (percentage < 25) percentage = 25; + + int padResId = typedArray.getResourceId(R.styleable.JoyStick_backgroundDrawable, -1); + int buttonResId = typedArray.getResourceId(R.styleable.JoyStick_buttonDrawable, -1); + + if (padResId > 0) { + padBGBitmap = BitmapFactory.decodeResource(getResources(), padResId); + } + if (buttonResId > 0) { + buttonBitmap = BitmapFactory.decodeResource(getResources(), buttonResId); + } + + padAlpha = typedArray.getInt(R.styleable.JoyStick_backgroundAlpha, 255); + buttonAlpha = typedArray.getInt(R.styleable.JoyStick_buttonAlpha, 255); typedArray.recycle(); } } @@ -88,7 +133,7 @@ public class JoyStick extends View { min = Math.min(width, height); posX = centerX; posY = centerY; - buttonRadius = (min / 2 * 0.25f); + buttonRadius = (min / 2f * (percentage/100f)); radius = (min / 2 * 0.75f); } @@ -96,10 +141,22 @@ public class JoyStick extends View { public void draw(Canvas canvas) { super.draw(canvas); if (canvas == null) return; - paint.setColor(padColor); - canvas.drawCircle(centerX, centerY, radius, paint); - paint.setColor(buttonColor); - canvas.drawCircle(posX, posY, buttonRadius, paint); + if (padBGBitmap == null) { + paint.setColor(padColor); + canvas.drawCircle(centerX, centerY, radius, paint); + } else { + paint.setAlpha(padAlpha); + temp.set(posX - radius, posY - radius, posX + radius, posY + radius); + canvas.drawBitmap(padBGBitmap, null, temp, paint); + } + if (buttonBitmap == null) { + paint.setColor(buttonColor); + canvas.drawCircle(posX, posY, buttonRadius, paint); + } else { + paint.setAlpha(buttonAlpha); + temp.set(posX - buttonRadius, posY - buttonRadius, posX + buttonRadius, posY + buttonRadius); + canvas.drawBitmap(buttonBitmap, null, temp, paint); + } } @Override @@ -126,11 +183,13 @@ public class JoyStick extends View { break; case MotionEvent.ACTION_UP: case MotionEvent.ACTION_CANCEL: - posX = centerX; - posY = centerY; - angle = 0; - power = 0; - invalidate(); + if (!stayPut) { + posX = centerX; + posY = centerY; + angle = 0; + power = 0; + invalidate(); + } break; } @@ -142,12 +201,10 @@ public class JoyStick extends View { public void setPadColor(int padColor) { this.padColor = padColor; - invalidate(); } public void setButtonColor(int buttonColor) { this.buttonColor = buttonColor; - invalidate(); } public void setListener(JoyStickListener listener) { @@ -165,4 +222,36 @@ public class JoyStick extends View { public double getAngleDegrees() { return Math.toDegrees(angle); } + + public void enableStayPut(boolean enable) { + this.stayPut = enable; + } + + //size of button is a percentage of the minimum(width, height) + //percentage must be between 25 - 50 + public void setButtonSize(int p) { + percentage = p; + if (percentage > 50) percentage = 50; + if (percentage < 25) percentage = 25; + } + + public void setPadBackground(int resId) { + this.padBGBitmap = BitmapFactory.decodeResource(getResources(), resId); + } + + public void setButtonDrawable(int resId) { + this.buttonBitmap = BitmapFactory.decodeResource(getResources(), resId); + } + + public void setBackgroundAlpha(int alpha) { + padAlpha = alpha; + if (padAlpha > 255) padAlpha = 255; + if (padAlpha < 0) padAlpha = 0; + } + + public void setButtonAlpha(int alpha) { + buttonAlpha = alpha; + if (buttonAlpha > 255) buttonAlpha = 255; + if (buttonAlpha < 0) buttonAlpha = 0; + } } \ No newline at end of file diff --git a/joysticklibrary/src/main/res/values/attrs.xml b/joysticklibrary/src/main/res/values/attrs.xml index 01faba4..f383ba5 100644 --- a/joysticklibrary/src/main/res/values/attrs.xml +++ b/joysticklibrary/src/main/res/values/attrs.xml @@ -3,5 +3,11 @@ + + + + + + \ No newline at end of file