Android动画有三大类(视图动画、帧动画、属性动画【3.0引进】)
为了就是让人机交互更加友好,(讲的高大上一点更容易被关注!)
合理的使用动画能让用户获得更加愉悦的使用体验!你懂的很愉悦!
android已经写好了一些动画可以方便的使用例如『透明度』『旋转』『缩放』『位移』
1.视图动画(View Animation)
- 做过Flash的都会知道补间动画,给出两个关键帧,通过一些算法将给定属性值在给定的时间内在两个关键帧间渐变。
- 可以给一个View同时设置多个动画(AnimationSet,AnimatorSet),比如从透明至不透明的淡入效果,与从小到大的放大效果,这些动画可以同时进行,也可以在一个完成之后开始另一个。
- Android中提供了 AlphaAnimation、RotateAnimation、TranslateAnimation、ScaleAnimation看名字就应该知道对应上面所述的几个动画它们的用法也很简单
//透明动画 其他动画同理 换一下参数给指定的view启动动画就实现了
AlphaAnimation aa=new AlphaAnimation(0f,1f);
aa.setDuration(2000);
view.startAnimation(aa);
在此我不一一赘述代码。。因为我懒,而且推荐大家自己看看里面的属性,会懂得更多
释放你的求知欲吧!!
动画还需要监听一些事情比如开始、结束、是否重复等等
aa.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
}
@Override
public void onAnimationRepeat(Animation animation) {
}
});
1.X 接下来我们在介绍中提到AnimationSet
这个类做动画一般来说会比较常用,因为它控制了多个动画一起动还是队列的动,通俗来讲就是你先动还是我先动,或者说大家一起动起来~! 好像很Happy的样子
其实就是这个类内部维护了一个List<Animation> AnimationSet继承于Animation
同样简单动画可以用XML实现,在我们目录里可以新建一个anim的文件夹,里面可以放一个根为「set」的 原理是一样的
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<alpha
android:fromAlpha="0.3"
android:toAlpha="0.5"></alpha>
<rotate
android:fromDegrees="0"
android:pivotX="50%"
android:pivotY="50%"
android:toDegrees="180"/>
<scale
android:fromXScale="0.5"
android:fromYScale="0.5"
android:pivotX="50%"
android:pivotY="50%"
android:toXScale="1"
android:toYScale="1"/>
<translate
android:fromXDelta="50%"
android:fromYDelta="50%"
android:toXDelta="100%"
android:toYDelta="100%"/>
</set>
使用AnimationUtils.loadAnimation(this,R.anim.sad)加载
(吐槽一下我打样子输入法无限给我杨紫你说这么黑好么!!!)
AnimationSet set=new AnimationSet(true);
set.addAnimation(aa);//加进去就好了 注意内存小心OOM 和内存泄露
set.setFillAfter(true);//保持结束动画的样子,setFillBefore你懂的
set.setDuration(5000);
view.startAnimation(set);
- 对于内存要有借有还,再借不难
2.帧动画(Frame Animation)
度娘说
- 动画是通过把人物的表情、动作、变化等分解后画成许多动作瞬间的画幅,再用摄影机连续拍摄成一系列画面,给视觉造成连续变化的图画。它的基本原理与电影、电视一样,都是视觉暂留原理。医学证明人类具有“视觉暂留”的特性,人的眼睛看到一幅画或一个物体后,在0.34秒内不会消失。利用这一原理,在一幅画还没有消失前播放下一幅画,就会给人造成一种流畅的视觉变化效果。
结论就是 动画标准是一秒24帧,也就是24张画面组成一秒。电视播放标准是25帧每秒。
- 那么就很好理解啦,1秒大概24幅图片!!!
用AS的在drawable中新建一个xml
<?xml version="1.0" encoding="utf-8"?>
<animation-list
xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="true"
>
<!--
根标签为animation-list,其中oneshot代表着是否只展示一遍,设置为false会不停的循环播放动画
根标签下,通过item标签对动画中的每一个图片进行声明
android:duration 表示展示所用的该图片的时间长度
-->
<item android:drawable="@drawable/icon1" android:duration="150"></item>
<item android:drawable="@drawable/icon2" android:duration="150"></item>
<item android:drawable="@drawable/icon3" android:duration="150"></item>
<item android:drawable="@drawable/icon4" android:duration="150"></item>
<item android:drawable="@drawable/icon5" android:duration="150"></item>
<item android:drawable="@drawable/icon6" android:duration="150"></item>
</animation-list>
在activity中用一下即可
view.setImageResource(R.drawable.icon);
AnimationDrawable ad = (AnimationDrawable) view.getDrawable();
ad.start();
当然你可以手动添加图片帧
ad.addFrame(@NonNull Drawable frame, int duration)
3.属性动画(Property Animation)
- 属性动画有 ObjectAnimator、ValueAnimator,常用的还是ObjectAnimator继承于ValueAnimator
AnimatorSet animatorSet = new AnimatorSet();///创建属性动画集
animatorSet.playTogether(///“playTogether”表示所有的子动画同时运作
ObjectAnimator.ofFloat(view, "rotationX", 0, 360),
ObjectAnimator.ofFloat(view, "rotationY", 0, 180),
ObjectAnimator.ofFloat(view, "rotation", 0, -90),
ObjectAnimator.ofFloat(view, "translationX", 0, 90),
ObjectAnimator.ofFloat(view, "translationY", 0, 90),
ObjectAnimator.ofFloat(view, "scaleX", 1, 1.5f),
ObjectAnimator.ofFloat(view, "scaleY", 1, 0.5f),
ObjectAnimator.ofFloat(view, "alpha", 1, 0.25f, 1)
);
animatorSet.setDuration(5 * 1000).start();
- 同样Animator也可以写XML来实现
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:ordering="sequentially">
<objectAnimator
android:duration="3000"
android:propertyName="rotationX"
android:repeatCount="infinite"
android:repeatMode="reverse"
android:startOffset="0"
android:valueFrom="0"
android:valueTo="360"
android:valueType="intType" />
</set>
AnimatorSet set = (AnimatorSet) AnimatorInflater.loadAnimator(getApplicationContext(), R.animator.property_animator);
set.setTarget(mView);//设置一下要动的目标View
set.start();
一般监听有
ObjectAnimator.ofArgb().addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
//动画开始
}
@Override
public void onAnimationEnd(Animator animation) {
//动画结束
}
@Override
public void onAnimationCancel(Animator animation) {
//动画取消
}
@Override
public void onAnimationRepeat(Animator animation) {
//重复动画
}
});
ObjectAnimator.ofFloat(view, "alpha", 1, 0.25f, 1).addUpdateListener(new ValueAnimator
.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
//动画值更新通过 animation.getAnimatedValue()取得
//这个更新值能让我们做一些规律动画
}
});
总结
- AnimationSet 与 AnimatorSet 最大的不同在于,AnimationSet 使用的是 Animation 子类、AnimatorSet 使用的是 Animator 的子类。
Animation 是针对视图外观的动画实现,动画被应用时外观改变但视图的触发点不会发生变化,还是在原来定义的位置。
Animator是针对视图属性的动画实现,动画被应用时对象属性产生变化,最终导致视图外观变化。
- 这一章讲了一个动画大概,下一章一起看看自定义动画和场景动画还有现在的流行的SVG动画