【问题标题】:Android animation flickers安卓动画闪烁
【发布时间】:2012-03-23 08:27:03
【问题描述】:

我有一个 ImageView,我正在使用 TranslateAnimation 制作动画。在动画结束时,我想切换它正在显示的可绘制对象。它可以工作,但在显示图像之前会闪烁。我最初使用的是 AnimationListener,然后我按照我找到的示例来解决这个问题,方法是创建一个扩展 ImageView 并覆盖 OnAnimationEnd 的自定义视图,但无济于事。

在我的活动中:

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

【问题讨论】:

标签: android


【解决方案1】:

将其称为 OnAnimationEnd 中的第一条语句

theViewOnToWhichAnimationIsApplied.clearAnimation();

这应该解决它,因为它解决了我的问题。我确实面临同样的情况

【讨论】:

  • 尽量避免调用 super.onAnimationEnd()
  • developer.android.com/reference/android/view/… 医生说总是打电话给超级
  • 还是试试看结果吧。
  • @Javanator:我假设你假设他使用了一个监听器,在这种情况下,超级是不必要的,因为它不存在(但它什么也不做,所以调用它没有害处)
【解决方案2】:

我有一个想法,即使用 FrameLayout 在您的屏幕应用程序上实现 3D 翻转动画。有两种不同的布局(magicnumber.xml 和 selectteam.xml),你想翻转它们。FrameLayout 中的这个地方。

有如下Xml代码

容器.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; 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-02
    • 2012-03-12
    • 2011-03-30
    • 2011-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-04
    相关资源
    最近更新 更多