[Custom controls] Add Toggelable option

This commit is contained in:
khanhduytran0 2020-11-27 12:59:16 +07:00
parent b9cd11498e
commit b0518d7b1a
6 changed files with 70 additions and 30 deletions

View File

@ -119,6 +119,9 @@ public class ActionPopupWindow extends PinnedPopupWindow implements OnClickListe
final CheckBox checkHidden = dialog.findViewById(R.id.controlsetting_checkbox_hidden);
checkHidden.setChecked(properties.hidden);
final CheckBox checkToggle = dialog.findViewById(R.id.controlsetting_checkbox_toggle);
checkToggle.setChecked(properties.isToggle);
final LinearLayout layoutDynamicBtn = dialog.findViewById(R.id.controlsetting_dynamicbtnlayout);
final CheckBox checkDynamicPos = dialog.findViewById(R.id.controlsetting_checkbox_dynamicpos);
checkDynamicPos.setOnCheckedChangeListener(new CheckBox.OnCheckedChangeListener(){
@ -194,6 +197,7 @@ public class ActionPopupWindow extends PinnedPopupWindow implements OnClickListe
properties.name = editName.getText().toString();
properties.hidden = checkHidden.isChecked();
properties.isDynamicBtn = checkDynamicPos.isChecked();
properties.isToggle = checkToggle.isChecked();
properties.dynamicX = editDynamicX.getText().toString();
properties.dynamicY = editDynamicY.getText().toString();

View File

@ -1,16 +1,19 @@
package net.kdt.pojavlaunch.customcontrols;
import android.content.*;
import android.graphics.*;
import android.util.*;
import android.view.*;
import android.view.View.*;
import android.widget.*;
import net.kdt.pojavlaunch.*;
import com.kdt.handleview.*;
import android.view.ViewGroup.*;
import net.kdt.pojavlaunch.*;
import org.lwjgl.glfw.*;
public class ControlButton extends Button implements OnLongClickListener, OnTouchListener
{
private Paint mRectPaint;
private GestureDetector mGestureDetector;
private ControlData mProperties;
private SelectionEndHandleView mHandleView;
@ -18,12 +21,18 @@ public class ControlButton extends Button implements OnLongClickListener, OnTouc
private boolean mModifiable = false;
private boolean mCanTriggerLongClick = true;
private boolean mChecked = false;
private float mScaleAt;
private int mMods;
public ControlButton(Context ctx, ControlData properties) {
super(ctx);
public ControlButton(ControlLayout layout, ControlData properties) {
super(layout.getContext());
setWillNotDraw(false);
mGestureDetector = new GestureDetector(ctx, new SingleTapConfirm());
mScaleAt = layout.mLayout.scaledAt;
mGestureDetector = new GestureDetector(getContext(), new SingleTapConfirm());
setBackgroundResource(R.drawable.control_button);
setOnLongClickListener(this);
@ -33,6 +42,12 @@ public class ControlButton extends Button implements OnLongClickListener, OnTouc
setModified(false);
mHandleView = new SelectionEndHandleView(this);
final TypedValue value = new TypedValue();
getContext().getTheme().resolveAttribute(R.attr.colorAccent, value, true);
mRectPaint = new Paint();
mRectPaint.setColor(value.data);
}
public HandleView getHandleView() {
@ -121,6 +136,14 @@ public class ControlButton extends Button implements OnLongClickListener, OnTouc
setProperties(mProperties);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (mChecked) {
canvas.drawRect(0, getHeight() - 10 * mScaleAt, getWidth(), getHeight(), mRectPaint);
}
}
@Override
public boolean onLongClick(View p1) {
if (mCanTriggerLongClick && mModifiable) {
@ -144,25 +167,30 @@ public class ControlButton extends Button implements OnLongClickListener, OnTouc
if (!mModifiable) {
mCanTriggerLongClick = false;
if (mProperties.keycode >= 0) {
boolean isDown;
switch (event.getActionMasked()) {
case MotionEvent.ACTION_DOWN: // 0
case MotionEvent.ACTION_POINTER_DOWN: // 5
isDown = true;
break;
case MotionEvent.ACTION_UP: // 1
case MotionEvent.ACTION_CANCEL: // 3
case MotionEvent.ACTION_POINTER_UP: // 6
isDown = false;
break;
default:
return false;
if (!mProperties.isToggle) {
if (mProperties.keycode >= 0) {
boolean isDown;
switch (event.getActionMasked()) {
case MotionEvent.ACTION_DOWN: // 0
case MotionEvent.ACTION_POINTER_DOWN: // 5
isDown = true;
break;
case MotionEvent.ACTION_UP: // 1
case MotionEvent.ACTION_CANCEL: // 3
case MotionEvent.ACTION_POINTER_UP: // 6
isDown = false;
break;
default:
return false;
}
MainActivity.sendKeyPress(mProperties.keycode, mMods, isDown);
}
MainActivity.sendKeyPress(mProperties.keycode, mMods, isDown);
return true;
} else if (mGestureDetector.onTouchEvent(event)) {
mChecked = !mChecked;
MainActivity.sendKeyPress(mProperties.keycode, mMods, mChecked);
}
return true;
} else {
if (mGestureDetector.onTouchEvent(event)) {
mCanTriggerLongClick = true;

View File

@ -35,7 +35,7 @@ public class ControlData implements Cloneable
* bigger device or vice versa.
*/
public String dynamicX, dynamicY;
public boolean isDynamicBtn;
public boolean isDynamicBtn, isToggle;
public static ControlData[] getSpecialButtons(){
if (SPECIAL_BUTTONS == null) {
@ -100,12 +100,12 @@ public class ControlData implements Cloneable
}
public ControlData(String name, int keycode, float x, float y, float width, float height) {
this(name, keycode, Float.toString(x), Float.toString(y), width, height);
this(name, keycode, Float.toString(x), Float.toString(y), width, height, false);
this.isDynamicBtn = false;
}
public ControlData(String name, int keycode, String dynamicX, String dynamicY) {
this(name, keycode, dynamicX, dynamicY, pixelOf50dp, pixelOf50dp);
this(name, keycode, dynamicX, dynamicY, pixelOf50dp, pixelOf50dp, false);
}
public ControlData(android.content.Context ctx, int resId, int keycode, String dynamicX, String dynamicY, boolean isSquare) {
@ -113,10 +113,10 @@ public class ControlData implements Cloneable
}
public ControlData(String name, int keycode, String dynamicX, String dynamicY, boolean isSquare) {
this(name, keycode, dynamicX, dynamicY, isSquare ? pixelOf50dp : pixelOf80dp, isSquare ? pixelOf50dp : pixelOf30dp);
this(name, keycode, dynamicX, dynamicY, isSquare ? pixelOf50dp : pixelOf80dp, isSquare ? pixelOf50dp : pixelOf30dp, false);
}
public ControlData(String name, int keycode, String dynamicX, String dynamicY, float width, float height) {
public ControlData(String name, int keycode, String dynamicX, String dynamicY, float width, float height, boolean isToggle) {
this.name = name;
this.keycode = keycode;
this.dynamicX = dynamicX;
@ -124,6 +124,7 @@ public class ControlData implements Cloneable
this.width = width;
this.height = height;
this.isDynamicBtn = true;
this.isToggle = isToggle;
update();
}
@ -133,7 +134,7 @@ public class ControlData implements Cloneable
public ControlData clone() {
if (this instanceof ControlData) {
return new ControlData(name, keycode, ((ControlData) this).dynamicX, ((ControlData) this).dynamicY, width, height);
return new ControlData(name, keycode, ((ControlData) this).dynamicX, ((ControlData) this).dynamicY, width, height, isToggle);
} else {
return new ControlData(name, keycode, x, y, width, height);
}

View File

@ -11,8 +11,8 @@ import org.lwjgl.glfw.*;
public class ControlLayout extends FrameLayout
{
protected CustomControls mLayout;
private boolean mModifiable;
private CustomControls mLayout;
private CustomControlsActivity mActivity;
private boolean mControlVisible = false;
@ -66,7 +66,7 @@ public class ControlLayout extends FrameLayout
}
private void addControlView(ControlData controlButton) {
final ControlButton view = new ControlButton(getContext(), controlButton);
final ControlButton view = new ControlButton(this, controlButton);
view.setModifiable(mModifiable);
addView(view);

View File

@ -42,6 +42,12 @@
android:text="@string/customctrl_dynamicpos"
android:id="@+id/controlsetting_checkbox_dynamicpos"/>
<CheckBox
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:text="@string/customctrl_toggle"
android:id="@+id/controlsetting_checkbox_toggle"/>
<LinearLayout
android:layout_height="wrap_content"
android:layout_width="match_parent"

View File

@ -190,6 +190,7 @@
<string name="customctrl_keyname">Keycode</string>
<string name="customctrl_specialkey">Special Key</string>
<string name="customctrl_hidden">Hidden</string>
<string name="customctrl_toggle">Toggleable</string>
<string name="customctrl_dynamicpos">Dynamic position</string>
<string name="customctrl_dynamicpos_x">Dynamic X</string>