- Experimental autoscale for control buttons.
- [Custom control] Implements dynamic position.
This commit is contained in:
khanhduytran0
2020-11-20 06:10:42 +07:00
parent d6417c7b5a
commit 8651abc104
9 changed files with 225 additions and 170 deletions

View File

@@ -1104,8 +1104,8 @@ public class BaseMainActivity extends LoggableActivity implements OnTouchListene
protected Button findButton(int id) {
Button button = (Button) findViewById(id);
button.setWidth((int) Tools.dpToPx(this, Tools.pxToDp(this, button.getWidth()) * LauncherPreferences.PREF_BUTTONSIZE));
button.setHeight((int) Tools.dpToPx(this, Tools.pxToDp(this, button.getHeight()) * LauncherPreferences.PREF_BUTTONSIZE));
button.setWidth((int) (button.getWidth() * LauncherPreferences.PREF_BUTTONSIZE));
button.setHeight((int) (button.getHeight() * LauncherPreferences.PREF_BUTTONSIZE));
button.setOnTouchListener(this);
button.setFocusable(false);
button.setFocusableInTouchMode(false);

View File

@@ -26,6 +26,7 @@ import org.apache.commons.compress.archivers.tar.*;
import org.apache.commons.compress.compressors.xz.*;
import org.apache.commons.io.*;
import net.kdt.pojavlaunch.prefs.*;
import org.lwjgl.glfw.*;
public class PojavLoginActivity extends AppCompatActivity
// MineActivity
@@ -61,6 +62,7 @@ public class PojavLoginActivity extends AppCompatActivity
}
Tools.updateWindowSize(this);
ControlData.pixelOf2dp = (int) Tools.dpToPx(this, 2);
ControlData.pixelOf30dp = (int) Tools.dpToPx(this, 30);
ControlData.pixelOf50dp = (int) Tools.dpToPx(this, 50);

View File

@@ -345,7 +345,9 @@ public final class Tools
}
public static float dpToPx(Context ctx, float dp) {
return (dp * ctx.getResources().getDisplayMetrics().density);
// 921600 = 1280 * 720, default scale
float scaledDp = dp / 921600 * CallbackBridge.windowWidth * CallbackBridge.windowHeight;
return (scaledDp * ctx.getResources().getDisplayMetrics().density);
}
public static void copyAssetFile(Context ctx, String fileName, String output, boolean overwrite) throws Exception

View File

