Loading core/java/com/android/internal/widget/multiwaveview/MultiWaveView.java +61 −38 Original line number Diff line number Diff line Loading @@ -181,23 +181,37 @@ public class MultiWaveView extends View { mAlwaysTrackFinger = a.getBoolean(R.styleable.MultiWaveView_alwaysTrackFinger, false); mGravity = a.getInt(R.styleable.MultiWaveView_gravity, Gravity.TOP); // Read chevron animation drawables final int chevrons[] = { R.styleable.MultiWaveView_leftChevronDrawable, // Read array of chevron drawables TypedValue outValue = new TypedValue(); if (a.getValue(R.styleable.MultiWaveView_chevronDrawables, outValue)) { ArrayList<TargetDrawable> chevrons = loadDrawableArray(outValue.resourceId); for (int i = 0; i < chevrons.size(); i++) { final TargetDrawable chevron = chevrons.get(i); for (int k = 0; k < mFeedbackCount; k++) { mChevronDrawables.add(chevron == null ? null : new TargetDrawable(chevron)); } } } // Support old-style chevron specification if new specification not found if (mChevronDrawables.size() == 0) { final int chevronResIds[] = { R.styleable.MultiWaveView_rightChevronDrawable, R.styleable.MultiWaveView_topChevronDrawable, R.styleable.MultiWaveView_leftChevronDrawable, R.styleable.MultiWaveView_bottomChevronDrawable }; for (int chevron : chevrons) { TypedValue typedValue = a.peekValue(chevron); for (int i = 0; i < mFeedbackCount; i++) { for (int i = 0; i < chevronResIds.length; i++) { TypedValue typedValue = a.peekValue(chevronResIds[i]); for (int k = 0; k < mFeedbackCount; k++) { mChevronDrawables.add( typedValue != null ? new TargetDrawable(res, typedValue.resourceId) : null); } } } // Read array of target drawables TypedValue outValue = new TypedValue(); if (a.getValue(R.styleable.MultiWaveView_targetDrawables, outValue)) { internalSetTargetResources(outValue.resourceId); } Loading Loading @@ -318,23 +332,24 @@ public class MultiWaveView extends View { * mFeedbackCount items in the order: left, right, top, bottom. */ private void startChevronAnimation() { final float r = mHandleDrawable.getWidth() * 0.4f; final float chevronAnimationDistance = mOuterRadius * 0.9f / 2.0f; final float from[][] = { { -r, 0}, // left { +r, 0}, // right {0, -r}, // top {0, +r} }; // bottom final float to[][] = { { -chevronAnimationDistance, 0}, // left { chevronAnimationDistance, 0}, // right { 0, -chevronAnimationDistance}, // top { 0, +chevronAnimationDistance} }; // bottom final float chevronStartDistance = mHandleDrawable.getWidth() * 0.8f; final float chevronStopDistance = mOuterRadius * 0.9f / 2.0f; mChevronAnimations.clear(); final float startScale = 0.5f; final float endScale = 2.0f; for (int direction = 0; direction < 4; direction++) { final int directionCount = mFeedbackCount > 0 ? mChevronDrawables.size()/mFeedbackCount : 0; // Add an animation for all chevron drawables. There are mFeedbackCount drawables // in each direction and directionCount directions. for (int direction = 0; direction < directionCount; direction++) { double angle = 2.0 * Math.PI * direction / directionCount; final float sx = (float) Math.cos(angle); final float sy = 0.0f - (float) Math.sin(angle); final float[] xrange = new float[] {sx * chevronStartDistance, sx * chevronStopDistance}; final float[] yrange = new float[] {sy * chevronStartDistance, sy * chevronStopDistance}; for (int count = 0; count < mFeedbackCount; count++) { int delay = count * CHEVRON_INCREMENTAL_DELAY; final TargetDrawable icon = mChevronDrawables.get(direction*mFeedbackCount + count); Loading @@ -344,8 +359,8 @@ public class MultiWaveView extends View { mChevronAnimations.add(Tweener.to(icon, CHEVRON_ANIMATION_DURATION, "ease", mChevronAnimationInterpolator, "delay", delay, "x", new float[] { from[direction][0], to[direction][0] }, "y", new float[] { from[direction][1], to[direction][1] }, "x", xrange, "y", yrange, "alpha", new float[] {1.0f, 0.0f}, "scaleX", new float[] {startScale, endScale}, "scaleY", new float[] {startScale, endScale}, Loading Loading @@ -529,22 +544,31 @@ public class MultiWaveView extends View { } } private void internalSetTargetResources(int resourceId) { private ArrayList<TargetDrawable> loadDrawableArray(int resourceId) { Resources res = getContext().getResources(); TypedArray array = res.obtainTypedArray(resourceId); int count = array.length(); ArrayList<TargetDrawable> targetDrawables = new ArrayList<TargetDrawable>(count); int maxWidth = mHandleDrawable.getWidth(); int maxHeight = mHandleDrawable.getHeight(); final int count = array.length(); ArrayList<TargetDrawable> drawables = new ArrayList<TargetDrawable>(count); for (int i = 0; i < count; i++) { TypedValue value = array.peekValue(i); TargetDrawable target = new TargetDrawable(res, value != null ? value.resourceId : 0); targetDrawables.add(target); drawables.add(target); } array.recycle(); return drawables; } private void internalSetTargetResources(int resourceId) { mTargetDrawables = loadDrawableArray(resourceId); mTargetResourceId = resourceId; final int count = mTargetDrawables.size(); int maxWidth = mHandleDrawable.getWidth(); int maxHeight = mHandleDrawable.getHeight(); for (int i = 0; i < count; i++) { TargetDrawable target = mTargetDrawables.get(i); maxWidth = Math.max(maxWidth, target.getWidth()); maxHeight = Math.max(maxHeight, target.getHeight()); } mTargetResourceId = resourceId; mTargetDrawables = targetDrawables; if (mMaxTargetWidth != maxWidth || mMaxTargetHeight != maxHeight) { mMaxTargetWidth = maxWidth; mMaxTargetHeight = maxHeight; Loading @@ -553,7 +577,6 @@ public class MultiWaveView extends View { updateTargetPositions(mWaveCenterX, mWaveCenterY); updateChevronPositions(mWaveCenterX, mWaveCenterY); } array.recycle(); } /** Loading core/java/com/android/internal/widget/multiwaveview/TargetDrawable.java +8 −0 Original line number Diff line number Diff line Loading @@ -85,6 +85,14 @@ public class TargetDrawable { setState(STATE_INACTIVE); } public TargetDrawable(TargetDrawable other) { mResourceId = other.mResourceId; // Mutate the drawable so we can animate shared drawable properties. mDrawable = other.mDrawable != null ? other.mDrawable.mutate() : null; resizeDrawables(); setState(STATE_INACTIVE); } public void setState(int [] state) { if (mDrawable instanceof StateListDrawable) { StateListDrawable d = (StateListDrawable) mDrawable; Loading core/res/res/layout-sw600dp/keyguard_screen_tab_unlock.xml +1 −1 Original line number Diff line number Diff line Loading @@ -98,7 +98,7 @@ android:outerRadius="@dimen/multiwaveview_target_placement_radius" android:snapMargin="@dimen/multiwaveview_snap_margin" android:hitRadius="@dimen/multiwaveview_hit_radius" android:rightChevronDrawable="@drawable/ic_lockscreen_chevron_right" android:chevronDrawables="@array/lockscreen_chevron_drawables" android:feedbackCount="3" android:vibrationDuration="20" /> Loading core/res/res/layout-sw600dp/keyguard_screen_tab_unlock_land.xml +1 −1 Original line number Diff line number Diff line Loading @@ -98,7 +98,7 @@ android:outerRadius="@dimen/multiwaveview_target_placement_radius" android:snapMargin="@dimen/multiwaveview_snap_margin" android:hitRadius="@dimen/multiwaveview_hit_radius" android:rightChevronDrawable="@drawable/ic_lockscreen_chevron_right" android:chevronDrawables="@array/lockscreen_chevron_drawables" android:feedbackCount="3" android:vibrationDuration="20" /> Loading core/res/res/layout/keyguard_screen_tab_unlock.xml +1 −1 Original line number Diff line number Diff line Loading @@ -139,7 +139,7 @@ android:outerRadius="@dimen/multiwaveview_target_placement_radius" android:snapMargin="@dimen/multiwaveview_snap_margin" android:hitRadius="@dimen/multiwaveview_hit_radius" android:rightChevronDrawable="@drawable/ic_lockscreen_chevron_right" android:chevronDrawables="@array/lockscreen_chevron_drawables" android:feedbackCount="3" android:vibrationDuration="20" /> Loading Loading
core/java/com/android/internal/widget/multiwaveview/MultiWaveView.java +61 −38 Original line number Diff line number Diff line Loading @@ -181,23 +181,37 @@ public class MultiWaveView extends View { mAlwaysTrackFinger = a.getBoolean(R.styleable.MultiWaveView_alwaysTrackFinger, false); mGravity = a.getInt(R.styleable.MultiWaveView_gravity, Gravity.TOP); // Read chevron animation drawables final int chevrons[] = { R.styleable.MultiWaveView_leftChevronDrawable, // Read array of chevron drawables TypedValue outValue = new TypedValue(); if (a.getValue(R.styleable.MultiWaveView_chevronDrawables, outValue)) { ArrayList<TargetDrawable> chevrons = loadDrawableArray(outValue.resourceId); for (int i = 0; i < chevrons.size(); i++) { final TargetDrawable chevron = chevrons.get(i); for (int k = 0; k < mFeedbackCount; k++) { mChevronDrawables.add(chevron == null ? null : new TargetDrawable(chevron)); } } } // Support old-style chevron specification if new specification not found if (mChevronDrawables.size() == 0) { final int chevronResIds[] = { R.styleable.MultiWaveView_rightChevronDrawable, R.styleable.MultiWaveView_topChevronDrawable, R.styleable.MultiWaveView_leftChevronDrawable, R.styleable.MultiWaveView_bottomChevronDrawable }; for (int chevron : chevrons) { TypedValue typedValue = a.peekValue(chevron); for (int i = 0; i < mFeedbackCount; i++) { for (int i = 0; i < chevronResIds.length; i++) { TypedValue typedValue = a.peekValue(chevronResIds[i]); for (int k = 0; k < mFeedbackCount; k++) { mChevronDrawables.add( typedValue != null ? new TargetDrawable(res, typedValue.resourceId) : null); } } } // Read array of target drawables TypedValue outValue = new TypedValue(); if (a.getValue(R.styleable.MultiWaveView_targetDrawables, outValue)) { internalSetTargetResources(outValue.resourceId); } Loading Loading @@ -318,23 +332,24 @@ public class MultiWaveView extends View { * mFeedbackCount items in the order: left, right, top, bottom. */ private void startChevronAnimation() { final float r = mHandleDrawable.getWidth() * 0.4f; final float chevronAnimationDistance = mOuterRadius * 0.9f / 2.0f; final float from[][] = { { -r, 0}, // left { +r, 0}, // right {0, -r}, // top {0, +r} }; // bottom final float to[][] = { { -chevronAnimationDistance, 0}, // left { chevronAnimationDistance, 0}, // right { 0, -chevronAnimationDistance}, // top { 0, +chevronAnimationDistance} }; // bottom final float chevronStartDistance = mHandleDrawable.getWidth() * 0.8f; final float chevronStopDistance = mOuterRadius * 0.9f / 2.0f; mChevronAnimations.clear(); final float startScale = 0.5f; final float endScale = 2.0f; for (int direction = 0; direction < 4; direction++) { final int directionCount = mFeedbackCount > 0 ? mChevronDrawables.size()/mFeedbackCount : 0; // Add an animation for all chevron drawables. There are mFeedbackCount drawables // in each direction and directionCount directions. for (int direction = 0; direction < directionCount; direction++) { double angle = 2.0 * Math.PI * direction / directionCount; final float sx = (float) Math.cos(angle); final float sy = 0.0f - (float) Math.sin(angle); final float[] xrange = new float[] {sx * chevronStartDistance, sx * chevronStopDistance}; final float[] yrange = new float[] {sy * chevronStartDistance, sy * chevronStopDistance}; for (int count = 0; count < mFeedbackCount; count++) { int delay = count * CHEVRON_INCREMENTAL_DELAY; final TargetDrawable icon = mChevronDrawables.get(direction*mFeedbackCount + count); Loading @@ -344,8 +359,8 @@ public class MultiWaveView extends View { mChevronAnimations.add(Tweener.to(icon, CHEVRON_ANIMATION_DURATION, "ease", mChevronAnimationInterpolator, "delay", delay, "x", new float[] { from[direction][0], to[direction][0] }, "y", new float[] { from[direction][1], to[direction][1] }, "x", xrange, "y", yrange, "alpha", new float[] {1.0f, 0.0f}, "scaleX", new float[] {startScale, endScale}, "scaleY", new float[] {startScale, endScale}, Loading Loading @@ -529,22 +544,31 @@ public class MultiWaveView extends View { } } private void internalSetTargetResources(int resourceId) { private ArrayList<TargetDrawable> loadDrawableArray(int resourceId) { Resources res = getContext().getResources(); TypedArray array = res.obtainTypedArray(resourceId); int count = array.length(); ArrayList<TargetDrawable> targetDrawables = new ArrayList<TargetDrawable>(count); int maxWidth = mHandleDrawable.getWidth(); int maxHeight = mHandleDrawable.getHeight(); final int count = array.length(); ArrayList<TargetDrawable> drawables = new ArrayList<TargetDrawable>(count); for (int i = 0; i < count; i++) { TypedValue value = array.peekValue(i); TargetDrawable target = new TargetDrawable(res, value != null ? value.resourceId : 0); targetDrawables.add(target); drawables.add(target); } array.recycle(); return drawables; } private void internalSetTargetResources(int resourceId) { mTargetDrawables = loadDrawableArray(resourceId); mTargetResourceId = resourceId; final int count = mTargetDrawables.size(); int maxWidth = mHandleDrawable.getWidth(); int maxHeight = mHandleDrawable.getHeight(); for (int i = 0; i < count; i++) { TargetDrawable target = mTargetDrawables.get(i); maxWidth = Math.max(maxWidth, target.getWidth()); maxHeight = Math.max(maxHeight, target.getHeight()); } mTargetResourceId = resourceId; mTargetDrawables = targetDrawables; if (mMaxTargetWidth != maxWidth || mMaxTargetHeight != maxHeight) { mMaxTargetWidth = maxWidth; mMaxTargetHeight = maxHeight; Loading @@ -553,7 +577,6 @@ public class MultiWaveView extends View { updateTargetPositions(mWaveCenterX, mWaveCenterY); updateChevronPositions(mWaveCenterX, mWaveCenterY); } array.recycle(); } /** Loading
core/java/com/android/internal/widget/multiwaveview/TargetDrawable.java +8 −0 Original line number Diff line number Diff line Loading @@ -85,6 +85,14 @@ public class TargetDrawable { setState(STATE_INACTIVE); } public TargetDrawable(TargetDrawable other) { mResourceId = other.mResourceId; // Mutate the drawable so we can animate shared drawable properties. mDrawable = other.mDrawable != null ? other.mDrawable.mutate() : null; resizeDrawables(); setState(STATE_INACTIVE); } public void setState(int [] state) { if (mDrawable instanceof StateListDrawable) { StateListDrawable d = (StateListDrawable) mDrawable; Loading
core/res/res/layout-sw600dp/keyguard_screen_tab_unlock.xml +1 −1 Original line number Diff line number Diff line Loading @@ -98,7 +98,7 @@ android:outerRadius="@dimen/multiwaveview_target_placement_radius" android:snapMargin="@dimen/multiwaveview_snap_margin" android:hitRadius="@dimen/multiwaveview_hit_radius" android:rightChevronDrawable="@drawable/ic_lockscreen_chevron_right" android:chevronDrawables="@array/lockscreen_chevron_drawables" android:feedbackCount="3" android:vibrationDuration="20" /> Loading
core/res/res/layout-sw600dp/keyguard_screen_tab_unlock_land.xml +1 −1 Original line number Diff line number Diff line Loading @@ -98,7 +98,7 @@ android:outerRadius="@dimen/multiwaveview_target_placement_radius" android:snapMargin="@dimen/multiwaveview_snap_margin" android:hitRadius="@dimen/multiwaveview_hit_radius" android:rightChevronDrawable="@drawable/ic_lockscreen_chevron_right" android:chevronDrawables="@array/lockscreen_chevron_drawables" android:feedbackCount="3" android:vibrationDuration="20" /> Loading
core/res/res/layout/keyguard_screen_tab_unlock.xml +1 −1 Original line number Diff line number Diff line Loading @@ -139,7 +139,7 @@ android:outerRadius="@dimen/multiwaveview_target_placement_radius" android:snapMargin="@dimen/multiwaveview_snap_margin" android:hitRadius="@dimen/multiwaveview_hit_radius" android:rightChevronDrawable="@drawable/ic_lockscreen_chevron_right" android:chevronDrawables="@array/lockscreen_chevron_drawables" android:feedbackCount="3" android:vibrationDuration="20" /> Loading