71

当我从一个活动移动到另一个活动时,我想实现从左到右的滑动效果。为此,我正在使用以下代码,但没有得到任何结果。请纠正我。

在java中这两个文件:

super.onCreate(savedInstanceState);
overridePendingTransition(R.anim.fadein, R.anim.fadeout);
setContentView(R.layout.main);

res/anim 目录下的两个文件:

淡入淡出.xml

<?xml version="1.0" encoding="utf-8"?>
<alpha
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="5000"
    android:fromAlpha="0.0"
    android:interpolator="@android:anim/slide_out_right"
    android:toAlpha="1.0" >
</alpha>

淡出.xml

<?xml version="1.0" encoding="utf-8"?>
<alpha
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="5000"
    android:fromAlpha="0.0"
    android:interpolator="@android:anim/slide_in_left"
    android:toAlpha="1.0" >
</alpha>
4

9 回答 9

171

在 res/anim 文件夹中添加这两个文件。

R.anim.slide_out_bottom

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

R.anim.slide_in_bottom

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="false">
<translate
    android:duration="@integer/time_duration_max"
    android:fromXDelta="0%"
    android:fromYDelta="0%"
    android:toXDelta="0%"
    android:toYDelta="100%" /> 
</set>

并在您的视图单击侦听器中编写以下代码行。

startActivity(new Intent(MainActivity.this, NameOfTargetActivity.class));
overridePendingTransition(R.anim.slide_out_bottom, R.anim.slide_in_bottom);
于 2013-10-15T05:40:40.577 回答
124

在此处输入图像描述

您可以覆盖您的默认活动动画,它比 overridePendingTransition 执行得更好。我使用适用于每个 android 版本的解决方案。只需复制粘贴 4 个文件并添加 4 行样式,如下所示:

创建一个“CustomActivityAnimation”并通过“windowAnimationStyle”将其添加到您的基本主题中。

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorPrimary</item>
    <item name="android:windowAnimationStyle">@style/CustomActivityAnimation</item>

</style>

<style name="CustomActivityAnimation" parent="@android:style/Animation.Activity">
    <item name="android:activityOpenEnterAnimation">@anim/slide_in_right</item>
    <item name="android:activityOpenExitAnimation">@anim/slide_out_left</item>
    <item name="android:activityCloseEnterAnimation">@anim/slide_in_left</item>
    <item name="android:activityCloseExitAnimation">@anim/slide_out_right</item>
</style>

然后在 res 文件夹下创建 anim 文件夹,然后将这四个动画文件创建到 anim 文件夹中:

slide_in_right.xml

<?xml version="1.0" encoding="utf-8"?>

<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate android:fromXDelta="100%p" android:toXDelta="0"
        android:duration="@android:integer/config_mediumAnimTime"/>
</set>

slide_out_left.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate android:fromXDelta="0" android:toXDelta="-100%p"
        android:duration="@android:integer/config_mediumAnimTime"/>
</set>

slide_in_left.xml

<?xml version="1.0" encoding="utf-8"?>

<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate android:fromXDelta="-100%p" android:toXDelta="0"
        android:duration="@android:integer/config_mediumAnimTime"/>
</set>

slide_out_right.xml

<?xml version="1.0" encoding="utf-8"?>

<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate android:fromXDelta="0" android:toXDelta="100%p"
        android:duration="@android:integer/config_mediumAnimTime"/>
</set>

如果您遇到任何问题,您可以从 github 下载我的示例项目

谢谢

于 2016-10-09T12:53:01.950 回答
34
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.splashscreen);

         new Handler().postDelayed(new Runnable() {
             public void run() {

                     /* Create an intent that will start the main activity. */
                     Intent mainIntent = new Intent(SplashScreen.this,
                             ConnectedActivity.class);
                     mainIntent.putExtra("id", "1");

                     //SplashScreen.this.startActivity(mainIntent);
                     startActivity(mainIntent);
                     /* Finish splash activity so user cant go back to it. */
                     SplashScreen.this.finish();

                     /* Apply our splash exit (fade out) and main
                        entry (fade in) animation transitions. */
                     overridePendingTransition(R.anim.mainfadein,R.anim.splashfadeout);
             }
     }, SPLASH_DISPLAY_TIME);   
    }
