From 55c4e3476cf1ca46cfd1926fbcb3b52068090138 Mon Sep 17 00:00:00 2001 From: Xtr126 Date: Thu, 23 Mar 2023 23:07:51 +0530 Subject: [PATCH] Add Swipe Key View #8 --- app/src/main/java/xtr/keymapper/EditorUI.java | 32 ++++++++---- .../MovableFloatingActionKey.java | 20 +++++--- .../floatingkeys/SwipeKeyOverlay.java | 51 +++++++++++++++++++ .../keymapper/floatingkeys/SwipeKeyView.java | 30 +++++++++++ .../res/drawable/ic_baseline_touch_app_24.xml | 5 ++ app/src/main/res/layout/swipe_key.xml | 35 +++++++++++++ app/src/main/res/menu/keymap_editor_menu.xml | 4 ++ 7 files changed, 162 insertions(+), 15 deletions(-) create mode 100644 app/src/main/java/xtr/keymapper/floatingkeys/SwipeKeyOverlay.java create mode 100644 app/src/main/java/xtr/keymapper/floatingkeys/SwipeKeyView.java create mode 100644 app/src/main/res/drawable/ic_baseline_touch_app_24.xml create mode 100644 app/src/main/res/layout/swipe_key.xml diff --git a/app/src/main/java/xtr/keymapper/EditorUI.java b/app/src/main/java/xtr/keymapper/EditorUI.java index 30384d6c..22d2fd71 100644 --- a/app/src/main/java/xtr/keymapper/EditorUI.java +++ b/app/src/main/java/xtr/keymapper/EditorUI.java @@ -30,6 +30,7 @@ import xtr.keymapper.dpad.Dpad.DpadType; import xtr.keymapper.floatingkeys.MovableFloatingActionKey; import xtr.keymapper.floatingkeys.MovableFrameLayout; +import xtr.keymapper.floatingkeys.SwipeKeyView; import xtr.keymapper.mouse.MouseAimConfig; import xtr.keymapper.mouse.MouseAimSettings; import xtr.keymapper.profiles.KeymapProfiles; @@ -49,7 +50,6 @@ public class EditorUI extends OnKeyEventListener.Stub { private MovableFrameLayout dpadWasd, dpadUdlr, crosshair; // Default position of new views added - private static final Float DEFAULT_X = 200f, DEFAULT_Y = 200f; private final KeymapEditorBinding binding; private final Context context; private final OnHideListener onHideListener; @@ -73,6 +73,8 @@ public EditorUI (Context context, String profileName) { binding = KeymapEditorBinding.inflate(layoutInflater); mainView = binding.getRoot(); + + binding.speedDial.inflate(R.menu.keymap_editor_menu); binding.speedDial.open(); setupButtons(); @@ -193,16 +195,20 @@ private void saveKeymap() { public void setupButtons() { binding.speedDial.setOnActionSelectedListener(actionItem -> { + // X y coordinates of center of root view + float defaultX = mainView.getPivotX(); + float defaultY = mainView.getPivotY(); + switch (actionItem.getId()) { case R.id.add: - addKey(); + addKey(defaultX, defaultY); break; case R.id.dpad: final CharSequence[] items = { "Arrow Keys", "WASD Keys"}; AlertDialog.Builder builder = new AlertDialog.Builder(context); builder.setTitle("Select Dpad").setItems(items, (dialog, i) -> { - if (i == 0) addArrowKeysDpad(DEFAULT_X, DEFAULT_Y); - else addWasdDpad(DEFAULT_X, DEFAULT_Y); + if (i == 0) addArrowKeysDpad(defaultX, defaultY); + else addWasdDpad(defaultX, defaultY); }); AlertDialog dialog = builder.create(); dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY); @@ -214,14 +220,17 @@ public void setupButtons() { break; case R.id.mouse_left: - addLeftClick(DEFAULT_X, DEFAULT_Y); + addLeftClick(defaultX, defaultY); break; case R.id.crosshair: profile.mouseAimConfig = new MouseAimConfig(); - addCrosshair(DEFAULT_X, DEFAULT_Y); + addCrosshair(defaultX, defaultY); break; + case R.id.swipe_key: + addSwipeKey(); + break; } return true; }); @@ -283,11 +292,11 @@ private void addKey(KeymapProfiles.Key key) { keyList.add(floatingKey); } - private void addKey() { + private void addKey(float x, float y) { final KeymapProfiles.Key key = new KeymapProfiles.Key(); key.code = "KEY_X"; - key.x = DEFAULT_X; - key.y = DEFAULT_Y; + key.x = x; + key.y = y; addKey(key); } @@ -326,6 +335,11 @@ private void addLeftClick(float x, float y) { .start(); } + @SuppressLint("ClickableViewAccessibility") + private void addSwipeKey() { + SwipeKeyView swipeKeyView = new SwipeKeyView(mainView); + } + private void resizeView(View view, float x, float y) { ViewGroup.LayoutParams layoutParams = view.getLayoutParams(); layoutParams.width += x; diff --git a/app/src/main/java/xtr/keymapper/floatingkeys/MovableFloatingActionKey.java b/app/src/main/java/xtr/keymapper/floatingkeys/MovableFloatingActionKey.java index bfc589af..5281139f 100644 --- a/app/src/main/java/xtr/keymapper/floatingkeys/MovableFloatingActionKey.java +++ b/app/src/main/java/xtr/keymapper/floatingkeys/MovableFloatingActionKey.java @@ -13,6 +13,7 @@ public class MovableFloatingActionKey extends FrameLayout implements View.OnTouc public FloatingActionKey key; private float dX, dY; + private OnXyChangeListener xyChangeListener; public MovableFloatingActionKey(Context context) { super(context); @@ -80,7 +81,6 @@ public String getText(){ @Override public boolean onTouch(View view, MotionEvent motionEvent){ ViewGroup.MarginLayoutParams layoutParams = (ViewGroup.MarginLayoutParams)view.getLayoutParams(); - int action = motionEvent.getAction(); switch (action) { case MotionEvent.ACTION_DOWN: { @@ -109,15 +109,23 @@ public boolean onTouch(View view, MotionEvent motionEvent){ newY = Math.max(layoutParams.topMargin, newY); // Don't allow the FAB past the top of the parent newY = Math.min(parentHeight - viewHeight - layoutParams.bottomMargin, newY); // Don't allow the FAB past the bottom of the parent - view.animate() - .x(newX) - .y(newY) - .setDuration(0) - .start(); + view.animate().x(newX).y(newY).setDuration(0).start(); + + if (xyChangeListener != null) + xyChangeListener.onNewXY(newX, newY); + return true; // Consumed } default: return super.onTouchEvent(motionEvent); } } + public void setXyChangeListener(OnXyChangeListener xyChangeListener) { + this.xyChangeListener = xyChangeListener; + xyChangeListener.onNewXY(getX(), getY()); + } + + public interface OnXyChangeListener { + void onNewXY(float x, float y); + } } \ No newline at end of file diff --git a/app/src/main/java/xtr/keymapper/floatingkeys/SwipeKeyOverlay.java b/app/src/main/java/xtr/keymapper/floatingkeys/SwipeKeyOverlay.java new file mode 100644 index 00000000..d1e37e77 --- /dev/null +++ b/app/src/main/java/xtr/keymapper/floatingkeys/SwipeKeyOverlay.java @@ -0,0 +1,51 @@ +package xtr.keymapper.floatingkeys; + +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.DashPathEffect; +import android.graphics.Paint; +import android.util.AttributeSet; +import android.view.View; + +import androidx.annotation.UiContext; +import androidx.annotation.UiThread; + +public class SwipeKeyOverlay extends View { + private final Paint mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); + private float lineStartX, lineStartY; + private float lineStopX, lineStopY; + + public SwipeKeyOverlay(Context context) { + this(context, null); + } + + public SwipeKeyOverlay(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public SwipeKeyOverlay(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + mPaint.setColor(Color.CYAN); + mPaint.setStrokeWidth(5f); + mPaint.setStyle(Paint.Style.STROKE); + mPaint.setPathEffect(new DashPathEffect(new float[]{5, 10, 15, 20}, 0)); + } + + @Override + protected void onDraw(Canvas canvas) { + super.onDraw(canvas); + canvas.drawLine(lineStartX, lineStartY, lineStopX, lineStopY, mPaint); + } + + @UiThread + public void setLineXyFrom(View view1, View view2) { + this.lineStartX = view1.getX() + view1.getPivotX(); + this.lineStartY = view1.getY() + view1.getPivotY(); + + this.lineStopX = view2.getX() + view2.getPivotX(); + this.lineStopY = view2.getY() + view2.getPivotY(); + invalidate(); + } + +} diff --git a/app/src/main/java/xtr/keymapper/floatingkeys/SwipeKeyView.java b/app/src/main/java/xtr/keymapper/floatingkeys/SwipeKeyView.java new file mode 100644 index 00000000..28602fc8 --- /dev/null +++ b/app/src/main/java/xtr/keymapper/floatingkeys/SwipeKeyView.java @@ -0,0 +1,30 @@ +package xtr.keymapper.floatingkeys; + +import android.content.Context; +import android.view.ViewGroup; + +public class SwipeKeyView { + + public SwipeKeyView(ViewGroup rootView){ + Context context = rootView.getContext(); + MovableFloatingActionKey button1 = new MovableFloatingActionKey(context); + MovableFloatingActionKey button2 = new MovableFloatingActionKey(context); + + SwipeKeyOverlay overlay = new SwipeKeyOverlay(context); + rootView.addView(overlay); + + rootView.addView(button1); + rootView.addView(button2); + + button1.setX(rootView.getPivotX() - 100); + button1.setY(rootView.getPivotY() - 100); + + button2.setX(rootView.getPivotX() + 100); + button2.setY(rootView.getPivotY() + 100); + + MovableFloatingActionKey.OnXyChangeListener xyChangeListener = (x, y) -> overlay.setLineXyFrom(button1, button2); + + button1.setXyChangeListener(xyChangeListener); + button2.setXyChangeListener(xyChangeListener); + } +} diff --git a/app/src/main/res/drawable/ic_baseline_touch_app_24.xml b/app/src/main/res/drawable/ic_baseline_touch_app_24.xml new file mode 100644 index 00000000..3a060f63 --- /dev/null +++ b/app/src/main/res/drawable/ic_baseline_touch_app_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/layout/swipe_key.xml b/app/src/main/res/layout/swipe_key.xml new file mode 100644 index 00000000..df725572 --- /dev/null +++ b/app/src/main/res/layout/swipe_key.xml @@ -0,0 +1,35 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/menu/keymap_editor_menu.xml b/app/src/main/res/menu/keymap_editor_menu.xml index 5194bb0b..58434419 100644 --- a/app/src/main/res/menu/keymap_editor_menu.xml +++ b/app/src/main/res/menu/keymap_editor_menu.xml @@ -12,6 +12,10 @@ android:id="@+id/mouse_left" android:icon="@drawable/ic_baseline_mouse_36" android:title="Left Click" /> +