From 278ec5d6f57f01fb5d9acce5794daf66f5535baa Mon Sep 17 00:00:00 2001 From: Karl Rosaen Date: Sun, 20 Sep 2009 09:48:53 -0700 Subject: [PATCH] Add better transition to rotary lock widget when triggering: spin around instead of snap back. Also add some icons and make a layout tweak, used by the lock screen (coming in a commit to android.policy). --- .../internal/widget/RotarySelector.java | 74 ++++++++++-------- .../res/drawable-hdpi/ic_lock_ringer_off.png | Bin 0 -> 1378 bytes .../res/drawable-hdpi/ic_lock_ringer_on.png | Bin 0 -> 1757 bytes .../res/drawable-mdpi/ic_lock_ringer_off.png | Bin 0 -> 906 bytes .../res/drawable-mdpi/ic_lock_ringer_on.png | Bin 0 -> 977 bytes .../layout/keyguard_screen_rotary_unlock.xml | 10 ++- 6 files changed, 47 insertions(+), 37 deletions(-) create mode 100644 core/res/res/drawable-hdpi/ic_lock_ringer_off.png create mode 100644 core/res/res/drawable-hdpi/ic_lock_ringer_on.png create mode 100644 core/res/res/drawable-mdpi/ic_lock_ringer_off.png create mode 100644 core/res/res/drawable-mdpi/ic_lock_ringer_on.png diff --git a/core/java/com/android/internal/widget/RotarySelector.java b/core/java/com/android/internal/widget/RotarySelector.java index 712f1bfc056d2..750b2a96f3f01 100644 --- a/core/java/com/android/internal/widget/RotarySelector.java +++ b/core/java/com/android/internal/widget/RotarySelector.java @@ -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); } diff --git a/core/res/res/drawable-hdpi/ic_lock_ringer_off.png b/core/res/res/drawable-hdpi/ic_lock_ringer_off.png new file mode 100644 index 0000000000000000000000000000000000000000..e7cb234bf04e5f157cdcdbe569ab3a5fff4f852c GIT binary patch literal 1378 zcmV-o1)chdP)MB!|bvQ5BDnb8QxMxfz6a6;h z3uXn6S7vW-&t`ISd+72i2)IK(Y;SMZBiI8iEya*5Y zHa9nyA}JO8MSye(4Gj&1+~r%I6K?I02$PtYct@kre1&ysV`JkJBsw!NFz^(>S8!iK z;0p>0^0TwEwKADZT2fL{(AL)0edq<-!dbwULPF=~=h@lWS%-CQZjNnjZSBX|cXxMp zIZvyKi;MM3OG~DOg#~tee0&L>xQ}%|Xh42`e*MhMjB#;sk)4{FT0%%_ur9ZU&k+x} z)5hbhd{X!3dthg0#{#SVSy54;$GRAn*7^AOC>t6Y9w#R!dq+k_2Il1C+=Dly>+9>w zsi~=jeSLk;aQv?eNn$RpPb2&sAlcsDHX>*KsH&=}qqV%eJe`-9m$Id$rQ|vUqr(CC zw6wIs{{H@_I6|Rixex+m&C?P%&SM;j>gwwHwY4>QVPT=#!^7hS-7^>r%NZFNk48pD zesL81r4q2!2Y6m((d<~NuC$KcU}4Yjl1l6-fzv2IXZQ(+NTE{ck4lq+q*YV3!Nj_T zq0i*&>+6G@_!cwNXH;Sx#dfY)hy!Zf1NeP_6ApYVUzsCsj z15&``?d`3642h18{?btrj)c%2s)I-@7QY4_As|9GeGM>GA$}4g>-*42zO@j*dQqUPCDDfSi`96QW%rSfyM{g-Gw)R@@e;bC@YXowvf8)MOJ4;mT3a-n*w zuCA^L##jgo3)38qCt|vPxQ9aQHY!uqy@hX4Qo07*qoM6N<$f+hcug#Z8m literal 0 HcmV?d00001 diff --git a/core/res/res/drawable-hdpi/ic_lock_ringer_on.png b/core/res/res/drawable-hdpi/ic_lock_ringer_on.png new file mode 100644 index 0000000000000000000000000000000000000000..ce0cfab936b2ee69dcbb8298e335761bba5f6f7b GIT binary patch literal 1757 zcmV<31|s>1P)sEKh2GGds^ri8F88vH?YE@qm*50Ic3Wii|mgCcV#i_VPQ z47f3F;sxd+B2sP&ly=W!PRZd2r50vl(l2?_p7(s;Iq&m+&wKe=xyfXbz0N}+d(DR( zfE|DxfE|DxfE~bVJsd6Fl*{E4-wg(X)ekkdC*t)Mjc|0FhYwf5o&mh;nfShggTt%a z0UCqh2GI(JS!29UZf@=u7cX8c#`m|NQ@)h9rW5fP8ylNZFq|OE3JVK!OG-*I@m*`h z8ujtx$FuwU`wbA&;lqbZq4T5T&2uc;I9C8LRFGB2jvcG$>+3V-<>h^i>xCBPI|^&m z5fKp|+`oUnhX8tddd9YG+qMt-1+N6a=;$bKJ405(>sNbwdrbgfI&k2?iRl0chA%&Q z^yprE212}3Q&Y3Cc7$si8XE3F7Y>;>X8>rZR7OTdc*_M6Sy@?G5AV@~rYBFHOaPFs zVQfR*EH5v=M6mh!`RB=dQt#BMQ$G*@^*K2?-$LikHI{6&I*5%%<0Mfkm2xL1C#{Ev z$J>`LUoMJ?iHQ*3mpXvgTtfh1VPU%9;NVc|w`|#xoRX3fkFWip-HGAh;X$rXPEJnX z&R~sVHg$ma)%1i)rScLB1I^pp`#pHRFeD^o)%f_hOe|&qX2Sti6Brm60F~Fxn>Twh zGc)s$E=Q4S9WpX9()o_o*495ST)1$9YkYlu{o~@|)(Z5rtqzcbJ9q93kBW-gg#gn? zDCM+qH1rgwvaf>v(d zzWx1k=gyU#IdkT_&6_vJ;+b*)h^wuwt-<;sTLCDSELjqrkdW~4bcKxGo~i&!D5NeZ zD98>72w3jt=eH~=DXF%)y1M+(p+g0+v9U3?d_e^d3t)f z3l-Y-N=yUzFe%3^$rJ#FuU)(LYkhrvBk!$Pv4UA=0RtDtKA;ZCz(X+hX=i8WW9l>- zjhj#$X9wVAj5mvTU>6xA`j(cKd%Oq3bg);;@&dLzrVgzKgOzQC0rLl_Qz#T{DI8`K z#FKWw>K0d_knX@lyigD$W~Cg4D+OaGrEFo|?7C5D4S3o9%KY8c)s@!i5Wv2?9vT|b zcXxO9Gf8N*S{ffmoosgF;l7n3$M$_wLrXniP(?^G}a8ZwY7CX^)GrS_ajG+e2L&z zB4Ec)o;+E|cPw4HG#E``6yv0;tE&S5eqmksUk>#!$OP$!M}J1|visJpTff5~=JOZQ zr!+}{?|lH@;O6Eg13fD%Dk|9TXw%cv_afe00ZN7)DTA&H?=a2@fa&^i^zVZhq{k;e zVt^_#8eq=hQ_Lr_ZnP7hqjCET<12bOK0ZDP-jCrfB2L;s&vN={rvESIo)4VD zp3R>>zjgoq{W+jgGt%QfOajxb!+aWNz#8?|ty{y8I(6JNB!%;k3dX)Q{~pOLO%j)K zywED3Fi0sJLipgPST{Dq{O3Qb96We%H+CWfSttkBEm${do`cr<)d8?&2p}}(AGYwW zNtwrH0QTQT?Evfm>;UWl>;UWl>;No}{{$ESEOKgB`*6A700000NkvXXu0mjfl)gkZ literal 0 HcmV?d00001 diff --git a/core/res/res/drawable-mdpi/ic_lock_ringer_off.png b/core/res/res/drawable-mdpi/ic_lock_ringer_off.png new file mode 100644 index 0000000000000000000000000000000000000000..98cfb11e408184fc82d89000f1e90916f37393b7 GIT binary patch literal 906 zcmV;519kj~P)8-R=9=?pk@e->DJa(VtadA+}qm|tyb%;EHOP`0nPxLJfk`y4VZz-VhGd#7lA8T z*qu)28+e`yg+d}>XJdD)BW202@N z0lAyP;c$RtER+rTnF2M0cs!oA+wG3&>FLUmk&#DQtyVWTH#Z5AHoxEhg?2!38j=En zApDkk$D)_xB(=od-Q7@kcem5)^}a%Yb|n%Cbz@^=eS3Sm&FAwi4Gs=I!MbQM1Q;a* zq;_y{5QoQso}Qk2@cJ40Yorjyex&O|Ecpy1{wV>KN|hU@)9GANVcSG1I@Az|=@V5# z$-{gj5+Nx|=$)bkO41STU)J*i;GLc!^4j$2t6Lpq{HFps;;iyNBy{q zwPB@|@C#nrW;7bF5=XQ9uRZ>(tcLi)b_& zo0ynzK?yA)JriV@+ef#b?^Jd^jxL_b>zbO=9Y&Ezgi_)g0`0ZS<$8cPh*VWoMSt2m z`C-Htb991)fc*~7&(FUzo6P~lL9kGTQ`%TLc5)viFrFWDxepQ|rNj`PkyU~%|Cp2s glnIoYzz+ci0RDU{6A#mQ%>V!Z07*qoM6N<$f^AN%u>b%7 literal 0 HcmV?d00001 diff --git a/core/res/res/drawable-mdpi/ic_lock_ringer_on.png b/core/res/res/drawable-mdpi/ic_lock_ringer_on.png new file mode 100644 index 0000000000000000000000000000000000000000..691b99e3b2000d8140cee807f06101d217eb7620 GIT binary patch literal 977 zcmV;?11|iDP)L18II7YFORe+>Fni zJGa5!-rg0+=f!Cn$VKQF4`2pjaSsoVv`3E~Jp;0JusDtrh(#M48;ieu`SS15rArU^ z`1mY z$R|&pe7bk<-g_P%9*|>MiFJSg5F0=(0AY`;tgM+p%YQz9{`@}(zj^Zp<^Yi8QWX^y zAwb&5-`~FiDEDXo{{7d1e6Klk=Inm^_U-@5%E~@a+CjIA1xIizym;~A{O{ktF(m%{ z`GcNQm*(l+uUfTgJJ3-s`uh47P>;PMCKm|& z{reYe87>Txhl0PeXU~2BjFJyNK0ZMlK(KG$zLP-TF@}YOS?t=i>)!kK?>|dPNr^(U zC2`r16bArP`1ImBp<>lpr^=nXB!N|_e&hz2JhfhHEFJeRB12;D}128(_KKk|R7sI!2-xz-U_yO_}auhJ9 zq@*ZFN=gc>UAuPm_wV0-T3T9~1NHm|@{ilv+R6bP!1eU$)7Q` - +