于 2012-04-20T09:31:19.300 回答
23

使用带有一些音符的 alpha 动画向上/向下滑动

在此处输入图像描述

slide_up.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="@integer/activity_transition_time"
    >
    <translate
        android:fromYDelta="100%p"
        android:toYDelta="0"/>
    <alpha
        android:fromAlpha="0.5"
        android:toAlpha="1"/>
</set>

slide_down.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="@integer/activity_transition_time"
    >
    <translate
        android:fromYDelta="0"
        android:toYDelta="100%p"/>
    <alpha
        android:fromAlpha="1"
        android:toAlpha="0.5"/>
</set>

no_animation.xml

<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="@integer/activity_transition_time"
    android:fromYDelta="0"
    android:toYDelta="0"/>

第一个活动

startActivity(new Intent(this, SecondActivity.class));
overridePendingTransition(R.anim.slide_up,  R.anim.no_animation); // remember to put it after startActivity, if you put it to above, animation will not working
// document say if we don't want animation we can put 0. However, if we put 0 instead of R.anim.no_animation, the exist activity will become black when animate

第二次活动

finish();
overridePendingTransition(R.anim.no_animation, R.anim.slide_down);

完毕

更多
我尝试在呈现视图模型(如https://www.youtube.com/watch?v=deZobvh2064)时制作像 iOS 动画一样的幻灯片动画但失败了。

查看 iOS 当前动画,您会看到: 带有 alpha 的底部动画(大约 50%)然后它变得非常快然后变慢,动画时间大约 > 500 毫秒(我使用修剪视频工具来计算动画时间 https:// www.kapwing.com/trim-video所以它不能完全 100%)

然后我尝试申请android。
为了使我使用<alpha>和成功的 alpha。
为了使动画开始的速度比我使用的慢,android:interpolator="a decelerate interpolator"但它几乎失败了。

decelerate interpolatorAndroid中有 3 个默认值
@android:interpolator/decelerate_quad-> 因子 = 1
@android:interpolator/decelerate_cubic-> 因子 = 1.5
@android:interpolator/decelerate_quint_> 因子 = 2.5
(因子越高 <=> 动画从开始时开始越快,结束时越慢)
这是一个很好的教程http://cogitolearning。 co.uk/2013/10/android-animations-tutorial-5-more-on-interpolators/理解它

我试过上面的3个我不能像iOS那样实​​现,动画不能像iOS那样启动更快。然后我创建一个自定义 decelerateInterpolator 和 factor = 3 like

<?xml version="1.0" encoding="utf-8"?>
<decelerateInterpolator xmlns:android="http://schemas.android.com/apk/res/android"
    android:factor="3" />

我从 增加持续时间500 -> 750。它运行良好(与 iOS 非常相似)。但是,它只在某些设备上运行良好,在某些设备上动画很慢。后来,我知道不同设备上的动画可能会有所不同(例如:某些设备会更快,而某些设备会更慢)所以我不能让它在所有 Android 设备上都相似。因此我不使用interpolator. 我不知道我的测试是否准确 100%,但我希望这次经验对您有所帮助

于 2018-10-05T04:04:46.253 回答
4

这是给你的幻灯片动画。

在此处输入图像描述

假设您有两个活动。

  1. MovieDetailActivity
  2. AllCastActivity

点击一个按钮,就会发生这种情况。

在此处输入图像描述

您可以通过 3 个简单的步骤实现此目的

1) 启用内容转换

转到您的style.xml并添加此行以启用内容转换。

<item name="android:windowContentTransitions">true</item>

2) 为您的 AllCastActivity 编写默认进入和退出转换

public void setAnimation()
{
    if(Build.VERSION.SDK_INT>20) {
        Slide slide = new Slide();
        slide.setSlideEdge(Gravity.LEFT);
        slide.setDuration(400);
        slide.setInterpolator(new AccelerateDecelerateInterpolator());
        getWindow().setExitTransition(slide);
        getWindow().setEnterTransition(slide);
    }
}

