/* * Copyright (C) 2017 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.launcher3.folder; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.FloatArrayEvaluator; import android.animation.ObjectAnimator; import android.util.Property; import java.util.Arrays; /** * Animates a Folder preview item. */ class FolderPreviewItemAnim { private static final Property PARAMS = new Property(float[].class, "params") { @Override public float[] get(FolderPreviewItemAnim anim) { sTempParamsArray[0] = anim.mParams.scale; sTempParamsArray[1] = anim.mParams.transX; sTempParamsArray[2] = anim.mParams.transY; return sTempParamsArray; } @Override public void set(FolderPreviewItemAnim anim, float[] value) { anim.setParams(value); } }; private static PreviewItemDrawingParams sTmpParams = new PreviewItemDrawingParams(0, 0, 0, 0); private static final float[] sTempParamsArray = new float[3]; private final ObjectAnimator mAnimator; private final PreviewItemManager mItemManager; private final PreviewItemDrawingParams mParams; public final float[] finalState; /** * @param params layout params to animate * @param index0 original index of the item to be animated * @param items0 original number of items in the preview * @param index1 new index of the item to be animated * @param items1 new number of items in the preview * @param duration duration in ms of the animation * @param onCompleteRunnable runnable to execute upon animation completion */ FolderPreviewItemAnim(PreviewItemManager itemManager, PreviewItemDrawingParams params, int index0, int items0, int index1, int items1, int duration, final Runnable onCompleteRunnable) { mItemManager = itemManager; mParams = params; mItemManager.computePreviewItemDrawingParams(index1, items1, sTmpParams); finalState = new float[] {sTmpParams.scale, sTmpParams.transX, sTmpParams.transY}; mItemManager.computePreviewItemDrawingParams(index0, items0, sTmpParams); float[] startState = new float[] {sTmpParams.scale, sTmpParams.transX, sTmpParams.transY}; mAnimator = ObjectAnimator.ofObject(this, PARAMS, new FloatArrayEvaluator(), startState, finalState); mAnimator.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { if (onCompleteRunnable != null) { onCompleteRunnable.run(); } params.anim = null; } }); mAnimator.setDuration(duration); } private void setParams(float[] values) { mParams.scale = values[0]; mParams.transX = values[1]; mParams.transY = values[2]; mItemManager.onParamsChanged(); } public void start() { mAnimator.start(); } public void cancel() { mAnimator.cancel(); } public boolean hasEqualFinalState(FolderPreviewItemAnim anim) { return Arrays.equals(finalState, anim.finalState); } }