user895400
user895400

Reputation: 368

Android animation flickers

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

Answers (2)

Akash Singh
Akash Singh

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

Rohit Sharma
Rohit Sharma

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

Related Questions