3)有意图地开始活动

在 Your 中编写此方法MovieDetailActivity以启动AllCastActivity

public void startActivity(){

Intent i = new Intent(FirstActivity.this, SecondActivity.class);
i.putStringArrayListExtra(MOVIE_LIST, movie.getImages());

  if(Build.VERSION.SDK_INT>20)
   {
       ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(BlankActivity.this);
       startActivity(i,options.toBundle());
   }
   else {
       startActivity(i);
   }
}

最重要的!

将您的方法放在setAnimation()方法之前,setContentView()否则动画将不起作用。
所以你AllCastActivity.java应该看起来像这样

 class AllCastActivity extends AppcompatActivity {

   @Override
   protected void onCreate(Bundle savedInstaceState)
   {
      super.onCreate(savedInstaceState);

      setAnimation();

      setContentView(R.layout.all_cast_activity);

      .......
   }

   private void setAnimation(){

      if(Build.VERSION.SDK_INT>20) {
      Slide slide = new Slide();
      slide.setSlideEdge(Gravity.LEFT);
      ..........
  }
}
于 2018-12-15T19:37:12.340 回答
3

科特林示例:

    private val SPLASH_DELAY: Long = 1000

    internal val mRunnable: Runnable = Runnable {
        if (!isFinishing) {
            val intent = Intent(applicationContext, HomeActivity::class.java)
            startActivity(intent)
            overridePendingTransition(R.anim.slide_in, R.anim.slide_out);
            finish()
        }
    }


   private fun navigateToHomeScreen() {
        //Initialize the Handler
        mDelayHandler = Handler()

        //Navigate with delay
        mDelayHandler!!.postDelayed(mRunnable, SPLASH_DELAY)

    }

    public override fun onDestroy() {

        if (mDelayHandler != null) {
            mDelayHandler!!.removeCallbacks(mRunnable)
        }

        super.onDestroy()
    }

将动画放在 anim 文件夹中:

幻灯片输入.xml

<?xml version="1.0" encoding="utf-8"?>
<translate
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:duration="@android:integer/config_longAnimTime"
        android:fromXDelta="100%p"
        android:toXDelta="0%p">
</translate>

幻灯片输出.xml

<?xml version="1.0" encoding="utf-8"?>
<translate
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:duration="@android:integer/config_longAnimTime"
        android:fromXDelta="0%p"
        android:toXDelta="-100%p">
</translate>

用法

  navigateToHomeScreen();
于 2018-10-27T18:20:37.783 回答
1

您可以使用overridePendingTransitioninstartActivity代替onCreate. 至少,这对我有用!

在此处查看完整示例。它包括一个(反向)动画 onBackPressed,所以在返回上一个活动时!在您的特定示例(淡入和淡出)中,这可能是不必要的。

于 2017-06-10T13:15:57.060 回答
1

希望它对你有用。

startActivityForResult( intent, 1 , ActivityOptions.makeCustomAnimation(getActivity(),R.anim.slide_out_bottom,R.anim.slide_in_bottom).toBundle());
于 2021-02-19T10:52:27.137 回答
0

通过调用 overridePendingTransition 并为进入和退出活动传递动画资源,可以将幻灯片动画应用于活动转换。

幻灯片动画可以向右滑动、向左滑动、向上滑动和向下滑动。

向上滑动

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/linear_interpolator">
    <scale
        android:duration="800"
        android:fromXScale="1.0"
        android:fromYScale="1.0"
        android:toXScale="1.0"
        android:toYScale="0.0" />
</set>

滑下

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/linear_interpolator">
    <scale
        android:duration="800"
        android:fromXScale="1.0"
        android:fromYScale="0.0"
        android:toXScale="1.0"
        android:toYScale="1.0" />
</set>

overridePendingTransition(R.anim.slide_down, R.anim.slide_up);

有关更多活动转换示例,请参阅活动转换动画示例。

于 2018-04-01T03:59:37.353 回答