动画之小结(待整理)
二.Activity的进出动画?
方法一:自定义styles.xml文件,在AndroidManifest.xml清单文件中注册android:theme以实现动画,然后正常启动页面即可(application中设置应所有页面,activity中设置应用单个页面)
注意事项:
1、activityOpenEnterAnimation、activityOpenExitAnimation指定的是入场动画
2、activityCloseEnterAnimation、activityCloseExitAnimation指定的是出场动画
3、activityOpenEnterAnimation、activityCloseExitAnimation针对即将要开启的页面
4、activityOpenExitAnimation、activityCloseEnterAnimation针对的是当前页面
注意使用此方法设定activity动画时,出场动画不起效果,暂时原因未知,解决方案:在调用finish方法之后调用overridePendingTransition方法,具体使用方法请见方法二
styles.xml文件:
<style name="AppBaseTheme" parent="android:Theme.Light"> </style>
<!-- 页面弹出(入场出场)动画 -->
<style name="AnimationActivity" parent="@android:style/Animation">item name="android:activityOpenEnterAnimation">@anim/in_from_right</item >
<item name="android:activityOpenExitAnimation">@anim/in_from_right_abit</item >
<item name="android:activityCloseEnterAnimation">@anim/out_to_right_abit</item >
<item name="android:activityCloseExitAnimation">@anim/out_to_right</item >
</style>
<style name="ActivitySlideTheme" parent="AppBaseTheme">
<item name="android:windowNoTitle">true</item >
<item name="android:windowAnimationStyle">@style/AnimationActivity</item>
</style>
AndroidManifest.xml
<!--指定application的theme--><!--应用所有的activity-->
<application android:theme="@style/ActivitySlideTheme">
<!--指定activtiy的theme--><!--指定单个的activity-->
<activity android:theme="@style/ActivitySlideTheme">
方法二:startActivity和finish之后调用overridePendingTransition函数可以实现该效果
注意事项:
1、该函数必须在startActivity和finish之后调用
2、startActivity方法之后调用是设置入场动画
3、finish方法之后调用是设置出场动画
4、void android.app.Activity.overridePendingTransition(int enterAnim, int exitAnim)
enterAnim:指定入场动画(针对即将要展示的页面)
exitAnim:指定出场动画(针对即将要关闭或隐藏的页面)
使用说明:
注意,在定义入场动画时,应该确保在主线程运行,否则有可能会无效。所以,尽量在调用处使用Activity.runOnUiThread(new Runnable() {XXXX});
添加原因:此段代码写在JS要调用的原生接口中可能不在主线程中运行,会出现动画效果时有时无
currentActivity.startActivity(intent);
// 定义出入场动画
currentActivity.overridePendingTransition(R.anim.in_from_right,R.anim.in_from_right_abit);
TestActivity.class类文件中:
//点击系统返回和页面返回键时的处理
private void backClick() {
finish();
// 定义出入场动画
}
方法一和方法二对比:
方法一:使用成本比较大,每次启动页面或关闭页面均需要调用overridePendingTransition,
改善方案:重写startActivty()和finish()方法,如果要设置到整个app的页面可以定义基类如BaseActivity,然后重写基类的startActivty()和finish()方法。
方法二:只需在清单文件中配置,做通用配置比较简单,但是出场动画设置无效很头疼,目前原因还未知。
解决方案:
// 点击系统返回和页面返回键时的处理
private void backClick() {
finish();
// 定义出入场动画
}
anim文件夹下自定义的动画:
in_from_right_abit.xml:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
<translate
android:duration="300"
android:fromXDelta="0"
android:toXDelta="-15%"
</set>
in_from_right.xml:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
<translate
android:duration="300"
android:fromXDelta="100%"
android:toXDelta="0%"
</set>
out_to_right_abit.xml:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
<translate
android:duration="300"
android:fromXDelta="-15%"
android:toXDelta="0%"
</set>
out_to_right.xml:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
<translate
android:duration="300"
android:fromXDelta="0%"
android:toXDelta="100%"
</set>
具体动画可根据自己项目需求自定义。 另:Android已经内置了几种动画效果,可以见 android.R.anim类。
一. MotionLayout简介(动画的一种实现方式)?
MotionLayout 是一个 Google出品用于制作过渡动画的框架。用来它就能轻松的做出一些较为复杂的动画效果。MotionLayout 是约束布局ConstraintLayout的子类。
MotionLayout最低支持到 Android 4.3(API 18),还有就是MotionLayout 是ConstraintLayout 2.0添加的,因此必须确保支持库的版本不低于 2.0。
MotionLayout 与 ConstraintLayout不同的是:
MotionLayout 需要链接到一个MotionScene 文件。使用MotionLayout的app:layoutDescription属性将 MotionLayout 链接到一个MotionScene 文件。
1.开始使用MotionLayout
添加支持库:
如果您使用了 AndroidX
dependencies {
implementation 'androidx.constraintlayout:constraintlayout:2.0.0-beta1'
}
如果您没有使用 AndroidX
dependencies {
implementation 'com.android.support.constraint:constraint-layout:2.0.0-beta1'
}
由于 MotionLayout 类继承自 ConstraintLayout 类,因此可以在布局中使用 MotionLayout替换掉ConstraintLayout
2.MotinScene介绍
MotionScene 是一个 XML 资源文件,其中包含相应布局的所有运动描述。为了将布局信息与运动描述分开,每个 MotionLayout 都引用一个单独的 MotionScene。请注意,MotionScene 中的定义优先于 MotionLayout 中的任何类似定义。
MotionScene文件描述了两个场景间的过渡动画,存放在 res/xml 目录下。
要使用 MotionLayout 创建过渡动画,你需要创建两个 layout 布局文件来描述两个不同场景的属性。当从一个场景切换到另一个场景时,MotionLayout 框架会自动检测这两个场景中具有相同 id 的 View 的属性差别,然后针对这些差别属性应用过渡动画(类似于 TransitionManger)
MotionLayout 框架支持的标准属性:MationLayout 除了支持下面列出的标准属性外,还支持全部的 ConstraintLayout 属性。
android:visibility
android:alpha
android:elevation
android:rotation
android:rotationX
android:rotationY
android:scaleX
android:scaleY
android:translationX
android:translationY
android:translationZ