mirror of
https://github.com/AngelAuraMC/Amethyst-Android.git
synced 2025-09-14 07:05:40 -04:00
Finally. The color selector is at home.
Other changes: The ColorSelectionListener is back! Now ColorSelector.runColor(int) is used for unified initialization Added invalidate flag into SVRectangleView.setColor() to avoid a useless invalidation in runColor() Moved repeating Color.HSVtoColor into ColorSelector.dispatchColorChange() Fixed a bug: mAlphaSelected wasn't set to the appropriate value by runColor, leading to the Color Preview and HEX edit breaking in some cases
This commit is contained in:
parent
393e24a90b
commit
cfae15c680
@ -10,7 +10,6 @@ import android.graphics.RectF;
|
||||
import android.graphics.Shader;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.util.AttributeSet;
|
||||
import android.util.Log;
|
||||
import android.view.MotionEvent;
|
||||
import android.view.View;
|
||||
|
||||
|
@ -0,0 +1,9 @@
|
||||
package net.kdt.pojavlaunch.colorselector;
|
||||
|
||||
public interface ColorSelectionListener {
|
||||
/**
|
||||
* This method gets called by the ColorSelector when the color is selected
|
||||
* @param color the selected color
|
||||
*/
|
||||
void onColorSelected(int color);
|
||||
}
|
@ -18,77 +18,108 @@ public class ColorSelector implements HueSelectionListener, RectangleSelectionLi
|
||||
AlphaView mAlphaView;
|
||||
ColorSideBySideView mColorView;
|
||||
EditText mTextView;
|
||||
ColorSelectionListener mColorSelectionListener;
|
||||
float[] mHueTemplate = new float[] {0,1,1};
|
||||
float[] mHsvSelected = new float[] {360,1,1};
|
||||
int mAlphaSelected = 0xff;
|
||||
boolean mWatch = true;
|
||||
AlertDialog mDialog;
|
||||
public ColorSelector(Context context) {
|
||||
|
||||
/**
|
||||
* Creates a color selector dialog for this Context.
|
||||
* @param context Context used for this ColorSelector dialog
|
||||
* @param colorSelectionListener Color selection listener to which the events will be sent to. Can be null.
|
||||
*/
|
||||
public ColorSelector(Context context, ColorSelectionListener colorSelectionListener) {
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(context);
|
||||
View view = LayoutInflater.from(context).inflate(R.layout.dialog_color_selector,null);
|
||||
mHueView = view.findViewById(R.id.color_selector_hue_view);
|
||||
mHueView.setHue(0f);
|
||||
mLuminosityIntensityView = view.findViewById(R.id.color_selector_rectangle_view);
|
||||
mLuminosityIntensityView.setColor(Color.RED);
|
||||
mLuminosityIntensityView.setLuminosityIntensity(1,1);
|
||||
mAlphaView = view.findViewById(R.id.color_selector_alpha_view);
|
||||
mAlphaView.setAlpha(0xff);
|
||||
mColorView = view.findViewById(R.id.color_selector_color_view);
|
||||
mColorView.setColor(Color.RED);
|
||||
mTextView = view.findViewById(R.id.color_selector_hex_edit);
|
||||
runColor(Color.RED);
|
||||
mHueView.setHueSelectionListener(this);
|
||||
mLuminosityIntensityView.setRectSelectionListener(this);
|
||||
mAlphaView.setAlphaSelectionListener(this);
|
||||
mTextView.addTextChangedListener(this);
|
||||
builder.setView(view);
|
||||
builder.setPositiveButton(android.R.string.ok,(dialog,which)->{
|
||||
|
||||
if (mColorSelectionListener != null) {
|
||||
mColorSelectionListener.onColorSelected(Color.HSVToColor(mAlphaSelected, mHsvSelected));
|
||||
}
|
||||
});
|
||||
builder.setNegativeButton(android.R.string.cancel, ((dialog, which) -> {}));
|
||||
mColorSelectionListener = colorSelectionListener;
|
||||
mDialog = builder.create();
|
||||
}
|
||||
|
||||
/**
|
||||
* Shows the color selector with the default (red) color selected.
|
||||
*/
|
||||
public void show() {
|
||||
runColor(Color.RED);
|
||||
dispatchColorChange();
|
||||
mDialog.show();
|
||||
}
|
||||
|
||||
/**
|
||||
* Shows the color selector with the desired ARGB color selected
|
||||
* @param previousColor the desired ARGB color
|
||||
*/
|
||||
public void show(int previousColor) {
|
||||
runColor(previousColor); // initialize
|
||||
dispatchColorChange(); // set the hex text
|
||||
mDialog.show();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onHueSelected(float hue) {
|
||||
mHsvSelected[0] = mHueTemplate[0] = hue;
|
||||
mLuminosityIntensityView.setColor(Color.HSVToColor(mHueTemplate));
|
||||
dispatchColorChange(Color.HSVToColor(mAlphaSelected, mHsvSelected));
|
||||
mLuminosityIntensityView.setColor(Color.HSVToColor(mHueTemplate), true);
|
||||
dispatchColorChange();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onLuminosityIntensityChanged(float luminosity, float intensity) {
|
||||
mHsvSelected[1] = intensity;
|
||||
mHsvSelected[2] = luminosity;
|
||||
dispatchColorChange(Color.HSVToColor(mAlphaSelected, mHsvSelected));
|
||||
dispatchColorChange();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAlphaSelected(int alpha) {
|
||||
mAlphaSelected = alpha;
|
||||
dispatchColorChange(Color.HSVToColor(mAlphaSelected, mHsvSelected));
|
||||
dispatchColorChange();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Replaces the alpha value of the color passed in, and returns the result.
|
||||
* @param color the color to replace the alpha of
|
||||
* @param alpha the alpha to use
|
||||
* @return the new color
|
||||
*/
|
||||
public static int setAlpha(int color, int alpha) {
|
||||
return color & ALPHA_MASK | ((alpha & 0xFF) << 24);
|
||||
}
|
||||
|
||||
protected void dispatchColorChange(int color) {
|
||||
//IUO: called on all color changes
|
||||
protected void dispatchColorChange() {
|
||||
int color = Color.HSVToColor(mAlphaSelected, mHsvSelected);
|
||||
mColorView.setColor(color);
|
||||
mWatch = false;
|
||||
mTextView.setText(String.format("%08X",color));
|
||||
}
|
||||
|
||||
//IUO: sets all Views to render the desired color. Used for initilaization and HEX color input
|
||||
protected void runColor(int color) {
|
||||
Color.RGBToHSV(Color.red(color), Color.green(color), Color.blue(color), mHsvSelected);
|
||||
mHueTemplate[0] = mHsvSelected[0];
|
||||
mHueView.setHue(mHsvSelected[0]);
|
||||
mLuminosityIntensityView.setColor(Color.HSVToColor(mHueTemplate));
|
||||
mLuminosityIntensityView.setColor(Color.HSVToColor(mHueTemplate), false);
|
||||
mLuminosityIntensityView.setLuminosityIntensity(mHsvSelected[2], mHsvSelected[1]);
|
||||
mAlphaView.setAlpha(Color.alpha(color));
|
||||
mAlphaSelected = Color.alpha(color);
|
||||
mAlphaView.setAlpha(mAlphaSelected);
|
||||
mColorView.setColor(color);
|
||||
}
|
||||
|
||||
|
@ -62,9 +62,9 @@ public class SVRectangleView extends View {
|
||||
invalidate();
|
||||
}
|
||||
|
||||
public void setColor(int color) {
|
||||
public void setColor(int color, boolean invalidate) {
|
||||
mColorPaint.setColor(color);
|
||||
invalidate();
|
||||
if(invalidate) invalidate();
|
||||
}
|
||||
|
||||
public void setRectSelectionListener(RectangleSelectionListener listener) {
|
||||
|
@ -9,6 +9,7 @@ import android.widget.ArrayAdapter;
|
||||
import android.widget.CheckBox;
|
||||
import android.widget.EditText;
|
||||
import android.widget.ImageButton;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.SeekBar;
|
||||
import android.widget.Spinner;
|
||||
import android.widget.TextView;
|
||||
@ -18,6 +19,7 @@ import androidx.appcompat.app.AlertDialog;
|
||||
import net.kdt.pojavlaunch.EfficientAndroidLWJGLKeycode;
|
||||
import net.kdt.pojavlaunch.R;
|
||||
import net.kdt.pojavlaunch.Tools;
|
||||
import net.kdt.pojavlaunch.colorselector.ColorSelector;
|
||||
import net.kdt.pojavlaunch.customcontrols.buttons.ControlButton;
|
||||
import net.kdt.pojavlaunch.customcontrols.ControlData;
|
||||
|
||||
@ -56,6 +58,9 @@ public class EditControlButtonPopup {
|
||||
protected TextView mStrokeWidthTextView;
|
||||
protected TextView mStrokeColorTextView;
|
||||
|
||||
protected ColorSelector mColorSelector;
|
||||
protected ImageView mEditingView;
|
||||
|
||||
protected final ControlButton mControlButton;
|
||||
protected final ControlData mProperties;
|
||||
|
||||
@ -168,9 +173,11 @@ public class EditControlButtonPopup {
|
||||
spinner.setAdapter(mAdapter);
|
||||
}
|
||||
|
||||
mColorSelector = new ColorSelector(ctx,color -> mEditingView.setImageDrawable(new ColorDrawable(color)));
|
||||
|
||||
//Set color imageButton behavior
|
||||
mBackgroundColorButton.setOnClickListener(view -> ActionPopupWindow.showColorPicker(ctx, "Edit background color", true, mBackgroundColorButton));
|
||||
mStrokeColorButton.setOnClickListener(view -> ActionPopupWindow.showColorPicker(ctx, "Edit stroke color", false, mStrokeColorButton));
|
||||
mBackgroundColorButton.setOnClickListener(this::colorButtonHandler);
|
||||
mStrokeColorButton.setOnClickListener(this::colorButtonHandler);
|
||||
|
||||
|
||||
//Set dialog buttons behavior
|
||||
@ -183,6 +190,12 @@ public class EditControlButtonPopup {
|
||||
setupCheckerboards();
|
||||
}
|
||||
|
||||
protected void colorButtonHandler(View view) {
|
||||
ImageView imgView = (ImageView) view;
|
||||
mEditingView = imgView;
|
||||
mColorSelector.show(((ColorDrawable)(imgView.getDrawable())).getColor());
|
||||
}
|
||||
|
||||
protected void setupDialogButtons(){
|
||||
//Set dialog buttons behavior
|
||||
mBuilder.setPositiveButton(android.R.string.ok, (dialogInterface1, i) -> {
|
||||
|
Loading…
x
Reference in New Issue
Block a user