blob: 5397ae02b2d602fc0e16b275438d4cf1477fcb61 [file] [log] [blame]
/*
* Copyright (C) 2013 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.camera;
import android.animation.Animator;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.view.View;
/**
* Class to handle animations.
*/
public class AnimationManager {
public static final float FLASH_ALPHA_START = 0.3f;
public static final float FLASH_ALPHA_END = 0f;
public static final int FLASH_DURATION = 300;
public static final int SHRINK_DURATION = 400;
public static final int HOLD_DURATION = 2500;
public static final int SLIDE_DURATION = 1100;
private ObjectAnimator mFlashAnim;
private AnimatorSet mCaptureAnimator;
/**
* Starts capture animation.
* @param view a thumbnail view that shows a picture captured and gets animated
*/
public void startCaptureAnimation(final View view) {
if (mCaptureAnimator != null && mCaptureAnimator.isStarted()) {
mCaptureAnimator.cancel();
}
View parentView = (View) view.getParent();
float slideDistance = (float) (parentView.getWidth() - view.getLeft());
float scaleX = ((float) parentView.getWidth()) / ((float) view.getWidth());
float scaleY = ((float) parentView.getHeight()) / ((float) view.getHeight());
float scale = scaleX > scaleY ? scaleX : scaleY;
int centerX = view.getLeft() + view.getWidth() / 2;
int centerY = view.getTop() + view.getHeight() / 2;
ObjectAnimator slide = ObjectAnimator.ofFloat(view, "translationX", 0f, slideDistance)
.setDuration(AnimationManager.SLIDE_DURATION);
slide.setStartDelay(AnimationManager.SHRINK_DURATION + AnimationManager.HOLD_DURATION);
ObjectAnimator translateY = ObjectAnimator.ofFloat(view, "translationY",
parentView.getHeight() / 2 - centerY, 0f)
.setDuration(AnimationManager.SHRINK_DURATION);
translateY.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animator) {
// Do nothing.
}
@Override
public void onAnimationEnd(Animator animator) {
view.setClickable(true);
}
@Override
public void onAnimationCancel(Animator animator) {
// Do nothing.
}
@Override
public void onAnimationRepeat(Animator animator) {
// Do nothing.
}
});
mCaptureAnimator = new AnimatorSet();
mCaptureAnimator.playTogether(
ObjectAnimator.ofFloat(view, "scaleX", scale, 1f)
.setDuration(AnimationManager.SHRINK_DURATION),
ObjectAnimator.ofFloat(view, "scaleY", scale, 1f)
.setDuration(AnimationManager.SHRINK_DURATION),
ObjectAnimator.ofFloat(view, "translationX",
parentView.getWidth() / 2 - centerX, 0f)
.setDuration(AnimationManager.SHRINK_DURATION),
translateY,
slide);
mCaptureAnimator.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animator) {
view.setClickable(false);
view.setVisibility(View.VISIBLE);
}
@Override
public void onAnimationEnd(Animator animator) {
view.setScaleX(1f);
view.setScaleX(1f);
view.setTranslationX(0f);
view.setTranslationY(0f);
view.setVisibility(View.INVISIBLE);
mCaptureAnimator.removeAllListeners();
mCaptureAnimator = null;
}
@Override
public void onAnimationCancel(Animator animator) {
view.setVisibility(View.INVISIBLE);
}
@Override
public void onAnimationRepeat(Animator animator) {
// Do nothing.
}
});
mCaptureAnimator.start();
}
/**
* Starts flash animation.
* @params flashOverlay the overlay that will animate on alpha to make the flash impression
*/
public void startFlashAnimation(final View flashOverlay) {
// End the previous animation if the previous one is still running
if (mFlashAnim != null && mFlashAnim.isRunning()) {
mFlashAnim.cancel();
}
// Start new flash animation.
mFlashAnim = ObjectAnimator.ofFloat(flashOverlay, "alpha",
AnimationManager.FLASH_ALPHA_START, AnimationManager.FLASH_ALPHA_END);
mFlashAnim.setDuration(AnimationManager.FLASH_DURATION);
mFlashAnim.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animator) {
flashOverlay.setVisibility(View.VISIBLE);
}
@Override
public void onAnimationEnd(Animator animator) {
flashOverlay.setAlpha(0f);
flashOverlay.setVisibility(View.GONE);
mFlashAnim.removeAllListeners();
mFlashAnim = null;
}
@Override
public void onAnimationCancel(Animator animator) {
// Do nothing.
}
@Override
public void onAnimationRepeat(Animator animator) {
// Do nothing.
}
});
mFlashAnim.start();
}
/**
* Cancels on-going flash animation and capture animation, if any.
*/
public void cancelAnimations() {
// End the previous animation if the previous one is still running
if (mFlashAnim != null && mFlashAnim.isRunning()) {
mFlashAnim.cancel();
}
if (mCaptureAnimator != null && mCaptureAnimator.isStarted()) {
mCaptureAnimator.cancel();
}
}
}