我有一个ImageView,我使用TranslateAnimation进行动画制作。在动画结束时,我想切换它显示的drawable。它有效但在显示图像之前它会闪烁。我最初使用的是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;
}
答案 0 :(得分:8)
将此作为OnAnimationEnd
中的第一个语句theViewOnToWhichAnimationIsApplied.clearAnimation();
这应该解决它,因为它解决了我的问题。我确实面对同样的
答案 1 :(得分:2)
我有一个想法是使用FrameLayout在屏幕应用程序上进行3D翻转动画。有两种不同的布局(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 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类
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;