视图动画只适合于简单的界面效果,如果需要与用户进行交互时尽量不要使用,因为视图动画只能应用于View对象,而且只支持一部分属性,如支持缩放旋转而不支持背景颜色的改变。而且对于视图动画,并不改变属性的值,它只是改变了View对象绘制的位置,而没有改变View对象本身,比如一张图片从坐标(200,200)移动到了(400,500),动画结束后保持该图片在此位置,当对该图片进行了事件监听,并进行点击时,在该位置上并无事件响应,点击的响应点还在原来的(200,200)位置。
以下的各个get方法,只需放到image.setAnimation(getXXXXX());即可独立运行
package com.hjo.myanimation;
import android.animation.ObjectAnimator;
import android.graphics.Path;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.animation.AlphaAnimation;
import android.view.animation.Animation;
import android.view.animation.AnimationSet;
import android.view.animation.AnimationUtils;
import android.view.animation.RotateAnimation;
import android.view.animation.ScaleAnimation;
import android.view.animation.TranslateAnimation;
import android.widget.ImageView;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ImageView image=(ImageView)findViewById(R.id.image);
image.setAnimation(getTranslateAnimation());
}
/**旋转动画
*
* 6个参数的方法:
float fromDegrees:旋转的开始角度。
float toDegrees:旋转的结束角度。
int pivotXType:X轴的伸缩模式,可以取值为ABSOLUTE、RELATIVE_TO_SELF、RELATIVE_TO_PARENT。
float pivotXValue:X坐标的伸缩值。
int pivotYType:Y轴的伸缩模式,可以取值为ABSOLUTE、RELATIVE_TO_SELF、RELATIVE_TO_PARENT。
float pivotYValue:Y坐标的伸缩值。
4个参数的方法:
旋转起始角度
旋转结束角度
后两个为旋转中心
*/
public RotateAnimation getRotateAnimation(){
RotateAnimation animation= new RotateAnimation(0,180, Animation.RELATIVE_TO_SELF,0.5f,
Animation.RELATIVE_TO_SELF,0.5f);
animation.setFillAfter(true);//设置动画结束后保留当前状态
animation.setDuration(2000);//动画持续时间
// animation.setRepeatMode(ValueAnimation.RESTART);//重复类型有两个值,取值为ValueAnimation.RESTART时,表示正序重新开始,当取值为ValueAnimation.REVERSE表示倒序重新开始。
// animation.setStartOffset(2000);//调用start函数之后等待开始运行的时间,单位为毫秒
// animation.setZAdjustment(300);//表示被设置动画的内容运行时在Z轴上的位置(top/bottom/normal),默认为normal
animation.startNow();
animation.setRepeatCount(3);//设置重复次数 这里的次数是从0开始计数的 即设置为2时执行了3次 设置为INFINITE表示无限循环
return animation;
}
/**位移动画
* 参数说明:
* formXDelta: 表示X的起始值
* toXDelta:X得结束值
* fromYDelta:Y的起始值
* toYDelta:Y得结束值
*/
public TranslateAnimation getTranslateAnimation(){
TranslateAnimation animation=new TranslateAnimation(-200,300,0,400);
animation.setDuration(2000);
animation.setFillAfter(true);
animation.setRepeatCount(2);
animation.startNow();
return animation;
}
/**缩放动画
* float fromX 动画起始时 X坐标上的伸缩尺寸
float toX 动画结束时 X坐标上的伸缩尺寸
float fromY 动画起始时Y坐标上的伸缩尺寸
float toY 动画结束时Y坐标上的伸缩尺寸
int pivotXType 动画在X轴相对于物件位置类型
float pivotXValue 动画相对于物件的X坐标的开始位置
int pivotYType 动画在Y轴相对于物件位置类型
float pivotYValue 动画相对于物件的Y坐标的开始位置
*
* @return
*/
public ScaleAnimation getScaleAnimation(){
ScaleAnimation animation=new ScaleAnimation(0,2,0,2);
animation.setDuration(2000);
animation.setFillAfter(true);
animation.setRepeatCount(2);
animation.startNow();
return animation;
}
/**透明度动画 使用在淡入淡出
* 参数说明:
* 透明度的起始值 比如0.1
* 透明度的结束值 比如1 1表示不透明
*
* @return
*/
public AlphaAnimation getAlphaAnimation(){
AlphaAnimation animation=new AlphaAnimation(0,1);
animation.setDuration(2000);
animation.setFillAfter(true);
animation.setRepeatCount(2);
animation.startNow();
return animation;
}
/**动画集合 可以将以上各种动画结合到一起实现
* 在这里可以设置以上动画的不同次数来达到其他动画结束后还执行某次动画
* 例如:以上其他动画结束后到达的位置还要多执行一次旋转动画
* @return
*/
public AnimationSet getAnimationSet(){
AnimationSet animationSet=new AnimationSet(true);
animationSet.addAnimation(getRotateAnimation());
animationSet.addAnimation(getTranslateAnimation());
animationSet.addAnimation(getScaleAnimation());
animationSet.addAnimation(getAlphaAnimation());
animationSet.setFillAfter(true);
animationSet.startNow();
return animationSet;
}
}
另外,动画事件也提供了相应的监听回调:
animation.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
}
@Override
public void onAnimationRepeat(Animation animation) {
}
});
以上是一种动态的视图动画的写法,在Android中更提倡的是在res/anim/下设置一个xml文件来创建动画,如:
<?xml version="1.0" encoding="utf-8"?>
<setxmlns:androidsetxmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@[package:]anim/interpolator_resource"
android:shareInterpolator=["true" | "false"] ]]>
<alpha
android:fromAlpha="float"
android:toAlpha="float"/>
<scale
android:fromXScale="float"
android:toXScale="float"
android:fromYScale="float"
android:toYScale="float"
android:pivotX="float"
android:pivotY="float"/>
<translate
android:fromXDelta="float"
android:toXDelta="float"
android:fromYDelta="float"
android:toYDelta="float"/>
<rotate
android:fromDegrees="float"
android:toDegrees="float"
android:pivotX="float"
android:pivotY="float"/>
<set]]>
...
</set>
</set>
以上的 alpha 、scale、translate、rotate对应的就是视图动画的四种类型,set对应的就是动画集合。在Android代码中进行调用时也很简单,如下:
Animation animation= AnimationUtils.loadAnimation(this,R.anim.animation_name);
view.startAnimation(animation);