import android.view.MotionEvent;
import android.view.View;
+import androidx.annotation.Nullable;
+
import net.ktnx.mobileledger.utils.Colors;
import net.ktnx.mobileledger.utils.DimensionUtils;
-import androidx.annotation.Nullable;
+import java.util.Locale;
import static net.ktnx.mobileledger.utils.Logger.debug;
public class HueRing extends View {
public static final int hueStepDegrees = 5;
private Paint ringPaint, initialPaint, currentPaint, markerPaint;
- private int centerX, centerY;
- private int diameter;
+ private int center;
private int padding;
private int initialHueDegrees;
private int color, hueDegrees;
private float outerR;
private float innerR;
private float bandWidth;
- private float ringR;
- private float innerDiameter;
private float centerR;
- private RectF centerRect;
- private RectF ringRect;
+ private RectF centerRect = new RectF();
+ private RectF ringRect = new RectF();
private int markerOverflow;
private int markerStrokeWidth;
public HueRing(Context context, @Nullable AttributeSet attrs) {
return hueDegrees;
}
public void setHue(int hueDegrees) {
- if (hueDegrees == -1) hueDegrees = Colors.DEFAULT_HUE_DEG;
+ if (hueDegrees == -1)
+ hueDegrees = Colors.DEFAULT_HUE_DEG;
if (hueDegrees != Colors.DEFAULT_HUE_DEG) {
// round to 15 degrees
int rem = hueDegrees % hueStepDegrees;
- if (rem < (hueStepDegrees / 2)) hueDegrees -= rem;
- else hueDegrees += hueStepDegrees - rem;
+ if (rem < (hueStepDegrees / 2))
+ hueDegrees -= rem;
+ else
+ hueDegrees += hueStepDegrees - rem;
}
this.hueDegrees = hueDegrees;
// p.arcTo(-innerEdge, -innerEdge, innerEdge, innerEdge, -hueStepDegrees / 2f,
// hueStepDegrees, true);
// p.lineTo(outerEdge * cr, outerEdge * sr);
- p.arcTo(-outerEdge, -outerEdge, outerEdge, outerEdge, hueStepDegrees / 2f,
- -hueStepDegrees, false);
+ p.arcTo(-outerEdge, -outerEdge, outerEdge, outerEdge, hueStepDegrees / 2f, -hueStepDegrees,
+ false);
// p.close();
canvas.save();
canvas.translate(center, center);
int heightMode = View.MeasureSpec.getMode(heightMeasureSpec);
int heightSize = View.MeasureSpec.getSize(heightMeasureSpec);
+ int diameter;
if ((widthMode == MeasureSpec.AT_MOST) && (heightMode == MeasureSpec.AT_MOST)) {
diameter = Math.min(widthSize, heightSize);
}
// getContext().getResources().getDimension(R.dimen.activity_horizontal_margin)) / 2;
diameter -= 2 * padding;
outerR = diameter / 2f;
- centerX = padding + (int) outerR;
- centerY = centerX;
+ center = padding + (int) outerR;
bandWidth = diameter / 3.5f;
- ringR = outerR - bandWidth / 2f;
+ float ringR = outerR - bandWidth / 2f;
innerR = outerR - bandWidth;
- ringRect = new RectF(-ringR, -ringR, ringR, ringR);
+ ringRect.set(-ringR, -ringR, ringR, ringR);
- innerDiameter = diameter - 2 * bandWidth;
+ float innerDiameter = diameter - 2 * bandWidth;
centerR = innerDiameter * 0.5f;
- centerRect = new RectF(-centerR, -centerR, centerR, centerR);
+ centerRect.set(-centerR, -centerR, centerR, centerR);
+ }
+ @Override
+ public boolean performClick() {
+ return super.performClick();
}
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
case MotionEvent.ACTION_MOVE:
- float x = event.getX() - centerX;
- float y = event.getY() - centerY;
+ float x = event.getX() - center;
+ float y = event.getY() - center;
float dist = (float) Math.hypot(x, y);
float angleRad = (float) Math.atan2(y, x);
// angleRad is [-𝜋; +𝜋]
float hue = (float) (angleRad / (2 * Math.PI));
- if (hue < 0) hue += 1;
- debug("TMP",
- String.format("x=%1.3f, y=%1.3f, angle=%1.3frad, hueDegrees=%1.3f", x, y,
- angleRad, hue));
+ if (hue < 0)
+ hue += 1;
+ debug("TMP", String.format(Locale.US,
+ "x=%1.3f, y=%1.3f, angle=%1.3f rad, hueDegrees=%1.3f", x, y, angleRad,
+ hue));
setHue(hue);
break;
+ case MotionEvent.ACTION_UP:
+ performClick();
+ break;
}
-
return true;
}
public void setInitialHue(int initialHue) {
- if (initialHue == -1) initialHue = Colors.DEFAULT_HUE_DEG;
+ if (initialHue == -1)
+ initialHue = Colors.DEFAULT_HUE_DEG;
this.initialHueDegrees = initialHue;
this.initialPaint.setColor(Colors.getPrimaryColorForHue(initialHue));
invalidate();