package com.iwedia.gui.mainmenu.gallery.animations;
import android.graphics.Camera;
import android.graphics.Matrix;
import android.view.Gravity;
import android.view.View;
import android.view.animation.AccelerateInterpolator;
import android.view.animation.Animation;
import android.view.animation.Transformation;
import android.widget.FrameLayout;
import android.widget.ImageView;
import com.iwedia.gui.MainActivity;
/**
* Handler class for selected item animation
*
* @author Veljko Ilkic
*/
public class Flip3dAnimationHandler {
/** Selected item in main menu */
private FrameLayout selectedItem;
/** Two items of selected view in main menu */
private ImageView image;
private ImageView imageBackground;
/** Vertical layout for main menu */
private FrameLayout mainMenuOverlay;
/** Rotation animation of image in selected frame layout */
private Flip3dAnimation rotation;
/** Constructor 1 */
public Flip3dAnimationHandler(FrameLayout mainMenuOverlay) {
super();
// Take reference of overlay layout
this.mainMenuOverlay = mainMenuOverlay;
}
/** Init animation views */
public void init() {
// References of current selected item
if (mainMenuOverlay != null)
this.selectedItem = (FrameLayout) this.mainMenuOverlay
.findViewById(com.iwedia.gui.R.id.mainMenuSelectedFrameLayout);
if (selectedItem != null) {
this.selectedItem.setVisibility(View.INVISIBLE);
}
// References of images in frame layout
if (mainMenuOverlay != null)
this.imageBackground = (ImageView) this.mainMenuOverlay
.findViewById(com.iwedia.gui.R.id.mainMenuSelectedImageBackground);
if (selectedItem != null)
this.image = (ImageView) this.selectedItem
.findViewById(com.iwedia.gui.R.id.mainMenuSelectedImageView);
// Set size and params of views
setParams();
}
/** Set Layout params on views */
public void setParams() {
// Layout params for overlay layout
FrameLayout.LayoutParams params1 = new FrameLayout.LayoutParams(
MainActivity.screenWidth / 5,
FrameLayout.LayoutParams.MATCH_PARENT, Gravity.CENTER);
if (selectedItem != null) {
selectedItem.setLayoutParams(params1);
}
// Layout params for background of selected item
FrameLayout.LayoutParams params2 = new FrameLayout.LayoutParams(
MainActivity.screenWidth / 5, MainActivity.screenWidth / 5,
Gravity.CENTER);
if (imageBackground != null) {
imageBackground.setLayoutParams(params2);
}
// Layout params for image of selected item
FrameLayout.LayoutParams params3 = new FrameLayout.LayoutParams(
MainActivity.screenWidth / 6, MainActivity.screenWidth / 6,
Gravity.CENTER);
if (image != null) {
image.setLayoutParams(params3);
}
}
/** Rotate view */
public void rotate() {
// Rotate whole circle
applyRotation(0, 360);
}
/** Apply rotation on image view */
private void applyRotation(float start, float end) {
// Find the center of image
final float centerX = image.getWidth() / 2.0f;
final float centerY = image.getHeight() / 2.0f;
// Create a new 3D rotation with the supplied parameter
// The animation listener is used to trigger the next animation
rotation = new Flip3dAnimation(start, end, centerX, centerY);
rotation.setDuration(500);
rotation.setRepeatCount(Animation.INFINITE);
rotation.setStartOffset(1000);
rotation.setInterpolator(new AccelerateInterpolator());
image.startAnimation(rotation);
}
// /////////////////////////////////////////////////
// Getters and setters
// /////////////////////////////////////////////////
/** Frame layout of current selected item */
public FrameLayout getSelectedItem() {
return selectedItem;
}
/** Image in frame layout */
public ImageView getImage() {
return image;
}
/** Set image */
public void setImage(ImageView image) {
this.image = image;
}
/** Get rotating animation reference */
public Flip3dAnimation getRotation() {
return rotation;
}
// /////////////////////////////////////////////////////////////////
// Inner Classes for animation handling
// /////////////////////////////////////////////////////////////////
/** Custom 3d animation */
public class Flip3dAnimation extends Animation {
private final float mFromDegrees;
private final float mToDegrees;
private final float mCenterX;
private final float mCenterY;
private Camera mCamera;
public Flip3dAnimation(float fromDegrees, float toDegrees,
float centerX, float centerY) {
mFromDegrees = fromDegrees;
mToDegrees = toDegrees;
mCenterX = centerX;
mCenterY = centerY;
}
@Override
public void initialize(int width, int height, int parentWidth,
int parentHeight) {
super.initialize(width, height, parentWidth, parentHeight);
mCamera = new Camera();
}
@Override
protected void applyTransformation(float interpolatedTime,
Transformation t) {
final float fromDegrees = mFromDegrees;
float degrees = fromDegrees
+ ((mToDegrees - fromDegrees) * interpolatedTime);
final float centerX = mCenterX;
final float centerY = mCenterY;
final Camera camera = mCamera;
final Matrix matrix = t.getMatrix();
camera.save();
// Rotate over Y
camera.rotateY(degrees);
// Translate over Z
camera.translate(0, 0, degrees / (10.0f));
camera.getMatrix(matrix);
camera.restore();
matrix.preTranslate(-centerX, -centerY);
matrix.postTranslate(centerX, centerY);
}
@Override
public void reset() {
super.reset();
}
}
}