summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Kolb <kolby@google.com>2013-04-10 14:16:19 -0700
committerMichael Kolb <kolby@google.com>2013-04-15 16:03:28 -0700
commitc246c3717430d5a3d84d2bcbaedbd4094f65bad9 (patch)
treed6213b2b689597e201e1d1fb1243aab4719ca42a
parentad30f960879285c4dadb10d5b7531e05c345587f (diff)
downloadandroid_packages_apps_Gallery2-c246c3717430d5a3d84d2bcbaedbd4094f65bad9.tar.gz
android_packages_apps_Gallery2-c246c3717430d5a3d84d2bcbaedbd4094f65bad9.tar.bz2
android_packages_apps_Gallery2-c246c3717430d5a3d84d2bcbaedbd4094f65bad9.zip
Angle menu at edge of screen
Bug: 8618699 Adjust touch slices; adjust label position Change-Id: I5bbf16fc570eb9801198847991395699de89ffa3
-rw-r--r--res/values/dimens.xml2
-rw-r--r--src/com/android/camera/ui/PieRenderer.java40
2 files changed, 36 insertions, 6 deletions
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index c039b4cdd..a50df6652 100644
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -82,6 +82,8 @@
<dimen name="pie_arc_offset">48dp</dimen>
<dimen name="pie_item_radius">370dp</dimen>
<dimen name="pie_arc_radius">214dp</dimen>
+ <dimen name="pie_deadzone_width">48dp</dimen>
+ <dimen name="pie_anglezone_width">80dp</dimen>
<dimen name="focus_radius_offset">8dp</dimen>
<dimen name="focus_inner_offset">24dp</dimen>
<dimen name="focus_outer_stroke">3dp</dimen>
diff --git a/src/com/android/camera/ui/PieRenderer.java b/src/com/android/camera/ui/PieRenderer.java
index 4374fa624..03c995cb4 100644
--- a/src/com/android/camera/ui/PieRenderer.java
+++ b/src/com/android/camera/ui/PieRenderer.java
@@ -27,6 +27,7 @@ import android.graphics.PointF;
import android.graphics.RectF;
import android.os.Handler;
import android.os.Message;
+import android.util.FloatMath;
import android.view.MotionEvent;
import android.view.ViewConfiguration;
import android.view.animation.Animation;
@@ -76,6 +77,7 @@ public class PieRenderer extends OverlayRenderer
private static final int MSG_OPENSUBMENU = 2;
protected static float CENTER = (float) Math.PI / 2;
+ protected static float RAD20 = (float)(Math.PI /9); // 20 degrees
protected static final float SWEEP_SLICE = 0.14f;
protected static final float SWEEP_ARC = 0.23f;
@@ -134,6 +136,9 @@ public class PieRenderer extends OverlayRenderer
private volatile boolean mFocusCancelled;
private PointF mPolar = new PointF();
private TextDrawable mLabel;
+ private int mDeadZone;
+ private int mAngleZone;
+ private float mCenterAngle;
@@ -215,6 +220,8 @@ public class PieRenderer extends OverlayRenderer
mArcRadius = res.getDimensionPixelSize(R.dimen.pie_arc_radius);
mArcOffset = res.getDimensionPixelSize(R.dimen.pie_arc_offset);
mLabel = new TextDrawable(res);
+ mDeadZone = res.getDimensionPixelSize(R.dimen.pie_deadzone_width);
+ mAngleZone = res.getDimensionPixelSize(R.dimen.pie_anglezone_width);
}
private PieItem getRoot() {
@@ -311,7 +318,7 @@ public class PieRenderer extends OverlayRenderer
public void setCenter(int x, int y) {
mPieCenterX = x;
mPieCenterY = y;
- mSliceCenterY = y - mArcOffset + mSliceRadius;
+ mSliceCenterY = y + mSliceRadius - mArcOffset;
mArcCenterY = y - mArcOffset + mArcRadius;
}
@@ -337,12 +344,14 @@ public class PieRenderer extends OverlayRenderer
}
private void layoutPie() {
+ mCenterAngle = getCenterAngle();
layoutItems(0, getRoot().getItems());
layoutLabel(0);
}
private void layoutLabel(int level) {
- int x = mPieCenterX;
+ int x = mPieCenterX - (int) (FloatMath.sin(mCenterAngle - CENTER)
+ * (mArcRadius + (level + 2) * mRadiusInc));
int y = mArcCenterY - mArcRadius - (level + 2) * mRadiusInc;
int w = mLabel.getIntrinsicWidth();
int h = mLabel.getIntrinsicHeight();
@@ -392,11 +401,25 @@ public class PieRenderer extends OverlayRenderer
}
private float getSliceCenter(PieItem item) {
- return getCenter(item.getPosition(), item.getCount(), SWEEP_SLICE);
+ float center = (getCenterAngle() - CENTER) * 0.5f + CENTER;
+ return center + (item.getCount() - 1) * SWEEP_SLICE / 2f
+ - item.getPosition() * SWEEP_SLICE;
}
private float getCenter(int pos, int count, float sweep) {
- return CENTER + (count - 1) * sweep / 2f - pos * sweep;
+ return mCenterAngle + (count - 1) * sweep / 2f - pos * sweep;
+ }
+
+ private float getCenterAngle() {
+ float center = CENTER;
+ if (mPieCenterX < mDeadZone + mAngleZone) {
+ center = CENTER - (mAngleZone - mPieCenterX + mDeadZone) * RAD20
+ / (float) mAngleZone;
+ } else if (mPieCenterX > getWidth() - mDeadZone - mAngleZone) {
+ center = CENTER + (mPieCenterX - (getWidth() - mDeadZone - mAngleZone)) * RAD20
+ / (float) mAngleZone;
+ }
+ return center;
}
/**
@@ -521,8 +544,10 @@ public class PieRenderer extends OverlayRenderer
if (p < min) min = p;
if (p > max) max = p;
}
- float start = CENTER + (count - 1) * SWEEP_ARC / 2f - min * SWEEP_ARC + SWEEP_ARC / 2f;
- float end = CENTER + (count - 1) * SWEEP_ARC / 2f - max * SWEEP_ARC - SWEEP_ARC / 2f;
+ float start = mCenterAngle + (count - 1) * SWEEP_ARC / 2f - min * SWEEP_ARC
+ + SWEEP_ARC / 2f;
+ float end = mCenterAngle + (count - 1) * SWEEP_ARC / 2f - max * SWEEP_ARC
+ - SWEEP_ARC / 2f;
int cy = mArcCenterY - level * mRadiusInc;
canvas.drawArc(new RectF(mPieCenterX - mArcRadius, cy - mArcRadius,
mPieCenterX + mArcRadius, cy + mArcRadius),
@@ -566,6 +591,9 @@ public class PieRenderer extends OverlayRenderer
int action = evt.getActionMasked();
getPolar(x, y, !mTapMode, mPolar);
if (MotionEvent.ACTION_DOWN == action) {
+ if ((x < mDeadZone) || (x > getWidth() - mDeadZone)) {
+ return false;
+ }
mDown.x = (int) evt.getX();
mDown.y = (int) evt.getY();
mOpening = false;