blob: 4cafbbfa6649ddc2a3e28b5bd5b10e31c7403aed [file] [log] [blame]
/*
* Copyright (C) 2012 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;
import android.animation.Animator;
import android.animation.Animator.AnimatorListener;
import android.animation.TimeInterpolator;
import android.view.View;
import android.view.ViewPropertyAnimator;
import java.util.ArrayList;
import java.util.EnumSet;
public class LauncherViewPropertyAnimator extends Animator implements AnimatorListener {
enum Properties {
TRANSLATION_X,
TRANSLATION_Y,
SCALE_X,
SCALE_Y,
ROTATION_Y,
ALPHA,
START_DELAY,
DURATION,
INTERPOLATOR,
WITH_LAYER
}
EnumSet<Properties> mPropertiesToSet = EnumSet.noneOf(Properties.class);
ViewPropertyAnimator mViewPropertyAnimator;
View mTarget;
float mTranslationX;
float mTranslationY;
float mScaleX;
float mScaleY;
float mRotationY;
float mAlpha;
long mStartDelay;
long mDuration;
TimeInterpolator mInterpolator;
ArrayList<Animator.AnimatorListener> mListeners;
boolean mRunning = false;
FirstFrameAnimatorHelper mFirstFrameHelper;
public LauncherViewPropertyAnimator(View target) {
mTarget = target;
mListeners = new ArrayList<Animator.AnimatorListener>();
}
@Override
public void addListener(Animator.AnimatorListener listener) {
mListeners.add(listener);
}
@Override
public void cancel() {
if (mViewPropertyAnimator != null) {
mViewPropertyAnimator.cancel();
}
}
@Override
public Animator clone() {
throw new RuntimeException("Not implemented");
}
@Override
public void end() {
throw new RuntimeException("Not implemented");
}
@Override
public long getDuration() {
return mDuration;
}
@Override
public ArrayList<Animator.AnimatorListener> getListeners() {
return mListeners;
}
@Override
public long getStartDelay() {
return mStartDelay;
}
@Override
public void onAnimationCancel(Animator animation) {
for (int i = 0; i < mListeners.size(); i++) {
Animator.AnimatorListener listener = mListeners.get(i);
listener.onAnimationCancel(this);
}
mRunning = false;
}
@Override
public void onAnimationEnd(Animator animation) {
for (int i = 0; i < mListeners.size(); i++) {
Animator.AnimatorListener listener = mListeners.get(i);
listener.onAnimationEnd(this);
}
mRunning = false;
}
@Override
public void onAnimationRepeat(Animator animation) {
for (int i = 0; i < mListeners.size(); i++) {
Animator.AnimatorListener listener = mListeners.get(i);
listener.onAnimationRepeat(this);
}
}
@Override
public void onAnimationStart(Animator animation) {
// This is the first time we get a handle to the internal ValueAnimator
// used by the ViewPropertyAnimator.
mFirstFrameHelper.onAnimationStart(animation);
for (int i = 0; i < mListeners.size(); i++) {
Animator.AnimatorListener listener = mListeners.get(i);
listener.onAnimationStart(this);
}
mRunning = true;
}
@Override
public boolean isRunning() {
return mRunning;
}
@Override
public boolean isStarted() {
return mViewPropertyAnimator != null;
}
@Override
public void removeAllListeners() {
mListeners.clear();
}
@Override
public void removeListener(Animator.AnimatorListener listener) {
mListeners.remove(listener);
}
@Override
public Animator setDuration(long duration) {
mPropertiesToSet.add(Properties.DURATION);
mDuration = duration;
return this;
}
@Override
public void setInterpolator(TimeInterpolator value) {
mPropertiesToSet.add(Properties.INTERPOLATOR);
mInterpolator = value;
}
@Override
public void setStartDelay(long startDelay) {
mPropertiesToSet.add(Properties.START_DELAY);
mStartDelay = startDelay;
}
@Override
public void setTarget(Object target) {
throw new RuntimeException("Not implemented");
}
@Override
public void setupEndValues() {
}
@Override
public void setupStartValues() {
}
@Override
public void start() {
mViewPropertyAnimator = mTarget.animate();
// FirstFrameAnimatorHelper hooks itself up to the updates on the animator,
// and then adjusts the play time to keep the first two frames jank-free
mFirstFrameHelper = new FirstFrameAnimatorHelper(mViewPropertyAnimator, mTarget);
if (mPropertiesToSet.contains(Properties.TRANSLATION_X)) {
mViewPropertyAnimator.translationX(mTranslationX);
}
if (mPropertiesToSet.contains(Properties.TRANSLATION_Y)) {
mViewPropertyAnimator.translationY(mTranslationY);
}
if (mPropertiesToSet.contains(Properties.SCALE_X)) {
mViewPropertyAnimator.scaleX(mScaleX);
}
if (mPropertiesToSet.contains(Properties.ROTATION_Y)) {
mViewPropertyAnimator.rotationY(mRotationY);
}
if (mPropertiesToSet.contains(Properties.SCALE_Y)) {
mViewPropertyAnimator.scaleY(mScaleY);
}
if (mPropertiesToSet.contains(Properties.ALPHA)) {
mViewPropertyAnimator.alpha(mAlpha);
}
if (mPropertiesToSet.contains(Properties.START_DELAY)) {
mViewPropertyAnimator.setStartDelay(mStartDelay);
}
if (mPropertiesToSet.contains(Properties.DURATION)) {
mViewPropertyAnimator.setDuration(mDuration);
}
if (mPropertiesToSet.contains(Properties.INTERPOLATOR)) {
mViewPropertyAnimator.setInterpolator(mInterpolator);
}
if (mPropertiesToSet.contains(Properties.WITH_LAYER)) {
mViewPropertyAnimator.withLayer();
}
mViewPropertyAnimator.setListener(this);
mViewPropertyAnimator.start();
LauncherAnimUtils.cancelOnDestroyActivity(this);
}
public LauncherViewPropertyAnimator translationX(float value) {
mPropertiesToSet.add(Properties.TRANSLATION_X);
mTranslationX = value;
return this;
}
public LauncherViewPropertyAnimator translationY(float value) {
mPropertiesToSet.add(Properties.TRANSLATION_Y);
mTranslationY = value;
return this;
}
public LauncherViewPropertyAnimator scaleX(float value) {
mPropertiesToSet.add(Properties.SCALE_X);
mScaleX = value;
return this;
}
public LauncherViewPropertyAnimator scaleY(float value) {
mPropertiesToSet.add(Properties.SCALE_Y);
mScaleY = value;
return this;
}
public LauncherViewPropertyAnimator rotationY(float value) {
mPropertiesToSet.add(Properties.ROTATION_Y);
mRotationY = value;
return this;
}
public LauncherViewPropertyAnimator alpha(float value) {
mPropertiesToSet.add(Properties.ALPHA);
mAlpha = value;
return this;
}
public LauncherViewPropertyAnimator withLayer() {
mPropertiesToSet.add(Properties.WITH_LAYER);
return this;
}
}