Merge change 25959 into eclair

* changes:
  Add better transition to rotary lock widget when triggering: spin around instead of snap back.
This commit is contained in:
Android (Google) Code Review
2009-09-20 12:59:59 -04:00
6 changed files with 47 additions and 37 deletions

View File

@@ -69,12 +69,6 @@ public class RotarySelector extends View {
private int mAnimatingDelta;
private AccelerateInterpolator mInterpolator;
/**
* True after triggering an action if the user of {@link OnDialTriggerListener} wants to
* freeze the UI (until they transition to another screen).
*/
private boolean mFrozen = false;
/**
* If the user is currently dragging something.
*/
@@ -119,6 +113,9 @@ public class RotarySelector extends View {
private static final boolean DRAW_CENTER_DIMPLE = false;
private int mEdgeTriggerThresh;
private int mDimpleWidth;
private int mBackgroundWidth;
private int mBackgroundHeight;
public RotarySelector(Context context) {
this(context, null);
@@ -155,6 +152,11 @@ public class RotarySelector extends View {
mInterpolator = new AccelerateInterpolator();
mEdgeTriggerThresh = (int) (mDensity * EDGE_TRIGGER_DIP);
mDimpleWidth = mDimple.getIntrinsicWidth();
mBackgroundWidth = mBackground.getIntrinsicWidth();
mBackgroundHeight = mBackground.getIntrinsicHeight();
}
/**
@@ -214,7 +216,7 @@ public class RotarySelector extends View {
final int width = MeasureSpec.getSize(widthMeasureSpec); // screen width
final int arrowH = mArrowShortLeftAndRight.getIntrinsicHeight();
final int backgroundH = mBackground.getIntrinsicHeight();
final int backgroundH = mBackgroundHeight;
// by making the height less than arrow + bg, arrow and bg will be scrunched together,
// overlaying somewhat (though on transparent portions of the drawable).
@@ -228,9 +230,9 @@ public class RotarySelector extends View {
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
mLeftHandleX = (int) (EDGE_PADDING_DIP * mDensity) + mDimple.getIntrinsicWidth() / 2;
mLeftHandleX = (int) (EDGE_PADDING_DIP * mDensity) + mDimpleWidth / 2;
mRightHandleX =
getWidth() - (int) (EDGE_PADDING_DIP * mDensity) - mDimple.getIntrinsicWidth() / 2;
getWidth() - (int) (EDGE_PADDING_DIP * mDensity) - mDimpleWidth / 2;
}
// private Paint mPaint = new Paint();
@@ -239,15 +241,14 @@ public class RotarySelector extends View {
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (DBG) {
log(String.format("onDraw: mAnimating=%s, mTouchDragOffset=%d, mGrabbedState=%d," +
"mFrozen=%s",
mAnimating, mTouchDragOffset, mGrabbedState, mFrozen));
log(String.format("onDraw: mAnimating=%s, mTouchDragOffset=%d, mGrabbedState=%d",
mAnimating, mTouchDragOffset, mGrabbedState));
}
final int height = getHeight();
// update animating state before we draw anything
if (mAnimating && !mFrozen) {
if (mAnimating) {
long millisLeft = mAnimationEndTime - currentAnimationTimeMillis();
if (DBG) log("millisleft for animating: " + millisLeft);
if (millisLeft <= 0) {
@@ -260,8 +261,8 @@ public class RotarySelector extends View {
}
// Background:
final int backgroundW = mBackground.getIntrinsicWidth();
final int backgroundH = mBackground.getIntrinsicHeight();
final int backgroundW = mBackgroundWidth;
final int backgroundH = mBackgroundHeight;
final int backgroundY = height - backgroundH;
if (DBG) log("- Background INTRINSIC: " + backgroundW + " x " + backgroundH);
mBackground.setBounds(0, backgroundY,
@@ -383,12 +384,12 @@ public class RotarySelector extends View {
*/
@Override
public boolean onTouchEvent(MotionEvent event) {
if (mAnimating || mFrozen) {
if (mAnimating) {
return true;
}
final int eventX = (int) event.getX();
final int hitWindow = mDimple.getIntrinsicWidth();
final int hitWindow = mDimpleWidth;
final int action = event.getAction();
switch (action) {
@@ -419,14 +420,29 @@ public class RotarySelector extends View {
invalidate();
if (eventX >= getRight() - mEdgeTriggerThresh && !mTriggered) {
mTriggered = true;
mFrozen = dispatchTriggerEvent(OnDialTriggerListener.LEFT_HANDLE);
dispatchTriggerEvent(OnDialTriggerListener.LEFT_HANDLE);
// set up "spin around animation"
mAnimating = true;
mAnimationEndTime = currentAnimationTimeMillis() + ANIMATION_DURATION_MILLIS;
mAnimatingDelta = -mBackgroundWidth;
mTouchDragOffset = 0;
mGrabbedState = NOTHING_GRABBED;
invalidate();
}
} else if (mGrabbedState == RIGHT_HANDLE_GRABBED) {
mTouchDragOffset = eventX - mRightHandleX;
invalidate();
if (eventX <= mEdgeTriggerThresh && !mTriggered) {
mTriggered = true;
mFrozen = dispatchTriggerEvent(OnDialTriggerListener.RIGHT_HANDLE);
dispatchTriggerEvent(OnDialTriggerListener.RIGHT_HANDLE);
// set up "spin around animation"
mAnimating = true;
mAnimationEndTime = currentAnimationTimeMillis() + ANIMATION_DURATION_MILLIS;
mAnimatingDelta = mBackgroundWidth;
mTouchDragOffset = 0;
mGrabbedState = NOTHING_GRABBED;
invalidate();
}
}
break;
@@ -435,11 +451,13 @@ public class RotarySelector extends View {
// handle animating back to start if they didn't trigger
if (mGrabbedState == LEFT_HANDLE_GRABBED
&& Math.abs(eventX - mLeftHandleX) > 5) {
// set up "snap back" animation
mAnimating = true;
mAnimationEndTime = currentAnimationTimeMillis() + ANIMATION_DURATION_MILLIS;
mAnimatingDelta = eventX - mLeftHandleX;
} else if (mGrabbedState == RIGHT_HANDLE_GRABBED
&& Math.abs(eventX - mRightHandleX) > 5) {
// set up "snap back" animation
mAnimating = true;
mAnimationEndTime = currentAnimationTimeMillis() + ANIMATION_DURATION_MILLIS;
mAnimatingDelta = eventX - mRightHandleX;
@@ -504,12 +522,11 @@ public class RotarySelector extends View {
/**
* Dispatches a trigger event to our listener.
*/
private boolean dispatchTriggerEvent(int whichHandle) {
private void dispatchTriggerEvent(int whichHandle) {
vibrate(VIBRATE_LONG);
if (mOnDialTriggerListener != null) {
return mOnDialTriggerListener.onDialTrigger(this, whichHandle);
mOnDialTriggerListener.onDialTrigger(this, whichHandle);
}
return false;
}
/**
@@ -529,23 +546,14 @@ public class RotarySelector extends View {
*/
public static final int RIGHT_HANDLE = 2;
/**
* @hide
* The center handle is currently unused.
*/
public static final int CENTER_HANDLE = 3;
/**
* Called when the dial is triggered.
*
* @param v The view that was triggered
* @param whichHandle Which "dial handle" the user grabbed,
* either {@link #LEFT_HANDLE}, {@link #RIGHT_HANDLE}, or
* {@link #CENTER_HANDLE}.
* @return Whether the widget should freeze (e.g when the action goes to another screen,
* you want the UI to stay put until the transition occurs).
* either {@link #LEFT_HANDLE}, {@link #RIGHT_HANDLE}.
*/
boolean onDialTrigger(View v, int whichHandle);
void onDialTrigger(View v, int whichHandle);
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 906 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 977 B

View File

@@ -83,6 +83,7 @@
android:layout_marginTop="6dip"
android:textAppearance="?android:attr/textAppearanceMedium"
android:textColor="?android:attr/textColorSecondary"
android:drawablePadding="4dip"
/>
<TextView
@@ -94,6 +95,7 @@
android:layout_marginTop="6dip"
android:textAppearance="?android:attr/textAppearanceMedium"
android:textColor="?android:attr/textColorSecondary"
android:drawablePadding="4dip"
/>
<TextView
@@ -108,15 +110,15 @@
android:layout_marginTop="12dip"
/>
<!-- By having the rotary selector hang below "screen locked" text, we get a layout more
robust for different screen sizes. On wvga, the widget should be flush with the bottom.-->
<!-- By having the rotary selector hang from the top, we get a layout more
robust for different screen sizes. On hvga, the widget should be flush with the bottom.-->
<com.android.internal.widget.RotarySelector
android:id="@+id/rotary"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_below="@id/screenLocked"
android:layout_centerHorizontal="true"
android:layout_marginTop="24dip"
android:layout_alignParentTop="true"
android:layout_marginTop="286dip"
/>
<!-- emergency call button shown when sim is missing or PUKd -->