基础内容
android提供了4种基本的动画,移位-translate ,渐变-alpha,缩放-scale ,旋转-rotate。
在xml资源下res/anim目录下新建动画文件xml,类型是set。
有如下动画插入效果:
AccelerateDecelerateInterpolator 先加速再减速
AccelerateInterpolator 加速
AnticipateInterpolator 先回退一小步,然后再迅速前进
AnticipateOvershootInterpolator 先回退一小步,然后再迅速前进,在超过右边界一小步
BounceInterpolator 实现弹球效果
CycleInterpolator 周期运动
DecelerateInterpolator 减速
LinearInterpolator 匀速
OvershootInterpolator 快速前进到右边界上,再往外突出一小步
如何使用XML中的动画效果:Animation myAnimation= AnimationUtils.loadAnimation(this,R.anim.my_action);
如何在Java代码中定义动画:
//在代码中定义 动画实例对象
private Animation myAnimation_Alpha;
private Animation myAnimation_Scale;
private Animation myAnimation_Translate;
private Animation myAnimation_Rotate;
//根据各自的构造方法来初始化一个实例对象
myAnimation_Alpha = new AlphaAnimation(0.1f, 1.0f);
myAnimation_Scale = new ScaleAnimation(0.0f, 1.4f, 0.0f, 1.4f,
Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
myAnimation_Translate = new TranslateAnimation(30.0f, -80.0f, 30.0f, 300.0f);
myAnimation_Rotate = new RotateAnimation(0.0f, +350.0f,
Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF, 0.5f);
//RotateAnimation:
RotateAnimation(float fromDegrees, float toDegrees,
int pivotXType, float pivotXValue, int pivotYType, float pivotYValue)
//第一个参数fromDegrees为动画起始时的旋转角度
//第二个参数toDegrees为动画旋转到的角度
//第三个参数pivotXType为动画在X轴相对于物件位置类型
//第四个参数pivotXValue为动画相对于物件的X坐标的开始位置
//第五个参数pivotXType为动部分api:
//第六个参数pivotYValue为动画相对于物件的Y坐标的开始位置
myAnimation_Rotate=new RotateAnimation(0.0f, +350.0f,
Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF, 0.5f);
如何使用Java代码中的动画效果
部分api:
startAnimation (Animation animation)
animation.isRunning()
animation.stop()
animation.start()
逐帧动画
逐帧动画由一串连续的图片组成,通过xml来定义。
<animation-list
xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="false">
<item android:drawable="@drawable/qq001" android:duration="80"/>
<item android:drawable="@drawable/qq002" android:duration="80"/>
<item android:drawable="@drawable/qq003" android:duration="80"/>
<item android:drawable="@drawable/qq004" android:duration="80"/>
<item android:drawable="@drawable/qq005" android:duration="80"/>
<item android:drawable="@drawable/qq006" android:duration="80"/>
<item android:drawable="@drawable/qq007" android:duration="80"/>
<item android:drawable="@drawable/qq008" android:duration="80"/>
</animation-list>
可以将drawable以background或者src来使用,在代码里通过如下方式来获取引用并操作。
animationIV = (ImageView) findViewById(R.id.animationIV);
animationIV.setImageResource(R.drawable.animation1);
animationDrawable = (AnimationDrawable) animationIV.getDrawable();
animationDrawable.start();
或者是animationDrawable = (AnimationDrawable) animationIV.getBackground();
多个动画的衔接
<translate android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:fromXDelta="0" android:toXDelta="200"
android:fillAfter="true"
android:duration="@android:integer/config_longAnimTime" />
<translate android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:fromYDelta="0" android:toYDelta="300"
<span style="color: #ff0000;"> android:startOffset="@android:integer/config_longAnimTime" </span>
android:duration="@android:integer/config_longAnimTime" />
有两段动画,第一个是从左向右平移,第二个是从上往下平移。或者是以下这种比较复杂的效果
<set xmlns:android="http://schemas.android.com/apk/res/android" android:shareInterpolator="false">
<scale
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:fromXScale="1.0"
android:toXScale="1.4"
android:fromYScale="1.0"
android:toYScale="0.6"
android:pivotX="50%"
android:pivotY="50%"
android:fillAfter="false"
android:duration="700" />
<set
android:interpolator="@android:anim/accelerate_interpolator"
android:startOffset="700">
<scale
android:fromXScale="1.4"
android:toXScale="0.0"
android:fromYScale="0.6"
android:toYScale="0.0"
android:pivotX="50%"
android:pivotY="50%"
android:duration="400" />
<rotate
android:fromDegrees="0"
android:toDegrees="-45"
android:toYScale="0.0"
android:pivotX="50%"
android:pivotY="50%"
android:duration="400" />
</set>
</set>
类似这种嵌套能实现动画的连续,或者在代码里监听前一个动画的结束,然后播放下一个动画。
使用style来定义动画
<style name="Theme.Test" parent="@android:style/Theme.Light.NoTitleBar">
<item name="android:windowAnimationStyle">@style/Animation.Activity.Test</item>
</style>
<style name="Animation.Activity.Test" parent="@android:style/Animation.Activity">
<item name="android:activityOpenEnterAnimation">@anim/activity_open_enter</item>
<item name="android:activityOpenExitAnimation">@anim/activity_open_exit</item>
<item name="android:activityCloseEnterAnimation">@anim/activity_close_enter</item>
<item name="android:activityCloseExitAnimation">@anim/activity_close_exit</item>
<item name="android:taskOpenEnterAnimation">@anim/activity_open_enter</item>
<item name="android:taskOpenExitAnimation">@anim/activity_open_exit</item>
<item name="android:taskCloseEnterAnimation">@anim/activity_close_enter</item>
<item name="android:taskCloseExitAnimation">@anim/activity_close_exit</item>
<item name="android:taskToFrontEnterAnimation">@anim/activity_open_enter</item>
<item name="android:taskToFrontExitAnimation">@anim/activity_open_exit</item>
<item name="android:taskToBackEnterAnimation">@anim/activity_close_enter</item>
<item name="android:taskToBackExitAnimation">@anim/activity_close_exit</item>
</style> 只要这样进行配置,那边Activity之间的切换动画都可以进行自定义了
注意,这个style资源文件如果放在application的manifest里编译,那么这个style适用于这个应用,对其他没影响。如果想作用于全局,可以修改frameworks/base/core/res/res/values/styles文件实现需要的效果。
例子,修改dialog的弹出方式为从下向上弹出。
先在styles.xml里添加咱们的style项:
<style name="mystyle" parent="android:Animation">
<item name="@android:windowEnterAnimation">@anim/dialog_animation</item> //进入时的动画
<item name="@android:windowExitAnimation">@anim/dialog_animation_exit</item> //退出时的动画
</style>
然后在代码里使用style样式:
Window window = mDialog.getWindow();
window.addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
window.setWindowAnimations(R.style.mystyle);
至于动画就看你发挥了,随意尝试:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<alpha
android:fromAlpha="0.0"
android:toAlpha="1.0"
android:duration="500" />
<translate
android:toYDelta="100%p"
android:duration="500"
/>
</set>