Android动画一之帧动画frame
即就是连续播放一张一张的图片,形成的动画
代码:
在res目录下创建一个drawable文件夹 , 将需要播放的图片放到里面 , 再创建一个anim.xml文件
<animation-list
xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="false">
<item android:drawable="@drawable/drawable1" android:duration="200"/>
<item android:drawable="@drawable/drawable2" android:duration="200"/>
<item android:drawable="@drawable/drawable3" android:duration="200"/>
<item android:drawable="@drawable/drawable4" android:duration="200"/>
<item android:drawable="@drawable/drawable5" android:duration="200"/>
<item android:drawable="@drawable/drawable6" android:duration="200"/>
<item android:drawable="@drawable/drawable7" android:duration="200"/>
<item android:drawable="@drawable/drawable8" android:duration="200"/>
<item android:drawable="@drawable/drawable7" android:duration="200"/>
<item android:drawable="@drawable/drawable8" android:duration="200"/>
</animation-list>
动画使用
ImageView rocketImage = (ImageView) findViewById(R.id.iv);
//给iv设置背景图片资源
rocketImage.setBackgroundResource(R.drawable.anim);
//获取iv上面的图片资源
AnimationDrawable rocketAnimation = (AnimationDrawable) rocketImage.getBackground();
//开始播放动画
rocketAnimation.start();
Android动画二之补间动画tween
即就是从开始状态到结束状态的过渡动画
1.位移
public void translate(View v) {
/*
* 参数1,参数3,参数5,参数7: 设置参照点的方式(相对自己)Animation.RELATIVE_TO_SELF
* 参数2:x轴起始移动的位置 (0表示原图位置左上角x轴的坐标)
* 参数4:x轴停止移动的位置(2表示移动原图宽度的两倍)
* 参数6:y轴起始移动的位置 (0表示原图位置左上角y轴的坐标)
* 参数8:y轴停止移动的位置(2表示移动原图高度的两倍)
*/
TranslateAnimation tras = new TranslateAnimation(
Animation.RELATIVE_TO_SELF, 0, Animation.RELATIVE_TO_SELF, 2,
Animation.RELATIVE_TO_SELF, 0, Animation.RELATIVE_TO_SELF, 2);
// 设置显示时间长度
tras.setDuration(1000);
// 设置重复次数
tras.setRepeatCount(2);
// 设置动画重复的模式
tras.setRepeatMode(Animation.REVERSE);
//停止在结束状态
tras.setFillAfter(true);
//开始动画
mImageView.startAnimation(tras);
}
2.旋转
public void rotate(View v) {
/*
* 参数1:旋转的起始角度
* 参数2:旋转的终止角度
* 参数3:旋转中心的x轴取值参照方式
* 参数4:中心点x轴的取值(0.5f表示相对与原图的0.5倍)
* 参数5:旋转中心的y轴取值参照方式
* 参数6:中心点y轴的取值(0.5f表示相对与原图的0.5倍)
*/
RotateAnimation rotate = new RotateAnimation(
360, 0,Animation.RELATIVE_TO_SELF,
0.5f, Animation.RELATIVE_TO_SELF,0.5f);
// 设置显示时间长度
rotate.setDuration(2000);
// 设置重复次数
rotate.setRepeatCount(2);
// 设置动画重复的模式
rotate.setRepeatMode(Animation.REVERSE);
// 在ImageView上播放动画
mImageView.startAnimation(rotate);
}
3.缩放
public void scale(View v) {
/*
* 参数1:x方向起始大小(1f表示原图大小)
* 参数2:x方向终止大小(0.2f表示原图的0.2倍)
* 参数3:y方向起始大小(1f表示原图大小)
* 参数4:y方向终止大小(0.2f表示原图的0.2倍)
* 参数5:缩放中心点x轴取值的参照方式
* 参数6: 中心点x轴的取值(0.5f表示相对与原图的0.5倍)
* 参数7:缩放中心点y轴取值参照方式
* 参数8:中心点y轴的取值(0.5f表示相对与原图的0.5倍)
*/
ScaleAnimation rotate = new ScaleAnimation(
4f, 0.2f, 4f, 0.2f,
Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
// 设置显示时间长度
rotate.setDuration(2000);
// 设置重复次数
rotate.setRepeatCount(2);
// 设置动画重复的模式
rotate.setRepeatMode(Animation.RESTART);
// 在ImageView上播放动画
mImageView.startAnimation(rotate);
}
4.透明度
public void alpha(View v){
/*
* 第一个参数fromAlpha:动画起始时的透明度
* 第二个参数toAlpha: 动画结束时的透明度
*/
Animation alpha = new AlphaAnimation(0f, 1f);
// 设置显示时间长度
alpha.setDuration(2000);
// 设置重复次数
alpha.setRepeatCount(2);
// 设置动画重复的模式
alpha.setRepeatMode(Animation.REVERSE);
// 在ImageView上播放动画
mImageView.startAnimation(alpha);
}
Android动画三之属性动画(在3.0版本以后引入)
为什么要使用属性动画?
因为进行运动时改变了图片的坐标,需要获取图片的当前的坐标或者需要点击当前的图片,所有要使用属性动画
public class MainActivity extends Activity {
private ImageView mImageView;
private ObjectAnimator objectAnimator4;
private ObjectAnimator objectAnimator3;
private ObjectAnimator objectAnimator2;
private ObjectAnimator objectAnimator1;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mImageView = (ImageView) findViewById(R.id.iv);
}
// 位移
public voidtranslate(View v) {
objectAnimator1 = ObjectAnimator.ofFloat(mImageView, "translationY", 0, 80, 20, 90, 100);
// 动画播放时长
objectAnimator1.setDuration(2000);
// 动画重复的次数
objectAnimator1.setRepeatCount(2);
// 动画播放模式
objectAnimator1.setRepeatMode(ObjectAnimator.REVERSE);
// 开始播放动画
objectAnimator1.start();
}
// 透明度
public void alpha(View v) {
objectAnimator2 = ObjectAnimator.ofFloat(mImageView, "alpha", 0, 1, 0.5f, 0.1f, 1);
// 动画播放时长
objectAnimator1.setDuration(2000);
// 动画重复的次数
objectAnimator1.setRepeatCount(2);
// 动画播放模式
objectAnimator1.setRepeatMode(ObjectAnimator.REVERSE);
// 开始播放动画
objectAnimator2.start();
}
// 缩放
public void scale(View v) {
objectAnimator3 = ObjectAnimator.ofFloat(mImageView, "scaleX", 1, 0, 0.5f, 2);
// 动画播放时长
objectAnimator1.setDuration(2000);
// 动画重复的次数
objectAnimator1.setRepeatCount(2);
// 动画播放模式
objectAnimator1.setRepeatMode(ObjectAnimator.REVERSE);
// 开始播放动画
objectAnimator3.start();
}
// 旋转
public voidrotate(View v) {
objectAnimator4 = ObjectAnimator.ofFloat(mImageView, "rotation", 45, 90, 180);
// 动画播放时长
objectAnimator4.setDuration(3000);
// 动画重复的次数
objectAnimator4.setRepeatCount(2);
// 动画播放模式
objectAnimator4.setRepeatMode(ObjectAnimator.REVERSE);
// 开始播放动画
objectAnimator4.start();
}
// 动画合集
public void fly(View v) {
AnimatorSet as = new AnimatorSet();
// 一个装逼,一个飞 顺序的播放一个动画
// as.playSequentially(objectAnimator1,objectAnimator2,objectAnimator3,objectAnimator4);
// 一起装逼,一起飞
as.playTogether(objectAnimator1, objectAnimator2, objectAnimator3, objectAnimator4);
as.setDuration(2000);
as.setTarget(mImageView);
as.start();
}
}
特别注意:
当我们执行动画结束之后,如果我们设置啦setFillAfter为true时,动画执行完后,设置其属性的隐藏与显示都是无效的,,原因是setFillAfter为true是让其属性保持在最后一帧,如果要让setVisibily有效,那么就需要将其动画清除掉,即就是调用clearAnimation()方法清除掉动画;