如何在Android中的两个活动之间应用幻灯片动画?
当我从一个活动移动到另一个活动时,我希望实现从左到右的滑动效果。为此,我使用以下代码,但没有得到任何结果。请纠正我 在java中,这两个文件:如何在Android中的两个活动之间应用幻灯片动画?,android,android-activity,android-animation,Android,Android Activity,Android Animation,当我从一个活动移动到另一个活动时,我希望实现从左到右的滑动效果。为此,我使用以下代码,但没有得到任何结果。请纠正我 在java中,这两个文件: super.onCreate(savedInstanceState); overridePendingTransition(R.anim.fadein, R.anim.fadeout); setContentView(R.layout.main); res/anim目录中的两个文件: fadein.xml <?xml version="1.0"
super.onCreate(savedInstanceState);
overridePendingTransition(R.anim.fadein, R.anim.fadeout);
setContentView(R.layout.main);
res/anim目录中的两个文件:
fadein.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 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>
<?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>
<?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>
<?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"/>
fadeout.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 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>
<?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>
<?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>
<?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"/>
将这两个文件添加到res/anim文件夹中 R.anim.滑出底部
<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>
<?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>
您可以覆盖默认的活动动画,它的性能优于overridePendingTransition。我使用的这个解决方案适用于所有android版本。只需复制粘贴4个文件并添加4行样式,如下所示:
创建“CustomActivityAnimation”,并通过“windowAnimationStyle”将其添加到基础主题中
@颜色/原色
@颜色/原色暗
@颜色/原色
@样式/自定义活动动画
@动画/幻灯片在右侧
@动画/滑出左
@动画/幻灯片在左
@动画/滑出\右
然后在res文件夹下创建动画文件夹,然后将这四个动画文件创建到动画文件夹中:
将\u滑入\u 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>
<?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>
滑出\u 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>
在\u left.xml中滑动\u
<?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>
滑出\u 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>
<?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>
如果你遇到任何问题,那么你可以下载我的
谢谢您可以在
startActivity
中使用覆盖翻译
而不是onCreate
。至少,这对我有用
请参阅完整示例。它包括一个(反向)动画,所以在返回到上一个活动时!在您的特定示例中(淡入淡出),这可能是不必要的。通过调用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>
覆盖过渡(R.anim.slide\u向下,R.anim.slide\u向上)
有关更多活动转换示例,请参见。使用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_out_right"
android:toAlpha="1.0" >
</alpha>
<?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>
<?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>
<?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>
<?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);
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);
}
}
完成
更多当呈现视图模型时,我尝试使幻灯片动画类似于iOS动画(如下图所示),但失败了 查看iOS当前的动画,您将看到:从底部开始的动画使用alpha(约50%),然后速度非常快,然后变慢,动画时间大约>500毫秒(我使用修剪视频工具来计算动画时间) 所以它不可能完全是100%) 然后我尝试应用到android上。
为了制作alpha,我使用
来理解它
我试过上面的3个我不能实现像iOS一样的动画,也不能像iOS那样启动得更快。然后我创建一个自定义减速器插值器,其系数为3,如
<?xml version="1.0" encoding="utf-8"?>
<decelerateInterpolator xmlns:android="http://schemas.android.com/apk/res/android"
android:factor="3" />
我将持续时间从500->750
增加。它运行良好(与iOS非常相似)。然而,它只在某些设备中工作良好,在某些设备中动画速度相当慢。后来,我知道动画在不同的设备上可能会有所不同(例如:有些设备会更快,有些设备会更慢),所以我不能让它在所有Android设备上都类似。因此,我不使用插值器。我不知道我的测试是否完全是100%,但我希望这一经验对Kotlin示例有所帮助:
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()
}
将动画放入动画文件夹:
slide_in.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>
这是一个幻灯片动画。
假设你有两项活动
电影活动
所有卡斯特活动
点击一个按钮,就会发生这种情况
您可以通过3个简单的步骤实现这一点
1)启用内容转换
<?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>
转到style.xml
并添加此行以启用内容转换
<item name="android:windowContentTransitions">true</item>
3)有目的地开始活动
在您的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);
..........
}
}
希望它对你有用
startActivityForResult( intent, 1 , ActivityOptions.makeCustomAnimation(getActivity(),R.anim.slide_out_bottom,R.anim.slide_in_bottom).toBundle());
谢谢-现在,当按back键返回到旧活动时,如何放置反向动画button@EmAe,我问了一个类似的问题,并在这里自己回答:。希望对你有帮助@如果可能的话,你能添加反向动画吗?我使用了以下代码:overridePendingTransition(android.R.anim.fade\u-in,android.R.anim.fade\u-out)代码>您可以在或中看到这些示例。您也可以从中看到更多。我使用的是android 6华为,它的性能非常好。:)非常好。工作非常好。我们不需要加入所有的意图,这就是这种方法的优势。thans shohanI喜欢这种解决方案!把它放在一个地方,像一个魔咒一样在任何地方都能发挥作用!这是最好的解决办法。无需使用Java/Kotlin编写代码。只要放上这些XML文件,一切都很容易完成。这是一个神奇的解决方案,值得1000票的支持。你很少能找到像这样简单而优雅的解决方案。最重要的是,不需要难看的长代码,只需要简单的XML就可以了。请不要做这种延迟的活动启动!即使你的应用程序不再在前台,它也会启动你的主要活动。