mirror of
https://github.com/AngelAuraMC/Amethyst-Android.git
synced 2025-09-16 08:05:34 -04:00
Refactor HandleView related files
This commit is contained in:
parent
2550070954
commit
16bdc35739
@ -29,8 +29,7 @@ import net.kdt.pojavlaunch.*;
|
|||||||
import net.kdt.pojavlaunch.customcontrols.buttons.ControlButton;
|
import net.kdt.pojavlaunch.customcontrols.buttons.ControlButton;
|
||||||
|
|
||||||
|
|
||||||
public abstract class HandleView extends View implements ViewPositionListener, View.OnLongClickListener
|
public abstract class HandleView extends View implements ViewPositionListener, View.OnLongClickListener {
|
||||||
{
|
|
||||||
protected Drawable mDrawable;
|
protected Drawable mDrawable;
|
||||||
protected Drawable mDrawableLtr;
|
protected Drawable mDrawableLtr;
|
||||||
protected Drawable mDrawableRtl;
|
protected Drawable mDrawableRtl;
|
||||||
@ -65,12 +64,19 @@ public abstract class HandleView extends View implements ViewPositionListener, V
|
|||||||
// int mWindowPosX, mWindowPosY;
|
// int mWindowPosX, mWindowPosY;
|
||||||
|
|
||||||
private PositionListener mPositionListener;
|
private PositionListener mPositionListener;
|
||||||
public PositionListener getPositionListener() {
|
|
||||||
if (mPositionListener == null) {
|
// Touch-up filter: number of previous positions remembered
|
||||||
mPositionListener = new PositionListener(mView);
|
private static final int HISTORY_SIZE = 5;
|
||||||
}
|
private static final int TOUCH_UP_FILTER_DELAY_AFTER = 150;
|
||||||
return mPositionListener;
|
private static final int TOUCH_UP_FILTER_DELAY_BEFORE = 350;
|
||||||
}
|
private final long[] mPreviousOffsetsTimes = new long[HISTORY_SIZE];
|
||||||
|
private final int[] mPreviousOffsets = new int[HISTORY_SIZE];
|
||||||
|
private int mPreviousOffsetIndex = 0;
|
||||||
|
private int mNumberPreviousOffsets = 0;
|
||||||
|
|
||||||
|
// Addition
|
||||||
|
private float mDownX, mDownY;
|
||||||
|
|
||||||
|
|
||||||
public HandleView(ControlButton view) {
|
public HandleView(ControlButton view) {
|
||||||
super(view.getContext());
|
super(view.getContext());
|
||||||
@ -99,6 +105,98 @@ public abstract class HandleView extends View implements ViewPositionListener, V
|
|||||||
mIdealVerticalOffset = 0.7f * handleHeight;
|
mIdealVerticalOffset = 0.7f * handleHeight;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
|
||||||
|
setMeasuredDimension(getPreferredWidth(), getPreferredHeight());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onDraw(Canvas c) {
|
||||||
|
final int drawWidth = mDrawable.getIntrinsicWidth();
|
||||||
|
final int left = getHorizontalOffset();
|
||||||
|
|
||||||
|
mDrawable.setBounds(left, 0, left + drawWidth, mDrawable.getIntrinsicHeight());
|
||||||
|
mDrawable.draw(c);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onTouchEvent(MotionEvent ev) {
|
||||||
|
ViewGroup.LayoutParams params = mView.getLayoutParams();
|
||||||
|
|
||||||
|
switch (ev.getActionMasked()) {
|
||||||
|
case MotionEvent.ACTION_DOWN: {
|
||||||
|
startTouchUpFilter(getCurrentCursorOffset());
|
||||||
|
mTouchToWindowOffsetX = ev.getRawX() - mPositionX;
|
||||||
|
mTouchToWindowOffsetY = ev.getRawY() - mPositionY;
|
||||||
|
|
||||||
|
final PositionListener positionListener = getPositionListener();
|
||||||
|
mLastParentX = positionListener.getPositionX();
|
||||||
|
mLastParentY = positionListener.getPositionY();
|
||||||
|
mIsDragging = true;
|
||||||
|
|
||||||
|
// MOD: Addition
|
||||||
|
mDownX = ev.getRawX();
|
||||||
|
mDownY = ev.getRawY();
|
||||||
|
mDownWidth = params.width;
|
||||||
|
mDownHeight = params.height;
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case MotionEvent.ACTION_MOVE: {
|
||||||
|
final float rawX = ev.getRawX();
|
||||||
|
final float rawY = ev.getRawY();
|
||||||
|
|
||||||
|
// Vertical hysteresis: vertical down movement tends to snap to ideal offset
|
||||||
|
final float previousVerticalOffset = mTouchToWindowOffsetY - mLastParentY;
|
||||||
|
final float currentVerticalOffset = rawY - mPositionY - mLastParentY;
|
||||||
|
float newVerticalOffset;
|
||||||
|
if (previousVerticalOffset < mIdealVerticalOffset) {
|
||||||
|
newVerticalOffset = Math.min(currentVerticalOffset, mIdealVerticalOffset);
|
||||||
|
newVerticalOffset = Math.max(newVerticalOffset, previousVerticalOffset);
|
||||||
|
} else {
|
||||||
|
newVerticalOffset = Math.max(currentVerticalOffset, mIdealVerticalOffset);
|
||||||
|
newVerticalOffset = Math.min(newVerticalOffset, previousVerticalOffset);
|
||||||
|
}
|
||||||
|
mTouchToWindowOffsetY = newVerticalOffset + mLastParentY;
|
||||||
|
|
||||||
|
final float newPosX = rawX - mTouchToWindowOffsetX + mHotspotX;
|
||||||
|
final float newPosY = rawY - mTouchToWindowOffsetY + mTouchOffsetY;
|
||||||
|
|
||||||
|
int newWidth = (int) (mDownWidth + (rawX - mDownX));
|
||||||
|
int newHeight = (int) (mDownHeight + (rawY - mDownY));
|
||||||
|
|
||||||
|
// mDownX = rawX;
|
||||||
|
// mDownY = rawY;
|
||||||
|
|
||||||
|
params.width = Math.max(50, newWidth);
|
||||||
|
params.height = Math.max(50, newHeight);
|
||||||
|
|
||||||
|
mView.setLayoutParams(params);
|
||||||
|
|
||||||
|
updatePosition(newPosX, newPosY);
|
||||||
|
// break;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
case MotionEvent.ACTION_UP:
|
||||||
|
filterOnTouchUp();
|
||||||
|
mIsDragging = false;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case MotionEvent.ACTION_CANCEL:
|
||||||
|
mIsDragging = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public PositionListener getPositionListener() {
|
||||||
|
if (mPositionListener == null) {
|
||||||
|
mPositionListener = new PositionListener(mView);
|
||||||
|
}
|
||||||
|
return mPositionListener;
|
||||||
|
}
|
||||||
|
|
||||||
protected void updateDrawable() {
|
protected void updateDrawable() {
|
||||||
// final int offset = getCurrentCursorOffset();
|
// final int offset = getCurrentCursorOffset();
|
||||||
@ -111,14 +209,7 @@ public abstract class HandleView extends View implements ViewPositionListener, V
|
|||||||
protected abstract int getHotspotX(Drawable drawable, boolean isRtlRun);
|
protected abstract int getHotspotX(Drawable drawable, boolean isRtlRun);
|
||||||
protected abstract int getHorizontalGravity(boolean isRtlRun);
|
protected abstract int getHorizontalGravity(boolean isRtlRun);
|
||||||
|
|
||||||
// Touch-up filter: number of previous positions remembered
|
|
||||||
private static final int HISTORY_SIZE = 5;
|
|
||||||
private static final int TOUCH_UP_FILTER_DELAY_AFTER = 150;
|
|
||||||
private static final int TOUCH_UP_FILTER_DELAY_BEFORE = 350;
|
|
||||||
private final long[] mPreviousOffsetsTimes = new long[HISTORY_SIZE];
|
|
||||||
private final int[] mPreviousOffsets = new int[HISTORY_SIZE];
|
|
||||||
private int mPreviousOffsetIndex = 0;
|
|
||||||
private int mNumberPreviousOffsets = 0;
|
|
||||||
|
|
||||||
private void startTouchUpFilter(int offset) {
|
private void startTouchUpFilter(int offset) {
|
||||||
mNumberPreviousOffsets = 0;
|
mNumberPreviousOffsets = 0;
|
||||||
@ -152,11 +243,6 @@ public abstract class HandleView extends View implements ViewPositionListener, V
|
|||||||
return mNumberPreviousOffsets > 1;
|
return mNumberPreviousOffsets > 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
|
|
||||||
setMeasuredDimension(getPreferredWidth(), getPreferredHeight());
|
|
||||||
}
|
|
||||||
|
|
||||||
private int getPreferredWidth() {
|
private int getPreferredWidth() {
|
||||||
return Math.max(mDrawable.getIntrinsicWidth(), mMinSize);
|
return Math.max(mDrawable.getIntrinsicWidth(), mMinSize);
|
||||||
}
|
}
|
||||||
@ -283,15 +369,6 @@ public abstract class HandleView extends View implements ViewPositionListener, V
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onDraw(Canvas c) {
|
|
||||||
final int drawWidth = mDrawable.getIntrinsicWidth();
|
|
||||||
final int left = getHorizontalOffset();
|
|
||||||
|
|
||||||
mDrawable.setBounds(left, 0, left + drawWidth, mDrawable.getIntrinsicHeight());
|
|
||||||
mDrawable.draw(c);
|
|
||||||
}
|
|
||||||
|
|
||||||
private int getHorizontalOffset() {
|
private int getHorizontalOffset() {
|
||||||
final int width = getPreferredWidth();
|
final int width = getPreferredWidth();
|
||||||
final int drawWidth = mDrawable.getIntrinsicWidth();
|
final int drawWidth = mDrawable.getIntrinsicWidth();
|
||||||
@ -315,81 +392,6 @@ public abstract class HandleView extends View implements ViewPositionListener, V
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Addition
|
|
||||||
private float mDownX, mDownY;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean onTouchEvent(MotionEvent ev) {
|
|
||||||
ViewGroup.LayoutParams params = mView.getLayoutParams();
|
|
||||||
|
|
||||||
switch (ev.getActionMasked()) {
|
|
||||||
case MotionEvent.ACTION_DOWN: {
|
|
||||||
startTouchUpFilter(getCurrentCursorOffset());
|
|
||||||
mTouchToWindowOffsetX = ev.getRawX() - mPositionX;
|
|
||||||
mTouchToWindowOffsetY = ev.getRawY() - mPositionY;
|
|
||||||
|
|
||||||
final PositionListener positionListener = getPositionListener();
|
|
||||||
mLastParentX = positionListener.getPositionX();
|
|
||||||
mLastParentY = positionListener.getPositionY();
|
|
||||||
mIsDragging = true;
|
|
||||||
|
|
||||||
// MOD: Addition
|
|
||||||
mDownX = ev.getRawX();
|
|
||||||
mDownY = ev.getRawY();
|
|
||||||
mDownWidth = params.width;
|
|
||||||
mDownHeight = params.height;
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case MotionEvent.ACTION_MOVE: {
|
|
||||||
final float rawX = ev.getRawX();
|
|
||||||
final float rawY = ev.getRawY();
|
|
||||||
|
|
||||||
// Vertical hysteresis: vertical down movement tends to snap to ideal offset
|
|
||||||
final float previousVerticalOffset = mTouchToWindowOffsetY - mLastParentY;
|
|
||||||
final float currentVerticalOffset = rawY - mPositionY - mLastParentY;
|
|
||||||
float newVerticalOffset;
|
|
||||||
if (previousVerticalOffset < mIdealVerticalOffset) {
|
|
||||||
newVerticalOffset = Math.min(currentVerticalOffset, mIdealVerticalOffset);
|
|
||||||
newVerticalOffset = Math.max(newVerticalOffset, previousVerticalOffset);
|
|
||||||
} else {
|
|
||||||
newVerticalOffset = Math.max(currentVerticalOffset, mIdealVerticalOffset);
|
|
||||||
newVerticalOffset = Math.min(newVerticalOffset, previousVerticalOffset);
|
|
||||||
}
|
|
||||||
mTouchToWindowOffsetY = newVerticalOffset + mLastParentY;
|
|
||||||
|
|
||||||
final float newPosX = rawX - mTouchToWindowOffsetX + mHotspotX;
|
|
||||||
final float newPosY = rawY - mTouchToWindowOffsetY + mTouchOffsetY;
|
|
||||||
|
|
||||||
int newWidth = (int) (mDownWidth + (rawX - mDownX));
|
|
||||||
int newHeight = (int) (mDownHeight + (rawY - mDownY));
|
|
||||||
|
|
||||||
// mDownX = rawX;
|
|
||||||
// mDownY = rawY;
|
|
||||||
|
|
||||||
params.width = Math.max(50, newWidth);
|
|
||||||
params.height = Math.max(50, newHeight);
|
|
||||||
|
|
||||||
mView.setLayoutParams(params);
|
|
||||||
|
|
||||||
updatePosition(newPosX, newPosY);
|
|
||||||
// break;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
case MotionEvent.ACTION_UP:
|
|
||||||
filterOnTouchUp();
|
|
||||||
mIsDragging = false;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case MotionEvent.ACTION_CANCEL:
|
|
||||||
mIsDragging = false;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isDragging() {
|
public boolean isDragging() {
|
||||||
return mIsDragging;
|
return mIsDragging;
|
||||||
}
|
}
|
||||||
|
@ -25,8 +25,7 @@ import android.view.*;
|
|||||||
import net.kdt.pojavlaunch.customcontrols.buttons.ControlButton;
|
import net.kdt.pojavlaunch.customcontrols.buttons.ControlButton;
|
||||||
|
|
||||||
|
|
||||||
public class SelectionEndHandleView extends HandleView
|
public class SelectionEndHandleView extends HandleView {
|
||||||
{
|
|
||||||
public SelectionEndHandleView(ControlButton view) {
|
public SelectionEndHandleView(ControlButton view) {
|
||||||
super(view);
|
super(view);
|
||||||
}
|
}
|
||||||
|
@ -20,5 +20,5 @@
|
|||||||
package net.kdt.pojavlaunch.customcontrols.handleview;
|
package net.kdt.pojavlaunch.customcontrols.handleview;
|
||||||
|
|
||||||
public interface ViewPositionListener {
|
public interface ViewPositionListener {
|
||||||
public void updatePosition(int parentPositionX, int parentPositionY, boolean parentPositionChanged, boolean parentScrolled);
|
void updatePosition(int parentPositionX, int parentPositionY, boolean parentPositionChanged, boolean parentScrolled);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user