@@ -10,138 +10,140 @@ import android.view.ViewGroup.*;
public class ControlButton extends Button implements OnLongClickListener, OnTouchListener
{
private GestureDetector mGestureDetector;
private ControlData mProperties;
private SelectionEndHandleView mHandleView;
private boolean mCanModify = false;
private boolean mCanTriggerLongClick = true;
public ControlButton(Context ctx, ControlData properties) {
super(ctx);
mGestureDetector = new GestureDetector(ctx, new SingleTapConfirm());
setBackgroundResource(R.drawable.control_button);
setOnLongClickListener(this);
setOnTouchListener(this);
setProperties(properties);
mHandleView = new SelectionEndHandleView(this);
}
public HandleView getHandleView() {
return mHandleView;
}
private GestureDetector mGestureDetector;
private ControlData mProperties;
private SelectionEndHandleView mHandleView;
public ControlData getProperties() {
return mProperties;
}
public void setProperties(ControlData properties) {
setProperties(properties, true);
}
public void setProperties(ControlData properties, boolean changePos) {
mProperties = properties;
private boolean mCanModify = false;
private boolean mCanTriggerLongClick = true;
public ControlButton(Context ctx, ControlData properties) {
super(ctx);
mGestureDetector = new GestureDetector(ctx, new SingleTapConfirm());
setBackgroundResource(R.drawable.control_button);
setOnLongClickListener(this);
setOnTouchListener(this);
setProperties(properties);
mHandleView = new SelectionEndHandleView(this);
}
public HandleView getHandleView() {
return mHandleView;
}
public ControlData getProperties() {
return mProperties;
}
public void setProperties(ControlData properties) {
setProperties(properties, true);
}
public void setProperties(ControlData properties, boolean changePos) {
mProperties = properties;
properties.update();
// com.android.internal.R.string.delete
// android.R.string.
setText(properties.name);
if (changePos) {
setTranslationX(moveX = properties.x);
setTranslationY(moveY = properties.y);
}
if (properties.specialButtonListener == null) {
// com.android.internal.R.string.delete
// android.R.string.
setText(properties.name);
if (changePos) {
setTranslationX(moveX = properties.x);
setTranslationY(moveY = properties.y);
}
if (properties.specialButtonListener == null) {
// A non-special button or inside custom controls screen so skip listener
} else if (properties.specialButtonListener instanceof View.OnClickListener) {
setOnClickListener((View.OnClickListener) properties.specialButtonListener);
} else if (properties.specialButtonListener instanceof View.OnTouchListener) {
setOnTouchListener((View.OnTouchListener) properties.specialButtonListener);
} else {
throw new IllegalArgumentException("Field " + ControlData.class.getName() + ".specialButtonListener must be View.OnClickListener or View.OnTouchListener, but is " + properties.specialButtonListener.getClass().getName());
}
setLayoutParams(new FrameLayout.LayoutParams(properties.width, properties.height));
}
setOnClickListener((View.OnClickListener) properties.specialButtonListener);
} else if (properties.specialButtonListener instanceof View.OnTouchListener) {
setOnTouchListener((View.OnTouchListener) properties.specialButtonListener);
} else {
throw new IllegalArgumentException("Field " + ControlData.class.getName() + ".specialButtonListener must be View.OnClickListener or View.OnTouchListener, but is " + properties.specialButtonListener.getClass().getName());
}
@Override
public void setLayoutParams(ViewGroup.LayoutParams params)
{
super.setLayoutParams(params);
mProperties.width = params.width;
mProperties.height = params.height;
}
@Override
public void setTranslationX(float x)
{
super.setTranslationX(x);
mProperties.x = x;
}
setLayoutParams(new FrameLayout.LayoutParams(properties.width, properties.height));
}
@Override
public void setTranslationY(float y) {
super.setTranslationY(y);
mProperties.y = y;
}
public void updateProperties() {
setProperties(mProperties);
}
@Override
public void setLayoutParams(ViewGroup.LayoutParams params)
{
super.setLayoutParams(params);
@Override
public boolean onLongClick(View p1)
{
if (!mCanTriggerLongClick) return false;
mProperties.width = params.width;
mProperties.height = params.height;
}
if (mHandleView.isShowing()) {
mHandleView.hide();
} else {
if (getParent() != null) {
((ControlLayout) getParent()).hideAllHandleViews();
}
mHandleView.show();
}
return true;
}
private float moveX, moveY;
private float downX, downY;
@Override
public boolean onTouch(View view, MotionEvent event) {
if (!mCanModify) {
mCanTriggerLongClick = false;
return false;
}
switch (event.getActionMasked()) {
case MotionEvent.ACTION_DOWN:
mCanTriggerLongClick = true;
downX = event.getX();
downY = event.getY();
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_MOVE:
mCanTriggerLongClick = false;
moveX += event.getX() - downX;
moveY += event.getY() - downY;
setTranslationX(moveX);
setTranslationY(moveY);
break;
}
return false;
}
public void setModifiable(boolean z) {
mCanModify = z;
}
@Override
public void setTranslationX(float x) {
super.setTranslationX(x);
mProperties.x = x;
}
@Override
public void setTranslationY(float y) {
super.setTranslationY(y);
mProperties.y = y;
}
public void updateProperties() {
setProperties(mProperties);
}
@Override
public boolean onLongClick(View p1)
{
if (!mCanTriggerLongClick) return false;
if (mHandleView.isShowing()) {
mHandleView.hide();
} else {
if (getParent() != null) {
((ControlLayout) getParent()).hideAllHandleViews();
}
mHandleView.show();
}
return true;
}
private float moveX, moveY;
private float downX, downY;
@Override
public boolean onTouch(View view, MotionEvent event) {
if (!mCanModify) {
mCanTriggerLongClick = false;
return false;
}
switch (event.getActionMasked()) {
case MotionEvent.ACTION_DOWN:
mCanTriggerLongClick = true;
downX = event.getX();
downY = event.getY();
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_MOVE:
mCanTriggerLongClick = false;
moveX += event.getX() - downX;
moveY += event.getY() - downY;
if (!mProperties.isDynamicBtn) {
setTranslationX(moveX);
setTranslationY(moveY);
}
break;
}
return false;
}
public void setModifiable(boolean z) {
mCanModify = z;
}
}

View File

@@ -31,6 +31,7 @@ public class ControlData implements Cloneable
* bigger device or vice versa.
*/
public String dynamicX, dynamicY;
public boolean isDynamicBtn;
public static ControlData[] getSpecialButtons(){
if (SPECIAL_BUTTONS == null) {
@@ -98,6 +99,7 @@ public class ControlData implements Cloneable
this.y = y;
this.width = width;
this.height = height;
this.isDynamicBtn = false;
}
public ControlData(String name, int keycode, String dynamicX, String dynamicY) {
@@ -116,6 +118,7 @@ public class ControlData implements Cloneable
this(name, keycode, 0, 0, width, height);
this.dynamicX = dynamicX;
this.dynamicY = dynamicY;
this.isDynamicBtn = true;
update();
}
@@ -132,7 +135,7 @@ public class ControlData implements Cloneable
}
public void update() {
if (dynamicX == null || dynamicY == null) {
if (!isDynamicBtn) {
return;
}