Gau*_*ora 8 animation android material-design
我想为材料设计指南中描述的活动过渡实现滑动层动画.

但是,我现在所能做的只是slide_in和stay动画的简单组合,它不会给我一个堆叠层的效果.我怎样才能实现它?
我目前的实施:
在活动开始时:
activity.overridePendingTransition(R.anim.slide_in_right, R.anim.stay);
Run Code Online (Sandbox Code Playgroud)
关于活动结束:
activity.overridePendingTransition(R.anim.stay, R.anim.slide_out_right);
Run Code Online (Sandbox Code Playgroud)
slide_in_right.xml:
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/accelerate_interpolator">
<translate
android:fromXDelta="100%p"
android:toXDelta="0"
android:duration="@android:integer/config_shortAnimTime" />
</set>
Run Code Online (Sandbox Code Playgroud)
slide_out_right.xml:
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/accelerate_interpolator">
<translate
android:fromXDelta="0"
android:toXDelta="100%p"
android:duration="@android:integer/config_shortAnimTime" />
</set>
Run Code Online (Sandbox Code Playgroud)
stay.xml:
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="@android:integer/config_shortAnimTime"
android:fromYDelta="0%p"
android:toYDelta="0%p" />
Run Code Online (Sandbox Code Playgroud)
我终于找到了这个问题的解决方案.它完美无瑕.
这个答案中使用的重要组件:
解决方案是在关闭FrontActivity之前为FrontActivity的布局设置动画. 只有将布局中集成的工具栏用作操作栏,才能执行此操作!
我会在这里复制我的代码.我的动画是一个从底部向前滑动的活动,然后再次滑动到前一个活动前面的底部.只需更改动画,您就可以轻松地在任何方向上获得此效果.
1)具有超过BackActivity滑动FrontActivity
只需拨打overridePendingTransition从BackActivity开始FrontActivity时.
Intent intent = new Intent(activity, FrontActivity.class);
startActivity(intent);
overridePendingTransition(R.anim.slide_in_bottom, 0);
Run Code Online (Sandbox Code Playgroud)
slide_in_bottom.xml
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:fromYDelta="100%p"
android:toYDelta="0%p"
android:duration="@android:integer/config_mediumAnimTime"
android:interpolator="@android:anim/decelerate_interpolator">
</translate>
Run Code Online (Sandbox Code Playgroud)
2)从FrontActivity返回到BackActivity时,在关闭FrontActivity之前,将FrontActivity的布局设置为动画!
我通过在我onOptionsSelected()和我onBackPressed()的FrontActivity中调用以下方法来完成此操作
private void animateOut() {
Animation slideAnim = AnimationUtils.loadAnimation(this,R.anim.slide_out_bottom);
slideAnim.setFillAfter(true);;
slideAnim.setAnimationListener(new AnimationListener() {
public void onAnimationStart(Animation paramAnimation) { }
public void onAnimationRepeat(Animation paramAnimation) { }
public void onAnimationEnd(Animation paramAnimation) {
finish();
// if you call NavUtils.navigateUpFromSameTask(activity); instead,
// the screen will flicker once after the animation. Since FrontActivity is
// in front of BackActivity, calling finish() should give the same result.
overridePendingTransition(0, 0);
}
});
BackgroundView.startAnimation(slideAnim);
}
Run Code Online (Sandbox Code Playgroud)
slide_out_bottom.xml
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:fromYDelta="0%p"
android:toYDelta="100%p"
android:duration="@android:integer/config_mediumAnimTime"
android:interpolator="@android:anim/accelerate_interpolator">
</translate>
Run Code Online (Sandbox Code Playgroud)
3)现在我们必须确保BackActivity在设置动画时可见于FrontActivity后面.
我们需要为此透明主题.
styles.xml
<resources>
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<!-- your theme -->
</style>
<style name="Theme.Transparent" parent="AppTheme">
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowBackground">@android:color/transparent</item>
</style>
</resources>
Run Code Online (Sandbox Code Playgroud)
4)将透明主题应用于清单中的FrontActivity:
AndroidManifest.xml中
<activity
android:name=".FrontActivity"
android:theme="@style/Theme.Transparent"
android:parentActivityName=".BackActivity" />
Run Code Online (Sandbox Code Playgroud)
5)因为您的活动现在是透明的,所以您需要向BackgroundView添加背景. 标准背景是:
android:background="@android:color/background_light"
android:background="@android:color/background_dark"
Run Code Online (Sandbox Code Playgroud)
front_activity.xml
<?xml version="1.0" encoding="utf-8"?>
<!-- This is BackgroundView and can be any ViewGroup -->
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_height="match_parent"
android:layout_width="match_parent"
android:background="@android:color/background_light" >
<android.support.v7.widget.Toolbar
android:layout_height="@dimen/height_toolbar"
android:layout_width="match_parent"
android:minHeight="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />
<!-- rest of layout -->
</FrameLayout>
Run Code Online (Sandbox Code Playgroud)
而已.动画现在应该正常工作.
编辑
我找到了一个不会闪烁的解决方案.动画看起来完美无瑕.
关闭FrontActivity时,请调用finish而不是NavUtils.navigateUpFromSameTask(activity).我在答案中改变了这一点.
您可以通过覆盖活动之间的转换来获得所描述的行为。我还包括对背部活动的淡化收缩效果以改善其外观:
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_shortAnimTime"/>
</set>
Run Code Online (Sandbox Code Playgroud)
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_shortAnimTime"/>
</set>
Run Code Online (Sandbox Code Playgroud)
淡出_back.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<scale android:duration="@android:integer/config_shortAnimTime"
android:pivotX="50.0%"
android:pivotY="50.0%"
android:fromXScale="1.0"
android:toXScale="0.9"
android:fromYScale="1.0"
android:toYScale="0.9"/>
<alpha android:duration="@android:integer/config_shortAnimTime"
android:fromAlpha="1.0"
android:toAlpha="0.7"/>
</set>
Run Code Online (Sandbox Code Playgroud)
淡出_forward.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<scale android:duration="@android:integer/config_shortAnimTime"
android:pivotX="50.0%"
android:pivotY="50.0%"
android:fromXScale="0.9"
android:toXScale="1.0"
android:fromYScale="0.9"
android:toYScale="1.0"/>
<alpha android:duration="@android:integer/config_shortAnimTime"
android:fromAlpha="0.7"
android:toAlpha="1.0"/>
</set>
Run Code Online (Sandbox Code Playgroud)
父Activity.java
在您的活动常见的父类中,您可以包含可重用代码:
/* Activity transitions */
protected void slideInTransition() {
overridePendingTransition(R.anim.slide_in_right, R.anim.fade_back);
}
protected void slideOutTransition() {
overridePendingTransition(R.anim.fade_forward, R.anim.slide_out_right);
}
Run Code Online (Sandbox Code Playgroud)
然后在活动开始:
startActivity(intent);
slideInTransition();
Run Code Online (Sandbox Code Playgroud)
对于后过渡:
@Override
public void onBackPressed() {
super.onBackPressed();
slideOutTransition();
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4315 次 |
| 最近记录: |