Reputation: 368
I have an ImageView that I am animating using a TranslateAnimation. At the end of the animation I want to switch the drawable it is showing. It works but it flickers right before showing the image. I was originally using an AnimationListener and then I followed the examples I found of how to fix this by creating a custom view that extends ImageView and overrides OnAnimationEnd to no avail.
In my activity:
TranslateAnimation = new TranslateAnimation(0, 150, 0, 150);
translateAnimation.setDuration(ANIMATION_DURATION);
btn.setNextImage(buttons.get(2));
btn.startAnimation(3000);
In my custom view I have the following:
protected void onAnimationEnd() {
super.onAnimationEnd();
//this.clearAnimation();
if(_nextImage != null)
this.setImageDrawable(_nextImage);
}
private Drawable _nextImage;
public void setNextImage(Drawable d)
{
_nextImage = d;
}
Upvotes: 1
Views: 3470
Reputation: 5241
I have one idea that 3D Flip animation on your screen appcation by using the FrameLayout. there has two different layout (magicnumber.xml & selectteam.xml) whose u want to flip.this place in FrameLayout.
There has following Xml code
Container.xml
<FrameLayout >
<xmlns:android="http://schemas.android.com/apk/res/android" >
<android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/container"android:background="#000000" />
<include android:id="@+id/tshirtlist" layout="@layout/magicnumber" android:layout_width="wrap_content" android:layout_height="wrap_content"/>
<include > android:layout_width="wrap_content" android:layout_height="wrap_content" layout="@layout/selectteam" android:id="@+id/Searchlist" ></include> </FrameLayout>
Now use this following code in your package i thing this code help u . There has use three class for here
1.Flip3dAnimation.java class
import android.graphics.Camera;
import android.graphics.Matrix;
import android.view.animation.Animation;
import android.view.animation.Transformation;
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();
camera.rotateY(degrees);
camera.getMatrix(matrix);
camera.restore();
matrix.preTranslate(-centerX, -centerY);
matrix.postTranslate(centerX, centerY);
}
}
2.DisplayNextView.java class
public final class DisplayNextView implements Animation.AnimationListener
{
private boolean mCurrentView;
RelativeLayout image1;
RelativeLayout image2;
public DisplayNextView(boolean currentView, RelativeLayout rl_front, RelativeLayout rl_back)
{
mCurrentView = currentView;
this.image1 = rl_front;
this.image2 = rl_back;
}
public void onAnimationStart(Animation animation)
{
}
public void onAnimationEnd(Animation animation)
{
image1.post(new SwapViews(mCurrentView, image1, image2));
}
public void onAnimationRepeat(Animation animation)
{
}
}
3.SwapViews.java class
public final class SwapViews implements Runnable
{
private boolean mIsFirstView;
RelativeLayout image1;
RelativeLayout image2;
public SwapViews(boolean isFirstView, RelativeLayout image12, RelativeLayout image22)
{
mIsFirstView = isFirstView;
this.image1 = image12;
this.image2 = image22;
}
public void run()
{
final float centerX = image1.getWidth() / 2.0f;
final float centerY = image1.getHeight() / 2.0f;
Flip3dAnimation rotation;
if (mIsFirstView)
{
image1.setVisibility(View.GONE);
image2.setVisibility(View.VISIBLE);
image2.requestFocus();
rotation = new Flip3dAnimation(-90, 0, centerX, centerY);
}
else
{
image2.setVisibility(View.GONE);
image1.setVisibility(View.VISIBLE);
image1.requestFocus();
rotation = new Flip3dAnimation(-90, 0, centerX, centerY);
}
rotation.setDuration(300);
rotation.setFillAfter(true);
rotation.setInterpolator(new DecelerateInterpolator());
if (mIsFirstView)
{
image2.startAnimation(rotation);
}
else
{
image1.startAnimation(rotation);
}
}
}
now use following method to here u want to use Flip
protected void applyRotation(float start, float end) {
final float centerX = Rl_Main.getWidth() / 2.0f;
final float centerY = Rl_Select.getHeight() / 2.0f;
final Flip3dAnimation rotation =
new Flip3dAnimation(start, end, centerX, centerY);
rotation.setDuration(100);
rotation.setFillAfter(true);
rotation.setInterpolator(new AccelerateInterpolator());
rotation.setAnimationListener(new DisplayNextView(isFirstImage, Rl_Main, Rl_Select ));
if (isFirstImage)
Rl_Main.startAnimation(rotation);
else
Rl_Select.startAnimation(rotation);
}
This method call by use where u want to flipper effect show
applyRotation(0, 90);
isFirstImage = !isFirstImage;
where
private boolean isFirstImage = true;
RelativeLayout Rl_Main,Rl_Tshirt;
Upvotes: 2
Reputation: 13815
call this as the first statement in OnAnimationEnd
theViewOnToWhichAnimationIsApplied.clearAnimation();
this should fix it as it solved mine. i did face the same
Upvotes: 9