From 2fef19dd16dac3b79ea5a0f3846b2ac8818662cf Mon Sep 17 00:00:00 2001 From: Jorim Jaggi Date: Thu, 23 Apr 2015 13:56:33 -0700 Subject: [PATCH] Add pulsing animation for find sensor. Bug: 20495507 Change-Id: I5fefb2cdb2625885c906fa2a9b69da1141ce66e0 --- .../fingerprint_sensor_location.png | Bin 18792 -> 4673 bytes .../fingerprint_enroll_find_sensor.xml | 16 +- .../fingerprint_enroll_find_sensor_base.xml | 13 +- ...fingerprint_enroll_find_sensor_graphic.xml | 36 ++++ res/values/colors.xml | 1 + res/values/dimens.xml | 5 + res/values/themes.xml | 1 + .../FingerprintEnrollFindSensor.java | 16 ++ .../FingerprintLocationAnimationView.java | 175 ++++++++++++++++++ 9 files changed, 245 insertions(+), 18 deletions(-) create mode 100644 res/layout/fingerprint_enroll_find_sensor_graphic.xml create mode 100644 src/com/android/settings/fingerprint/FingerprintLocationAnimationView.java diff --git a/res/drawable-nodpi/fingerprint_sensor_location.png b/res/drawable-nodpi/fingerprint_sensor_location.png index b95816fb3937ffb6e4f61947e79cc700b5ee9b15..587c911baab1bd3c43d94bbf762ca7505b544590 100644 GIT binary patch literal 4673 zcmeHLeK3@38^5=eLnlf|zM`*PLK690i`tTdmIy_N)}nm1YgcSI9SKpLHo{_+qH=te zk6p2b}GOFqio@K5{o&4IeF?_P#p#VfJBo8%FI5bdz^jJU$Rp!a^Sw@77;U- zsB7L4)#Cm6nYOwubIpjYq{F z*%XkryLg?Q8yyIcOJ+HOGUEyY}_KX$AvK4w;ZIcG+O+ctr@;BWRLE;|2{p zy?DEG%sN8R{k5Wkf|L@Hv}u_)(Ni|4#0Z<4B)d_`e4W*N5{yGm>e_19M?9Y|Vu{*u zrKF@J=nQb^5csY&OI6^`81S+X!nOSHTb>E%RDwsC+t`lMWba)k=sHL%ZP1|=I`h_= zJKB-U#kaSz_m~=4%24+pwCMbRn;Bg|&Ab8V1@_axV% z;Y`?p%X4GQ;_mtR(4e9EL@pC*N|eZy(R6)uBI)vJGx-_UXv%5QE4JuXL_*SQSnJ5# zLYo*AsM|+{t3Y*J%6T^iVvVHMQljCvakHaGTOs;SM2sVr9ygw4X<{NvWnf55i15&} z0_!T6?m8DnID1;IS~cc9Q|b|e(f7e}DiI==7D`HuhQrd5@g5vVKfY$;1hzS2?}@lE zh0McTAGwT~;bs{TMn8cbgu&z^_=TdoNkyuMVe{U^Zx}}h}w!kXCQpe-i&(Q zQz%~pul!l3*V{e}XEOkCx)1odb@H~9Dw>yL2xzL}5f^&`7>WT>4UcXL-}v+#eqOwp z_!O#aYVL%F{*?3^rVO7x9Pt!d7%I2x3IE1SiYblUynFagR|gCMu((zAkHxwp+Nxh^ zAbn_gAH_Skn>Q;(fItFNO3gWiZY@|O|HO66_rtEoT(rPZURcZ@GY|OOm z?|ku~+_aYg!jU`lK4mtqH9A_+7b{jHdgJ=s+KlexarvdN)9KY9dP5lrGVWoK^&;%F0Ds>As(!r&7fH0_{nq5306iv@e8$d!wj?kykzCuo1YP5mFU! z?697M>DTuR+pf!l;62VoiHb@_Eb!vj*2_i@xwLIafKSx=#EQ2xCiCpWtv+^lr#ebS z9xocx@WgeeyV8I4zRP=OFW^7?u<;zdgKGiYcTPsP86aiRtAL$sE`}e29`b?)sISh9 zjrS+XVC{Ra)fUSG>o@pkPSEN)w7J%jefs+jN4Il{!26Cr!*t?}WLPOAGggzaSnNy! z?!C+(02g9P0)kkt^f?5;ir5$GpLr`|UsC=%-`8cnhkYr{g?!Ch8Cy}}_pGce@q1SO zGTGb>Kp6>Q)_o2RR1lFoAcz&PFYupvD`S78{7=5GQhpEnQd&UzinlVhvc&IMSy|%u zto$vq{{a&Jp(`76^(Odszpl79|E7KTotCnq#Q&l8@!!b)|H}UHM8AC(|AOzyW1(*w z_{uHiZ|QK~w2#6^+;huIm5!p32bY!>rn-5EdxirAjHT(Ft6E-E5T^tOIIufFf@<3# z8qilYyAyIvBS&6>dg&;f#C!ilP1LkB-X9UeLp(6d@@Ijt_n- zd@0VNu)S?$sng7p><^MPVO-8dMk3>ZQZ3kK#kpckDYLDcZIga>TDbPhQqL{0jz0Dv!E z!=+x`LrOxysBv#C46H0KF55QB849cH?_tF(-N|$1`W8p zmnfCVsTt3nf~#|@Ptfr`B+z0N28kdX6Ov>dx9lqD1=f zS(0r{S>&Yz^bX`!p~BSGV=+91xE6=F7QYBh@OD@J2y-@Vz~>*Z#C-*d|8z6-uhsI^q&2hNZFb^cg!1b-~hKA z!7(-nQ`KE}bAaNS$|J!JN!)f;J;eXubjM9w6@tZFPZ1hw9k-443OKf$v!q!KwnW7p VtGjqFT=4q`SR6Qv%HQXH;a}!^Gra%+ literal 18792 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 Ty9g(cDoMcE!OgzR&OhOA7Z#`V diff --git a/res/layout-land/fingerprint_enroll_find_sensor.xml b/res/layout-land/fingerprint_enroll_find_sensor.xml index 1eaa815dc41..b3401934916 100644 --- a/res/layout-land/fingerprint_enroll_find_sensor.xml +++ b/res/layout-land/fingerprint_enroll_find_sensor.xml @@ -58,17 +58,13 @@ + android:layout_height="match_parent"> - + diff --git a/res/layout/fingerprint_enroll_find_sensor_base.xml b/res/layout/fingerprint_enroll_find_sensor_base.xml index 89b45945bd8..9f1eb4be77a 100644 --- a/res/layout/fingerprint_enroll_find_sensor_base.xml +++ b/res/layout/fingerprint_enroll_find_sensor_base.xml @@ -37,15 +37,12 @@ android:layout_marginTop="@dimen/suw_description_margin_top" android:text="@string/security_settings_fingerprint_enroll_find_sensor_message"/> - + android:layout_width="@dimen/fingerprint_find_sensor_graphic_size" + android:layout_height="@dimen/fingerprint_find_sensor_graphic_size" + android:layout_gravity="center_horizontal"/> + + + + + + + + + diff --git a/res/values/colors.xml b/res/values/colors.xml index 858af0e602d..25a7341765e 100644 --- a/res/values/colors.xml +++ b/res/values/colors.xml @@ -64,6 +64,7 @@ #de000000 #ff009688 #20000000 + #ff009688 #ff384248 #ff009587 diff --git a/res/values/dimens.xml b/res/values/dimens.xml index c2d192d9881..30be6e867b1 100755 --- a/res/values/dimens.xml +++ b/res/values/dimens.xml @@ -219,6 +219,11 @@ 92dip 4dip + 8dp + 50dp + 50% + 30% + 200dp 2.6 0dp diff --git a/res/values/themes.xml b/res/values/themes.xml index edba85f42fe..466c6c9738d 100644 --- a/res/values/themes.xml +++ b/res/values/themes.xml @@ -221,6 +221,7 @@ diff --git a/src/com/android/settings/fingerprint/FingerprintEnrollFindSensor.java b/src/com/android/settings/fingerprint/FingerprintEnrollFindSensor.java index d49fdb621f8..b3a5d2298b4 100644 --- a/src/com/android/settings/fingerprint/FingerprintEnrollFindSensor.java +++ b/src/com/android/settings/fingerprint/FingerprintEnrollFindSensor.java @@ -31,6 +31,8 @@ public class FingerprintEnrollFindSensor extends FingerprintEnrollBase { private static final int CONFIRM_REQUEST = 1; private static final int ENROLLING = 2; + private FingerprintLocationAnimationView mAnimation; + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -39,6 +41,20 @@ public class FingerprintEnrollFindSensor extends FingerprintEnrollBase { if (mToken == null) { launchConfirmLock(); } + mAnimation = (FingerprintLocationAnimationView) findViewById( + R.id.fingerprint_sensor_location_animation); + } + + @Override + protected void onStart() { + super.onStart(); + mAnimation.startAnimation(); + } + + @Override + protected void onStop() { + super.onStop(); + mAnimation.stopAnimation(); } @Override diff --git a/src/com/android/settings/fingerprint/FingerprintLocationAnimationView.java b/src/com/android/settings/fingerprint/FingerprintLocationAnimationView.java new file mode 100644 index 00000000000..b52fed31052 --- /dev/null +++ b/src/com/android/settings/fingerprint/FingerprintLocationAnimationView.java @@ -0,0 +1,175 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package com.android.settings.fingerprint; + +import android.animation.Animator; +import android.animation.AnimatorListenerAdapter; +import android.animation.ValueAnimator; +import android.annotation.Nullable; +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.util.AttributeSet; +import android.view.View; +import android.view.animation.AnimationUtils; +import android.view.animation.Interpolator; + +import com.android.settings.R; + +/** + * View which plays an animation to indicate where the sensor is on the device. + */ +public class FingerprintLocationAnimationView extends View { + + private static final float MAX_PULSE_ALPHA = 0.15f; + private static final long DELAY_BETWEEN_PHASE = 1000; + + private final Interpolator mLinearOutSlowInInterpolator; + private final Interpolator mFastOutSlowInInterpolator; + + private final int mDotRadius; + private final int mMaxPulseRadius; + private final float mFractionCenterX; + private final float mFractionCenterY; + private final Paint mDotPaint = new Paint(); + private final Paint mPulsePaint = new Paint(); + private float mPulseRadius; + private ValueAnimator mRadiusAnimator; + private ValueAnimator mAlphaAnimator; + + public FingerprintLocationAnimationView(Context context, @Nullable AttributeSet attrs) { + super(context, attrs); + mDotRadius = getResources().getDimensionPixelSize(R.dimen.fingerprint_dot_radius); + mMaxPulseRadius = getResources().getDimensionPixelSize(R.dimen.fingerprint_pulse_radius); + mFractionCenterX = getResources().getFraction( + R.fraction.fingerprint_sensor_location_fraction_x, 1, 1); + mFractionCenterY = getResources().getFraction( + R.fraction.fingerprint_sensor_location_fraction_y, 1, 1); + int color = getResources().getColor(R.color.fingerprint_dot_color, null); + mDotPaint.setAntiAlias(true); + mPulsePaint.setAntiAlias(true); + mDotPaint.setColor(color); + mPulsePaint.setColor(color); + mLinearOutSlowInInterpolator = AnimationUtils.loadInterpolator(context, + android.R.interpolator.linear_out_slow_in); + mFastOutSlowInInterpolator = AnimationUtils.loadInterpolator(context, + android.R.interpolator.linear_out_slow_in); + } + + @Override + protected void onDraw(Canvas canvas) { + drawPulse(canvas); + drawDot(canvas); + } + + private void drawDot(Canvas canvas) { + canvas.drawCircle(getCenterX(), getCenterY(), mDotRadius, mDotPaint); + } + + private void drawPulse(Canvas canvas) { + canvas.drawCircle(getCenterX(), getCenterY(), mPulseRadius, mPulsePaint); + } + + private float getCenterX() { + return getWidth() * mFractionCenterX; + } + + private float getCenterY() { + return getHeight() * mFractionCenterY; + } + + public void startAnimation() { + startPhase(); + } + + public void stopAnimation() { + removeCallbacks(mStartPhaseRunnable); + if (mRadiusAnimator != null) { + mRadiusAnimator.cancel(); + } + if (mAlphaAnimator != null) { + mAlphaAnimator.cancel(); + } + } + + private void startPhase() { + startRadiusAnimation(); + startAlphaAnimation(); + } + + private void startRadiusAnimation() { + ValueAnimator animator = ValueAnimator.ofFloat(0, mMaxPulseRadius); + animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { + @Override + public void onAnimationUpdate(ValueAnimator animation) { + mPulseRadius = (float) animation.getAnimatedValue(); + invalidate(); + } + }); + animator.addListener(new AnimatorListenerAdapter() { + + boolean mCancelled; + + @Override + public void onAnimationCancel(Animator animation) { + mCancelled = true; + } + + @Override + public void onAnimationEnd(Animator animation) { + mRadiusAnimator = null; + if (!mCancelled) { + postDelayed(mStartPhaseRunnable, DELAY_BETWEEN_PHASE); + } + } + }); + animator.setDuration(1000); + animator.setInterpolator(mLinearOutSlowInInterpolator); + animator.start(); + mRadiusAnimator = animator; + } + + private void startAlphaAnimation() { + mPulsePaint.setAlpha((int) (255f * MAX_PULSE_ALPHA)); + ValueAnimator animator = ValueAnimator.ofFloat(MAX_PULSE_ALPHA, 0f); + animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { + @Override + public void onAnimationUpdate(ValueAnimator animation) { + mPulsePaint.setAlpha((int) (255f * (float) animation.getAnimatedValue())); + invalidate(); + } + }); + animator.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + mAlphaAnimator = null; + } + }); + animator.setDuration(750); + animator.setInterpolator(mFastOutSlowInInterpolator); + animator.setStartDelay(250); + animator.start(); + mAlphaAnimator = animator; + } + + private final Runnable mStartPhaseRunnable = new Runnable() { + @Override + public void run() { + startPhase(); + } + }; +}