mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-31 22:25:30 +00:00
8f492a6463
--HG-- rename : mobile/android/base/AnimatorProxy.java => mobile/android/base/animation/AnimatorProxy.java rename : mobile/android/base/HeightChangeAnimation.java => mobile/android/base/animation/HeightChangeAnimation.java rename : mobile/android/base/PropertyAnimator.java => mobile/android/base/animation/PropertyAnimator.java rename : mobile/android/base/Rotate3DAnimation.java => mobile/android/base/animation/Rotate3DAnimation.java rename : mobile/android/base/ViewHelper.java => mobile/android/base/animation/ViewHelper.java
98 lines
3.5 KiB
Java
98 lines
3.5 KiB
Java
/*
|
|
* Copyright (C) 2007 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 org.mozilla.gecko.animation;
|
|
|
|
import android.view.animation.Animation;
|
|
import android.view.animation.Transformation;
|
|
|
|
import android.graphics.Camera;
|
|
import android.graphics.Matrix;
|
|
|
|
/**
|
|
* An animation that rotates the view on the Y axis between two specified angles.
|
|
* This animation also adds a translation on the Z axis (depth) to improve the effect.
|
|
*/
|
|
public class Rotate3DAnimation extends Animation {
|
|
private final float mFromDegrees;
|
|
private final float mToDegrees;
|
|
|
|
private final float mCenterX;
|
|
private final float mCenterY;
|
|
|
|
private final float mDepthZ;
|
|
private final boolean mReverse;
|
|
private Camera mCamera;
|
|
|
|
private int mWidth = 1;
|
|
private int mHeight = 1;
|
|
|
|
/**
|
|
* Creates a new 3D rotation on the Y axis. The rotation is defined by its
|
|
* start angle and its end angle. Both angles are in degrees. The rotation
|
|
* is performed around a center point on the 2D space, definied by a pair
|
|
* of X and Y coordinates, called centerX and centerY. When the animation
|
|
* starts, a translation on the Z axis (depth) is performed. The length
|
|
* of the translation can be specified, as well as whether the translation
|
|
* should be reversed in time.
|
|
*
|
|
* @param fromDegrees the start angle of the 3D rotation
|
|
* @param toDegrees the end angle of the 3D rotation
|
|
* @param centerX the X center of the 3D rotation
|
|
* @param centerY the Y center of the 3D rotation
|
|
* @param reverse true if the translation should be reversed, false otherwise
|
|
*/
|
|
public Rotate3DAnimation(float fromDegrees, float toDegrees,
|
|
float centerX, float centerY, float depthZ, boolean reverse) {
|
|
mFromDegrees = fromDegrees;
|
|
mToDegrees = toDegrees;
|
|
mCenterX = centerX;
|
|
mCenterY = centerY;
|
|
mDepthZ = depthZ;
|
|
mReverse = reverse;
|
|
}
|
|
|
|
@Override
|
|
public void initialize(int width, int height, int parentWidth, int parentHeight) {
|
|
super.initialize(width, height, parentWidth, parentHeight);
|
|
mCamera = new Camera();
|
|
mWidth = width;
|
|
mHeight = height;
|
|
}
|
|
|
|
@Override
|
|
protected void applyTransformation(float interpolatedTime, Transformation t) {
|
|
final float fromDegrees = mFromDegrees;
|
|
float degrees = fromDegrees + ((mToDegrees - fromDegrees) * interpolatedTime);
|
|
|
|
final Camera camera = mCamera;
|
|
final Matrix matrix = t.getMatrix();
|
|
|
|
camera.save();
|
|
if (mReverse) {
|
|
camera.translate(0.0f, 0.0f, mDepthZ * interpolatedTime);
|
|
} else {
|
|
camera.translate(0.0f, 0.0f, mDepthZ * (1.0f - interpolatedTime));
|
|
}
|
|
camera.rotateX(degrees);
|
|
camera.getMatrix(matrix);
|
|
camera.restore();
|
|
|
|
matrix.preTranslate(-mCenterX * mWidth, -mCenterY * mHeight);
|
|
matrix.postTranslate(mCenterX * mWidth, mCenterY * mHeight);
|
|
}
|
|
}
|