我正在开发一款工作简单且效率很高的应用程序。但我有一个地方,我正在寻找一些看起来不太好的东西,那就是翻动动画。
我想要的:
我在按钮下面有一个Button和一个ImageView。在按钮上单击我想制作一个动画,它看起来像ImageView已翻转,下一个图像显示在ImageView中。因此,每次点击它都应该显示下一个带有翻转动画的图像,但是存在一些问题。我稍后会讨论,但首先让我告诉你我是怎么做的。
到目前为止我做了什么:
flipping.xml
<?xml version="1.0" encoding="utf-8"?>
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
android:valueFrom="0" android:valueTo="180" android:propertyName="rotationY" >
</objectAnimator>
在活动中
@Override
public void onClick(View v) {
flipAnimation();
ivAnimPicture.setImageResource(myImage1);
}
private void flipAnimation(){
ObjectAnimator anim = (ObjectAnimator) AnimatorInflater.loadAnimator(this, R.animator.flipping);
anim.setTarget(ivAnimPicture);
anim.setDuration(1500);
anim.start();
}
问题
当它从0旋转到180时,当它完全达到90度时,我们可以看到图像视图边缘,因此它使动画看起来不那么好。并且图像也会先改变然后翻转动画开始,因为我想要翻转动画应该开始,在它的中间应该出现新图像。因此,当动画停止时,应该为用户提供令人惊讶的新图像。 所以我真的不希望Image在图像视图中设置,然后动画启动并动画图像视图
请建议我更好的方法或者有没有过时的图书馆。
答案 0 :(得分:9)
Chathuranga的解决方案将完成这项工作。但你最好:
1.使用ViewPropertyAnimator
。特别是,当您需要在多个ImageViews
上执行不同的动画。
2.从270f
转到360f
进行第二次翻转,否则您的图片将镜像。
3.在开始动画之前,将第二张图片加载到Drawable
中,以便平滑旋转。
final Drawable drawable=getResources().getDrawable(R.drawable.a);
final ImageView iv = ((ImageView)findViewById(R.id.imageView1));
iv.setRotationY(0f);
iv.animate().rotationY(90f).setListener(new AnimatorListener()
{
@Override
public void onAnimationStart(Animator animation)
{
}
@Override
public void onAnimationRepeat(Animator animation)
{
}
@Override
public void onAnimationEnd(Animator animation)
{
iv.setImageDrawable(drawable);
iv.setRotationY(270f);
iv.animate().rotationY(360f).setListener(null);
}
@Override
public void onAnimationCancel(Animator animation)
{
}
});
答案 1 :(得分:0)
试试这段简单的代码并告诉我
ObjectAnimator anim = (ObjectAnimator) AnimatorInflater.loadAnimator(this, R.animator.flipping);
anim.setTarget(ivAnimPicture);
anim.setDuration(1500);
anim.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
ivAnimPicture.setImageResource(myImage1);
}
});
anim.start();
答案 2 :(得分:0)
我在你的情况下试图弄清楚如何完成这个动画。以下是我实现这一目标的方法。
你需要定义两个动画。一个从0度旋转到90度,另一个从90度旋转到180度
<强> flipstage1.xml 强>
<?xml version="1.0" encoding="utf-8"?>
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
android:propertyName="rotationY"
android:valueFrom="0"
android:valueTo="90">
</objectAnimator>
<强> flipstage2.xml 强>
<?xml version="1.0" encoding="utf-8"?>
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
android:propertyName="rotationY"
android:valueFrom="90"
android:valueTo="180">
</objectAnimator>
将这两个文件放在res / animator
下在您的代码中首先启动第一个动画,为其添加一个侦听器。在动画结束时,更改图像并开始第二个动画。
ObjectAnimator animStage1 = (ObjectAnimator) AnimatorInflater.loadAnimator(getActivity(), R.animator.flipstage1);
final ObjectAnimator animStage2 = (ObjectAnimator) AnimatorInflater.loadAnimator(getActivity(), R.animator.flipstage2);
animStage1.setTarget(imageIcon1);
animStage2.setTarget(imageIcon1);
animStage1.setDuration(500);
animStage2.setDuration(500);
animStage1.start();
animStage1.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
}
@Override
public void onAnimationEnd(Animator animation) {
animStage2.start();
imageIcon1.setImageDrawable(ResourcesCompat.getDrawable(view.getResources(),R.drawable.okicon,null));
}
@Override
public void onAnimationCancel(Animator animation) {
}
@Override
public void onAnimationRepeat(Animator animation) {
}
});
imageIcon1是xml布局中图像视图的引用。