2012-03-23 140 views
1

我有一个ImageView,我正在使用TranslateAnimation进行动画制作。在动画结束时,我想切换它显示的绘图。它可以工作,但在显示图像之前它会闪烁。我最初使用一个AnimationListener,然后我跟着我发现的例子,通过创建一个扩展ImageView并覆盖OnAnimationEnd的自定义视图来解决这个问题。Android动画闪烁

在我的活动:

TranslateAnimation = new TranslateAnimation(0, 150, 0, 150); 
translateAnimation.setDuration(ANIMATION_DURATION); 

    btn.setNextImage(buttons.get(2)); 
    btn.startAnimation(3000); 

在我的自定义视图我有以下几点:

protected void onAnimationEnd() { 
    super.onAnimationEnd(); 

    //this.clearAnimation(); 

    if(_nextImage != null) 
     this.setImageDrawable(_nextImage); 
} 

private Drawable _nextImage; 

public void setNextImage(Drawable d) 
{ 
    _nextImage = d; 
} 
+0

你试试这个代码 http://stackoverflow.com/questions/9833988/android-3d-flip-animation/9834115#9834115 – Android 2012-03-23 08:29:45

+1

你为什么要发表意见onAnimationEnd回调中的clearAnimation()调用? – Blackbelt 2012-03-23 08:35:55

回答

8

称此为OnAnimationEnd第一个语句

theViewOnToWhichAnimationIsApplied.clearAnimation();

这应该解决它,因为它解决了我的问题。我确实面对相同的

+0

尝试避免super.onAnimationEnd()调用 – Javanator 2012-03-23 08:48:42

+0

http://developer.android.com/reference/android/view/View.html#onAnimationEnd%28%29该文档说总是调用超级 – Blackbelt 2012-03-23 08:58:51

+0

仍然尝试并查看其结果。 – Javanator 2012-03-23 09:02:06

2

我有一个想法,3D通过使用FrameLayout在屏幕上的应用动画。有两个不同的布局(magicnumber.xml & selectteam.xml),您想要将其放置在FrameLayout中。

必须有下面的XML代码

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> 

现在使用下面的代码在你的包 我的事情该代码帮助ü。这里有使用三个班在这里

1.Flip3dAnimation.java类

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类

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类

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); 


    } 

这种方法调用通过使用你想鳍效果显示

applyRotation(0, 90); 
isFirstImage = !isFirstImage; 

其中

private boolean isFirstImage = true; 
RelativeLayout Rl_Main,Rl_Tshirt;