如何在Activity转换过程中为单个视图添加动画效果?

3
当切换活动时,我如何触发单个视图上的动画?例如,如果用户点击按钮进入下一页,我希望我的某些视图飞出屏幕,并且在背景淡入下一个屏幕时交叉淡出,而不是整个屏幕作为一个整体动画。

这种情况是否可能?如果可能,应该如何实现?(我使用的是最新的API4.1,不需要向后兼容)

编辑:目前,在onResume()中调用转场动画的效果很好,但当我按返回键时,活动切换得比onPause()启动的任何动画都快,这让我认为有更好的方法/地方来做这件事。

2个回答

2

您可以这样设置动画(如幻灯片),当您在活动之间切换时:

  1. 在res文件夹中创建一个anim文件夹
  2. 例如,放置两个用于幻灯片的xml文件。

slide_in.xml

 <set xmlns:android="http://schemas.android.com/apk/res/android"
         android:shareInterpolator="false">
        <translate android:fromXDelta="100%" android:toXDelta="0%"
          android:fromYDelta="0%" android:toYDelta="0%"
         android:duration="200"/>
  </set>

slie_out.xml

<set xmlns:android="http://schemas.android.com/apk/res/android"
         android:shareInterpolator="false">
      <translate
       android:fromXDelta="100%" android:toXDelta="0%"
       android:fromYDelta="0%" android:toYDelta="0%"
       android:duration="200" />
    </set>
  1. Then on your java code just write this :

    Intent i = new Intent(YourActivity.this, OtherActivity.class);
        this.startActivity(i);
        overridePendingTransition(R.anim.slide_in, R.anim.slide_out);
    
如果你正在真实设备上进行测试,请不要忘记允许播放动画(设置 -> 显示 -> 动画 -> 所有动画)。
希望有所帮助!:)

这会使整个Activity动画化,我想单独为每个视图添加动画效果。 - Nick Badal
哦,抱歉,我误解了。你看到这个了吗?http://developer.android.com/reference/android/view/ViewPropertyAnimator.html - Alexis C.
是的,但我需要知道如何在离开/开始活动时触发这种动画。 - Nick Badal
然后只需重写 onStop()、onResume() 或 onStart() 方法来触发它。请参阅 http://developer.android.com/reference/android/app/Activity.html。 - Alexis C.
重写onResume()方法没有问题,但是在跳转到下一个屏幕之前,onPause/onStop方法不会等待动画完成。 - Nick Badal

2

重写onResume()方法可以正常工作,但是在移动到下一个屏幕之前,onPause/onStop不会等待动画完成。

无论什么事件启动,例如按钮单击,都需要在调用start activity之前启动动画。

button.setOnClickListener(new ViewOnClickListener() {

    @Override
    void onClick(... {

        // start animations
        // wait till they are finished
        // start activity
    }
});

由于每个启动新活动的事件都将具有动画代码,因此我建议将其移入某种辅助类中,以避免在各处重复代码。例如:

button1.setOnClickListener(new ViewOnClickListener() {

    @Override
    void onClick(... {

        helper.AnimateViews(/* probably pass activity or context */); 

        // start activity
    }
});

button2.setOnClickListener(new ViewOnClickListener() {

    @Override
    void onClick(... {

        helper.animateViews(/* probably pass activity or context */); 

        // start activity
    }
});

public class ViewAnimiationHelper {

    public void animateViews(Activity activity) {

        // find all views if not found then don't animate them
        View view1 = activity.findViewById(R.id.view1);

        if(view1 != null) {

            // animate view
        }

        View view2 = activity.findViewById(R.id.view1);

        if(view2 != null) {

            // animate view
        }
    }
}

这是完全使用sudo Java代码,但希望足以让您了解其思路。祝您好运!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接