Loading quickstep/src/com/android/quickstep/util/TaskViewDrawable.java +44 −6 Original line number Original line Diff line number Diff line Loading @@ -15,7 +15,9 @@ */ */ package com.android.quickstep.util; package com.android.quickstep.util; import android.animation.TimeInterpolator; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.ValueAnimator; import android.graphics.Canvas; import android.graphics.Canvas; import android.graphics.ColorFilter; import android.graphics.ColorFilter; import android.graphics.PixelFormat; import android.graphics.PixelFormat; Loading @@ -30,7 +32,7 @@ import com.android.quickstep.views.TaskView; public class TaskViewDrawable extends Drawable { public class TaskViewDrawable extends Drawable { public static FloatProperty<TaskViewDrawable> PROGRESS = public static final FloatProperty<TaskViewDrawable> PROGRESS = new FloatProperty<TaskViewDrawable>("progress") { new FloatProperty<TaskViewDrawable>("progress") { @Override @Override public void setValue(TaskViewDrawable taskViewDrawable, float v) { public void setValue(TaskViewDrawable taskViewDrawable, float v) { Loading @@ -43,8 +45,10 @@ public class TaskViewDrawable extends Drawable { } } }; }; private static final TimeInterpolator ICON_SIZE_INTERPOLATOR = /** (t) -> (Math.max(t, 0.3f) - 0.3f) / 0.7f; * The progress at which we play the atomic icon scale animation. */ private static final float ICON_SCALE_THRESHOLD = 0.95f; private final RecentsView mParent; private final RecentsView mParent; private final View mIconView; private final View mIconView; Loading @@ -55,11 +59,15 @@ public class TaskViewDrawable extends Drawable { private final ClipAnimationHelper mClipAnimationHelper; private final ClipAnimationHelper mClipAnimationHelper; private float mProgress = 1; private float mProgress = 1; private boolean mPassedIconScaleThreshold; private ValueAnimator mIconScaleAnimator; private float mIconScale; public TaskViewDrawable(TaskView tv, RecentsView parent) { public TaskViewDrawable(TaskView tv, RecentsView parent) { mParent = parent; mParent = parent; mIconView = tv.getIconView(); mIconView = tv.getIconView(); mIconPos = new int[2]; mIconPos = new int[2]; mIconScale = mIconView.getScaleX(); Utilities.getDescendantCoordRelativeToAncestor(mIconView, parent, mIconPos, true); Utilities.getDescendantCoordRelativeToAncestor(mIconView, parent, mIconPos, true); mThumbnailView = tv.getThumbnail(); mThumbnailView = tv.getThumbnail(); Loading @@ -70,6 +78,37 @@ public class TaskViewDrawable extends Drawable { public void setProgress(float progress) { public void setProgress(float progress) { mProgress = progress; mProgress = progress; mParent.invalidate(); mParent.invalidate(); boolean passedIconScaleThreshold = progress <= ICON_SCALE_THRESHOLD; if (mPassedIconScaleThreshold != passedIconScaleThreshold) { mPassedIconScaleThreshold = passedIconScaleThreshold; animateIconScale(mPassedIconScaleThreshold ? 0 : 1); } } private void animateIconScale(float toScale) { if (mIconScaleAnimator != null) { mIconScaleAnimator.cancel(); } mIconScaleAnimator = ValueAnimator.ofFloat(mIconScale, toScale); mIconScaleAnimator.addUpdateListener(valueAnimator -> { mIconScale = (float) valueAnimator.getAnimatedValue(); if (mProgress > ICON_SCALE_THRESHOLD) { // Speed up the icon scale to ensure it is 1 when progress is 1. float iconProgress = (mProgress - ICON_SCALE_THRESHOLD) / (1 - ICON_SCALE_THRESHOLD); if (iconProgress > mIconScale) { mIconScale = iconProgress; } } invalidateSelf(); }); mIconScaleAnimator.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { mIconScaleAnimator = null; } }); mIconScaleAnimator.setDuration(TaskView.SCALE_ICON_DURATION); mIconScaleAnimator.start(); } } @Override @Override Loading @@ -81,8 +120,7 @@ public class TaskViewDrawable extends Drawable { canvas.save(); canvas.save(); canvas.translate(mIconPos[0], mIconPos[1]); canvas.translate(mIconPos[0], mIconPos[1]); float scale = ICON_SIZE_INTERPOLATOR.getInterpolation(mProgress); canvas.scale(mIconScale, mIconScale, mIconView.getWidth() / 2, mIconView.getHeight() / 2); canvas.scale(scale, scale, mIconView.getWidth() / 2, mIconView.getHeight() / 2); mIconView.draw(canvas); mIconView.draw(canvas); canvas.restore(); canvas.restore(); } } Loading quickstep/src/com/android/quickstep/views/RecentsView.java +11 −11 Original line number Original line Diff line number Diff line Loading @@ -22,6 +22,7 @@ import static com.android.launcher3.anim.Interpolators.ACCEL_2; import static com.android.launcher3.anim.Interpolators.FAST_OUT_SLOW_IN; import static com.android.launcher3.anim.Interpolators.FAST_OUT_SLOW_IN; import static com.android.launcher3.anim.Interpolators.LINEAR; import static com.android.launcher3.anim.Interpolators.LINEAR; import android.animation.Animator; import android.animation.AnimatorSet; import android.animation.AnimatorSet; import android.animation.ObjectAnimator; import android.animation.ObjectAnimator; import android.animation.TimeInterpolator; import android.animation.TimeInterpolator; Loading Loading @@ -960,15 +961,13 @@ public abstract class RecentsView<T extends BaseActivity> extends PagedView impl if (currTask == null) { if (currTask == null) { return; return; } } currTask.setScaleX(mAdjacentScale); currTask.setZoomScale(mAdjacentScale); currTask.setScaleY(mAdjacentScale); if (mCurrentPage - 1 >= 0) { if (mCurrentPage - 1 >= 0) { TaskView adjacentTask = getPageAt(mCurrentPage - 1); TaskView adjacentTask = getPageAt(mCurrentPage - 1); float[] scaleAndTranslation = getAdjacentScaleAndTranslation(currTask, adjacentTask, float[] scaleAndTranslation = getAdjacentScaleAndTranslation(currTask, adjacentTask, mAdjacentScale, 0); mAdjacentScale, 0); adjacentTask.setScaleX(scaleAndTranslation[0]); adjacentTask.setZoomScale(scaleAndTranslation[0]); adjacentTask.setScaleY(scaleAndTranslation[0]); adjacentTask.setTranslationX(-scaleAndTranslation[1]); adjacentTask.setTranslationX(-scaleAndTranslation[1]); adjacentTask.setTranslationY(scaleAndTranslation[2]); adjacentTask.setTranslationY(scaleAndTranslation[2]); } } Loading @@ -976,8 +975,7 @@ public abstract class RecentsView<T extends BaseActivity> extends PagedView impl TaskView adjacentTask = getPageAt(mCurrentPage + 1); TaskView adjacentTask = getPageAt(mCurrentPage + 1); float[] scaleAndTranslation = getAdjacentScaleAndTranslation(currTask, adjacentTask, float[] scaleAndTranslation = getAdjacentScaleAndTranslation(currTask, adjacentTask, mAdjacentScale, 0); mAdjacentScale, 0); adjacentTask.setScaleX(scaleAndTranslation[0]); adjacentTask.setZoomScale(scaleAndTranslation[0]); adjacentTask.setScaleY(scaleAndTranslation[0]); adjacentTask.setTranslationX(scaleAndTranslation[1]); adjacentTask.setTranslationX(scaleAndTranslation[1]); adjacentTask.setTranslationY(scaleAndTranslation[2]); adjacentTask.setTranslationY(scaleAndTranslation[2]); } } Loading @@ -986,7 +984,7 @@ public abstract class RecentsView<T extends BaseActivity> extends PagedView impl private float[] getAdjacentScaleAndTranslation(TaskView currTask, TaskView adjacentTask, private float[] getAdjacentScaleAndTranslation(TaskView currTask, TaskView adjacentTask, float currTaskToScale, float currTaskToTranslationY) { float currTaskToScale, float currTaskToTranslationY) { float displacement = currTask.getWidth() * (currTaskToScale - currTask.getCurveScale()); float displacement = currTask.getWidth() * (currTaskToScale - currTask.getCurveScale()); sTempFloatArray[0] = currTaskToScale * adjacentTask.getCurveScale(); sTempFloatArray[0] = currTaskToScale; sTempFloatArray[1] = mIsRtl ? -displacement : displacement; sTempFloatArray[1] = mIsRtl ? -displacement : displacement; sTempFloatArray[2] = currTaskToTranslationY; sTempFloatArray[2] = currTaskToTranslationY; return sTempFloatArray; return sTempFloatArray; Loading Loading @@ -1127,13 +1125,15 @@ public abstract class RecentsView<T extends BaseActivity> extends PagedView impl return anim; return anim; } } private ObjectAnimator createAnimForChild(View child, float[] toScaleAndTranslation) { private Animator createAnimForChild(TaskView child, float[] toScaleAndTranslation) { return ObjectAnimator.ofPropertyValuesHolder(child, AnimatorSet anim = new AnimatorSet(); anim.play(ObjectAnimator.ofFloat(child, TaskView.ZOOM_SCALE, toScaleAndTranslation[0])); anim.play(ObjectAnimator.ofPropertyValuesHolder(child, new PropertyListBuilder() new PropertyListBuilder() .scale(child.getScaleX() * toScaleAndTranslation[0]) .translationX(toScaleAndTranslation[1]) .translationX(toScaleAndTranslation[1]) .translationY(toScaleAndTranslation[2]) .translationY(toScaleAndTranslation[2]) .build()); .build())); return anim; } } public PendingAnimation createTaskLauncherAnimation(TaskView tv, long duration) { public PendingAnimation createTaskLauncherAnimation(TaskView tv, long duration) { Loading quickstep/src/com/android/quickstep/views/TaskView.java +36 −8 Original line number Original line Diff line number Diff line Loading @@ -30,14 +30,15 @@ import android.graphics.Outline; import android.os.Bundle; import android.os.Bundle; import android.os.Handler; import android.os.Handler; import android.util.AttributeSet; import android.util.AttributeSet; import android.util.FloatProperty; import android.util.Log; import android.util.Log; import android.util.Property; import android.view.View; import android.view.View; import android.view.ViewOutlineProvider; import android.view.ViewOutlineProvider; import android.view.accessibility.AccessibilityNodeInfo; import android.view.accessibility.AccessibilityNodeInfo; import android.widget.FrameLayout; import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.Toast; import android.widget.Toast; import com.android.launcher3.BaseActivity; import com.android.launcher3.BaseActivity; import com.android.launcher3.BaseDraggingActivity; import com.android.launcher3.BaseDraggingActivity; import com.android.launcher3.R; import com.android.launcher3.R; Loading Loading @@ -76,12 +77,26 @@ public class TaskView extends FrameLayout implements TaskCallbacks, PageCallback */ */ private static final float EDGE_SCALE_DOWN_FACTOR = 0.03f; private static final float EDGE_SCALE_DOWN_FACTOR = 0.03f; private static final long SCALE_ICON_DURATION = 120; public static final long SCALE_ICON_DURATION = 120; public static final Property<TaskView, Float> ZOOM_SCALE = new FloatProperty<TaskView>("zoomScale") { @Override public void setValue(TaskView taskView, float v) { taskView.setZoomScale(v); } @Override public Float get(TaskView taskView) { return taskView.mZoomScale; } }; private Task mTask; private Task mTask; private TaskThumbnailView mSnapshotView; private TaskThumbnailView mSnapshotView; private IconView mIconView; private IconView mIconView; private float mCurveScale; private float mCurveScale; private float mZoomScale; private float mCurveDimAlpha; private float mCurveDimAlpha; private Animator mDimAlphaAnim; private Animator mDimAlphaAnim; Loading Loading @@ -207,8 +222,7 @@ public class TaskView extends FrameLayout implements TaskCallbacks, PageCallback } } public void resetVisualProperties() { public void resetVisualProperties() { setScaleX(1f); setZoomScale(1); setScaleY(1f); setTranslationX(0f); setTranslationX(0f); setTranslationY(0f); setTranslationY(0f); setTranslationZ(0); setTranslationZ(0); Loading @@ -226,9 +240,7 @@ public class TaskView extends FrameLayout implements TaskCallbacks, PageCallback mSnapshotView.setDimAlpha(mCurveDimAlpha); mSnapshotView.setDimAlpha(mCurveDimAlpha); } } mCurveScale = getCurveScaleForCurveInterpolation(curveInterpolation); setCurveScale(getCurveScaleForCurveInterpolation(curveInterpolation)); setScaleX(mCurveScale); setScaleY(mCurveScale); } } @Override @Override Loading @@ -247,10 +259,26 @@ public class TaskView extends FrameLayout implements TaskCallbacks, PageCallback return 1 - curveInterpolation * EDGE_SCALE_DOWN_FACTOR; return 1 - curveInterpolation * EDGE_SCALE_DOWN_FACTOR; } } private void setCurveScale(float curveScale) { mCurveScale = curveScale; onScaleChanged(); } public float getCurveScale() { public float getCurveScale() { return mCurveScale; return mCurveScale; } } public void setZoomScale(float adjacentScale) { mZoomScale = adjacentScale; onScaleChanged(); } private void onScaleChanged() { float scale = mCurveScale * mZoomScale; setScaleX(scale); setScaleY(scale); } @Override @Override public boolean hasOverlappingRendering() { public boolean hasOverlappingRendering() { // TODO: Clip-out the icon region from the thumbnail, since they are overlapping. // TODO: Clip-out the icon region from the thumbnail, since they are overlapping. Loading Loading
quickstep/src/com/android/quickstep/util/TaskViewDrawable.java +44 −6 Original line number Original line Diff line number Diff line Loading @@ -15,7 +15,9 @@ */ */ package com.android.quickstep.util; package com.android.quickstep.util; import android.animation.TimeInterpolator; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.ValueAnimator; import android.graphics.Canvas; import android.graphics.Canvas; import android.graphics.ColorFilter; import android.graphics.ColorFilter; import android.graphics.PixelFormat; import android.graphics.PixelFormat; Loading @@ -30,7 +32,7 @@ import com.android.quickstep.views.TaskView; public class TaskViewDrawable extends Drawable { public class TaskViewDrawable extends Drawable { public static FloatProperty<TaskViewDrawable> PROGRESS = public static final FloatProperty<TaskViewDrawable> PROGRESS = new FloatProperty<TaskViewDrawable>("progress") { new FloatProperty<TaskViewDrawable>("progress") { @Override @Override public void setValue(TaskViewDrawable taskViewDrawable, float v) { public void setValue(TaskViewDrawable taskViewDrawable, float v) { Loading @@ -43,8 +45,10 @@ public class TaskViewDrawable extends Drawable { } } }; }; private static final TimeInterpolator ICON_SIZE_INTERPOLATOR = /** (t) -> (Math.max(t, 0.3f) - 0.3f) / 0.7f; * The progress at which we play the atomic icon scale animation. */ private static final float ICON_SCALE_THRESHOLD = 0.95f; private final RecentsView mParent; private final RecentsView mParent; private final View mIconView; private final View mIconView; Loading @@ -55,11 +59,15 @@ public class TaskViewDrawable extends Drawable { private final ClipAnimationHelper mClipAnimationHelper; private final ClipAnimationHelper mClipAnimationHelper; private float mProgress = 1; private float mProgress = 1; private boolean mPassedIconScaleThreshold; private ValueAnimator mIconScaleAnimator; private float mIconScale; public TaskViewDrawable(TaskView tv, RecentsView parent) { public TaskViewDrawable(TaskView tv, RecentsView parent) { mParent = parent; mParent = parent; mIconView = tv.getIconView(); mIconView = tv.getIconView(); mIconPos = new int[2]; mIconPos = new int[2]; mIconScale = mIconView.getScaleX(); Utilities.getDescendantCoordRelativeToAncestor(mIconView, parent, mIconPos, true); Utilities.getDescendantCoordRelativeToAncestor(mIconView, parent, mIconPos, true); mThumbnailView = tv.getThumbnail(); mThumbnailView = tv.getThumbnail(); Loading @@ -70,6 +78,37 @@ public class TaskViewDrawable extends Drawable { public void setProgress(float progress) { public void setProgress(float progress) { mProgress = progress; mProgress = progress; mParent.invalidate(); mParent.invalidate(); boolean passedIconScaleThreshold = progress <= ICON_SCALE_THRESHOLD; if (mPassedIconScaleThreshold != passedIconScaleThreshold) { mPassedIconScaleThreshold = passedIconScaleThreshold; animateIconScale(mPassedIconScaleThreshold ? 0 : 1); } } private void animateIconScale(float toScale) { if (mIconScaleAnimator != null) { mIconScaleAnimator.cancel(); } mIconScaleAnimator = ValueAnimator.ofFloat(mIconScale, toScale); mIconScaleAnimator.addUpdateListener(valueAnimator -> { mIconScale = (float) valueAnimator.getAnimatedValue(); if (mProgress > ICON_SCALE_THRESHOLD) { // Speed up the icon scale to ensure it is 1 when progress is 1. float iconProgress = (mProgress - ICON_SCALE_THRESHOLD) / (1 - ICON_SCALE_THRESHOLD); if (iconProgress > mIconScale) { mIconScale = iconProgress; } } invalidateSelf(); }); mIconScaleAnimator.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { mIconScaleAnimator = null; } }); mIconScaleAnimator.setDuration(TaskView.SCALE_ICON_DURATION); mIconScaleAnimator.start(); } } @Override @Override Loading @@ -81,8 +120,7 @@ public class TaskViewDrawable extends Drawable { canvas.save(); canvas.save(); canvas.translate(mIconPos[0], mIconPos[1]); canvas.translate(mIconPos[0], mIconPos[1]); float scale = ICON_SIZE_INTERPOLATOR.getInterpolation(mProgress); canvas.scale(mIconScale, mIconScale, mIconView.getWidth() / 2, mIconView.getHeight() / 2); canvas.scale(scale, scale, mIconView.getWidth() / 2, mIconView.getHeight() / 2); mIconView.draw(canvas); mIconView.draw(canvas); canvas.restore(); canvas.restore(); } } Loading
quickstep/src/com/android/quickstep/views/RecentsView.java +11 −11 Original line number Original line Diff line number Diff line Loading @@ -22,6 +22,7 @@ import static com.android.launcher3.anim.Interpolators.ACCEL_2; import static com.android.launcher3.anim.Interpolators.FAST_OUT_SLOW_IN; import static com.android.launcher3.anim.Interpolators.FAST_OUT_SLOW_IN; import static com.android.launcher3.anim.Interpolators.LINEAR; import static com.android.launcher3.anim.Interpolators.LINEAR; import android.animation.Animator; import android.animation.AnimatorSet; import android.animation.AnimatorSet; import android.animation.ObjectAnimator; import android.animation.ObjectAnimator; import android.animation.TimeInterpolator; import android.animation.TimeInterpolator; Loading Loading @@ -960,15 +961,13 @@ public abstract class RecentsView<T extends BaseActivity> extends PagedView impl if (currTask == null) { if (currTask == null) { return; return; } } currTask.setScaleX(mAdjacentScale); currTask.setZoomScale(mAdjacentScale); currTask.setScaleY(mAdjacentScale); if (mCurrentPage - 1 >= 0) { if (mCurrentPage - 1 >= 0) { TaskView adjacentTask = getPageAt(mCurrentPage - 1); TaskView adjacentTask = getPageAt(mCurrentPage - 1); float[] scaleAndTranslation = getAdjacentScaleAndTranslation(currTask, adjacentTask, float[] scaleAndTranslation = getAdjacentScaleAndTranslation(currTask, adjacentTask, mAdjacentScale, 0); mAdjacentScale, 0); adjacentTask.setScaleX(scaleAndTranslation[0]); adjacentTask.setZoomScale(scaleAndTranslation[0]); adjacentTask.setScaleY(scaleAndTranslation[0]); adjacentTask.setTranslationX(-scaleAndTranslation[1]); adjacentTask.setTranslationX(-scaleAndTranslation[1]); adjacentTask.setTranslationY(scaleAndTranslation[2]); adjacentTask.setTranslationY(scaleAndTranslation[2]); } } Loading @@ -976,8 +975,7 @@ public abstract class RecentsView<T extends BaseActivity> extends PagedView impl TaskView adjacentTask = getPageAt(mCurrentPage + 1); TaskView adjacentTask = getPageAt(mCurrentPage + 1); float[] scaleAndTranslation = getAdjacentScaleAndTranslation(currTask, adjacentTask, float[] scaleAndTranslation = getAdjacentScaleAndTranslation(currTask, adjacentTask, mAdjacentScale, 0); mAdjacentScale, 0); adjacentTask.setScaleX(scaleAndTranslation[0]); adjacentTask.setZoomScale(scaleAndTranslation[0]); adjacentTask.setScaleY(scaleAndTranslation[0]); adjacentTask.setTranslationX(scaleAndTranslation[1]); adjacentTask.setTranslationX(scaleAndTranslation[1]); adjacentTask.setTranslationY(scaleAndTranslation[2]); adjacentTask.setTranslationY(scaleAndTranslation[2]); } } Loading @@ -986,7 +984,7 @@ public abstract class RecentsView<T extends BaseActivity> extends PagedView impl private float[] getAdjacentScaleAndTranslation(TaskView currTask, TaskView adjacentTask, private float[] getAdjacentScaleAndTranslation(TaskView currTask, TaskView adjacentTask, float currTaskToScale, float currTaskToTranslationY) { float currTaskToScale, float currTaskToTranslationY) { float displacement = currTask.getWidth() * (currTaskToScale - currTask.getCurveScale()); float displacement = currTask.getWidth() * (currTaskToScale - currTask.getCurveScale()); sTempFloatArray[0] = currTaskToScale * adjacentTask.getCurveScale(); sTempFloatArray[0] = currTaskToScale; sTempFloatArray[1] = mIsRtl ? -displacement : displacement; sTempFloatArray[1] = mIsRtl ? -displacement : displacement; sTempFloatArray[2] = currTaskToTranslationY; sTempFloatArray[2] = currTaskToTranslationY; return sTempFloatArray; return sTempFloatArray; Loading Loading @@ -1127,13 +1125,15 @@ public abstract class RecentsView<T extends BaseActivity> extends PagedView impl return anim; return anim; } } private ObjectAnimator createAnimForChild(View child, float[] toScaleAndTranslation) { private Animator createAnimForChild(TaskView child, float[] toScaleAndTranslation) { return ObjectAnimator.ofPropertyValuesHolder(child, AnimatorSet anim = new AnimatorSet(); anim.play(ObjectAnimator.ofFloat(child, TaskView.ZOOM_SCALE, toScaleAndTranslation[0])); anim.play(ObjectAnimator.ofPropertyValuesHolder(child, new PropertyListBuilder() new PropertyListBuilder() .scale(child.getScaleX() * toScaleAndTranslation[0]) .translationX(toScaleAndTranslation[1]) .translationX(toScaleAndTranslation[1]) .translationY(toScaleAndTranslation[2]) .translationY(toScaleAndTranslation[2]) .build()); .build())); return anim; } } public PendingAnimation createTaskLauncherAnimation(TaskView tv, long duration) { public PendingAnimation createTaskLauncherAnimation(TaskView tv, long duration) { Loading
quickstep/src/com/android/quickstep/views/TaskView.java +36 −8 Original line number Original line Diff line number Diff line Loading @@ -30,14 +30,15 @@ import android.graphics.Outline; import android.os.Bundle; import android.os.Bundle; import android.os.Handler; import android.os.Handler; import android.util.AttributeSet; import android.util.AttributeSet; import android.util.FloatProperty; import android.util.Log; import android.util.Log; import android.util.Property; import android.view.View; import android.view.View; import android.view.ViewOutlineProvider; import android.view.ViewOutlineProvider; import android.view.accessibility.AccessibilityNodeInfo; import android.view.accessibility.AccessibilityNodeInfo; import android.widget.FrameLayout; import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.Toast; import android.widget.Toast; import com.android.launcher3.BaseActivity; import com.android.launcher3.BaseActivity; import com.android.launcher3.BaseDraggingActivity; import com.android.launcher3.BaseDraggingActivity; import com.android.launcher3.R; import com.android.launcher3.R; Loading Loading @@ -76,12 +77,26 @@ public class TaskView extends FrameLayout implements TaskCallbacks, PageCallback */ */ private static final float EDGE_SCALE_DOWN_FACTOR = 0.03f; private static final float EDGE_SCALE_DOWN_FACTOR = 0.03f; private static final long SCALE_ICON_DURATION = 120; public static final long SCALE_ICON_DURATION = 120; public static final Property<TaskView, Float> ZOOM_SCALE = new FloatProperty<TaskView>("zoomScale") { @Override public void setValue(TaskView taskView, float v) { taskView.setZoomScale(v); } @Override public Float get(TaskView taskView) { return taskView.mZoomScale; } }; private Task mTask; private Task mTask; private TaskThumbnailView mSnapshotView; private TaskThumbnailView mSnapshotView; private IconView mIconView; private IconView mIconView; private float mCurveScale; private float mCurveScale; private float mZoomScale; private float mCurveDimAlpha; private float mCurveDimAlpha; private Animator mDimAlphaAnim; private Animator mDimAlphaAnim; Loading Loading @@ -207,8 +222,7 @@ public class TaskView extends FrameLayout implements TaskCallbacks, PageCallback } } public void resetVisualProperties() { public void resetVisualProperties() { setScaleX(1f); setZoomScale(1); setScaleY(1f); setTranslationX(0f); setTranslationX(0f); setTranslationY(0f); setTranslationY(0f); setTranslationZ(0); setTranslationZ(0); Loading @@ -226,9 +240,7 @@ public class TaskView extends FrameLayout implements TaskCallbacks, PageCallback mSnapshotView.setDimAlpha(mCurveDimAlpha); mSnapshotView.setDimAlpha(mCurveDimAlpha); } } mCurveScale = getCurveScaleForCurveInterpolation(curveInterpolation); setCurveScale(getCurveScaleForCurveInterpolation(curveInterpolation)); setScaleX(mCurveScale); setScaleY(mCurveScale); } } @Override @Override Loading @@ -247,10 +259,26 @@ public class TaskView extends FrameLayout implements TaskCallbacks, PageCallback return 1 - curveInterpolation * EDGE_SCALE_DOWN_FACTOR; return 1 - curveInterpolation * EDGE_SCALE_DOWN_FACTOR; } } private void setCurveScale(float curveScale) { mCurveScale = curveScale; onScaleChanged(); } public float getCurveScale() { public float getCurveScale() { return mCurveScale; return mCurveScale; } } public void setZoomScale(float adjacentScale) { mZoomScale = adjacentScale; onScaleChanged(); } private void onScaleChanged() { float scale = mCurveScale * mZoomScale; setScaleX(scale); setScaleY(scale); } @Override @Override public boolean hasOverlappingRendering() { public boolean hasOverlappingRendering() { // TODO: Clip-out the icon region from the thumbnail, since they are overlapping. // TODO: Clip-out the icon region from the thumbnail, since they are overlapping. Loading