导读
- 移动开发知识体系总章(Java基础、Android、Flutter)
- Android 动画的分类及介绍
- Android中的属性动画(Property Animation)
- Android中的逐帧动画(Drawable Animation)
- Android中的基础动画 属性动画(Property Animation)
- Android中的视图动画总结
Android中的视图动画(View Animation)(View动画、补间动画)
在Android 动画的分类及介绍说到在Android1.0版本的时候就有了,Tween动画一般直接作用页面中的 View 上,实现基本的动画效果:平移、旋转、缩放、透明度、或前几者的组合,基本效果如下:
由于Tween动画的特性被属性动画完美替代,故此,这里就不过多的进行展开,并且Tween动画作用于视图整体,只需设定初始状态(关键帧)和结束状态(关键帧),中间的状态(变化过程)则由系统计算计算并补齐**,由此可见Tween动画的使用核心就是设置开始状态和结束状态。
对应的代码(效果对应上述GIF):
RotateAnimation(旋转动画)
private void showRotateAnimation () {
tv2Title.setText("RotateAnimation 旋转动画");
RotateAnimation rotate = new RotateAnimation(0f, 360f,
Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
LinearInterpolator lin = new LinearInterpolator();
rotate.setInterpolator(lin);
rotate.setDuration(3000);
rotate.setRepeatCount(-1);
tv2Show.setAnimation(rotate);
}
TranslateAnimation(平移动画)
private void showTranslateAnimation () {
tv3Title.setText("TranslateAnimation 平移动画");
Animation translateAnimation = new TranslateAnimation(0, 500, 0, 0);
translateAnimation.setDuration(3000);
translateAnimation.setRepeatCount(-1);
tv3Show.startAnimation(translateAnimation);
}
ScaleAnimation(缩放动画)
private void showScaleAnimation() {
tv4Title.setText("ScaleAnimation 缩放动画");
Animation scaleAnimation = new ScaleAnimation(0, 2, 0, 2,
Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
scaleAnimation.setDuration(3000);
scaleAnimation.setRepeatCount(-1);
tv4Show.startAnimation(scaleAnimation);
}
AlphaAnimation(透明度动画)
private void showAlphaAnimation () {
tv5Title.setText("AlphaAnimation 透明度动画");
Animation alphaAnimation = new AlphaAnimation(1, 0);
alphaAnimation.setDuration(3000);
alphaAnimation.setRepeatCount(-1);
tv5Show.startAnimation(alphaAnimation);
}
AnimationSet (动画集合)
private void showAnimationSet() {
tv7Title.setText("组合 动画");
AnimationSet setAnimation = new AnimationSet(true);
setAnimation.setRepeatMode(Animation.RESTART);
setAnimation.setRepeatCount(1);
Animation rotate = new RotateAnimation(0, 360,
Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
rotate.setDuration(1000);
rotate.setRepeatMode(Animation.RESTART);
rotate.setRepeatCount(Animation.INFINITE);
Animation translate = new TranslateAnimation(TranslateAnimation.RELATIVE_TO_PARENT, -0.5f,
TranslateAnimation.RELATIVE_TO_PARENT, 0.5f,
TranslateAnimation.RELATIVE_TO_SELF, 0
, TranslateAnimation.RELATIVE_TO_SELF, 0);
translate.setDuration(10000);
Animation alpha = new AlphaAnimation(1, 0);
alpha.setDuration(3000);
alpha.setStartOffset(7000);
Animation scale1 = new ScaleAnimation(1, 0.5f, 1, 0.5f,
Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
scale1.setDuration(1000);
scale1.setStartOffset(4000);
setAnimation.addAnimation(alpha);
setAnimation.addAnimation(rotate);
setAnimation.addAnimation(translate);
setAnimation.addAnimation(scale1);
tv7Show.startAnimation(setAnimation);
}
这里就不贴上展示效果了。
Android中的视图动画总结
先看看,旋转动画和透明度动画构造函数:
public RotateAnimation(float fromDegrees, float toDegrees, int pivotXType, float pivotXValue, int pivotYType, float pivotYValue) {... }
public AlphaAnimation(float fromAlpha, float toAlpha) {... }
旋转动画的构造函数中需要fromDegrees、toDegrees参数,即旋转开始的角度和旋转结束的角度
透明度动画的构造函数中需要fromAlpha、toAlpha参数,即开始动画时的透明度和结束时的透明度
再看平移动画、缩放动画的构造函数:
public TranslateAnimation(float fromXDelta, float toXDelta, float fromYDelta, float toYDelta) {...}
public ScaleAnimation(float fromX, float toX, float fromY, float toY,
int pivotXType, float pivotXValue, int pivotYType, float pivotYValue) {...}
平移动画的构造函数中需要fromXDelta、toXDelta、fromYDelta、toYDelta参数,即移动开始时的坐标,和结束时的坐标
缩放度动画的构造函数中需要pivotXType、pivotXValue、pivotYType、pivotYValue参数,即缩放开始时的坐标,和结束时的坐标
果然应对了前面说的View动画作用于视图整体,只需设定初始状态(关键帧)和结束状态(关键帧),中间的状态(变化过程)则由系统计算计算并补齐**,由此可见View动画的使用核心就是设置开始状态和结束状态。
无论是设置坐标系,还是设置透明度,都是设置了开始和结束的状态,中间变化的过程由系统补齐。
当然,Tween动画还有很多方法,比如上面通用的:
xxxAnimation.setDuration(3000);////设置动画持续时间
xxxAnimation.setRepeatCount(-1);//设置重复次数
xxxView.startAnimation(xxxAnimation);//开启动画
以及动画监听
alphaAnimation.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {}
@Override
public void onAnimationEnd(Animation animation) {}
@Override
public void onAnimationRepeat(Animation animation) { }
});
最后,Tween动画还有许许多多的方法,由于Tween动画可被属性动画完美替代,就不再继续深入。Tween动画的xml方式后续会在补上