Android 进阶学习(十七) android 动画学习
2020-12-29 本文已影响0人
Tsm_2020
又到了一年的年终,最近公司新增加了一套新的埋点方案,虽然没有什么难度,但是写起来真是醉生梦死,差不多写了半个月吧,大部分功能算是完事了,今天继续我们的学习旅程,
Android 动画分类
1.帧动画
代码
<animation-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@mipmap/search_tjjp" android:duration="300"></item>
<item android:drawable="@mipmap/search_tongji" android:duration="300"></item>
<item android:drawable="@mipmap/search_wdzyk" android:duration="300"></item>
<item android:drawable="@mipmap/search_xlxx" android:duration="300"></item>
<item android:drawable="@mipmap/search_yjxcd" android:duration="300"></item>
<item android:drawable="@mipmap/search_ywxl" android:duration="300"></item>
<item android:drawable="@mipmap/search_zhgl" android:duration="300"></item>
<item android:drawable="@mipmap/search_zj" android:duration="300"></item>
<item android:drawable="@mipmap/search_zjjl" android:duration="300"></item>
<item android:drawable="@mipmap/search_zycx" android:duration="300"></item>
<item android:drawable="@mipmap/search_zyhb" android:duration="300"></item>
</animation-list>
我们只需要让imageview 引用这个动画就可以了
iv_1.setImageResource(R.drawable.anim_list);
AnimationDrawable animationDrawable1 = (AnimationDrawable) iv_1.getDrawable();
animationDrawable1.start();
效果图
GIF 2020-12-29 16-30-40.gif
帧动画的逻辑就是加载所有图片,然后逐帧的将它播放出来,使用起来没有什么难度,但是图片不能太大,也不用区分的太细,比较浪费内存
2.补间动画 Animation
GIF 2020-12-29 16-32-11.gif补间动画可以实现控件的移动和缩放,通常用在打开activity和dialog 中,从图片中可以看到虽然控件移动了,但是我们点击控件最后的位置是不可以触发点击事件的,我们点击控件初始位置是可以触发点击事件的,类似是投射一个影子,并不是真正的移动,其实控件还在原来的位置
使用方法,java 代码
animation = new TranslateAnimation(0f,200f,0f,200f);
animation.setDuration(2000);
animation.setFillAfter(true);
animation.setRepeatCount(0);
animation.setRepeatMode(Animation.RESTART);
iv_image_top.startAnimation(animation);
同时我们还可以创建xml文件
<?xml version="1.0" encoding="utf-8"?>
<translate
xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="2000"
android:fromXDelta="0"
android:fromYDelta="0"
android:toXDelta="100%"
android:toYDelta="100%"
android:fillAfter="true"/>
现在只是使用一种动画,如果想要嵌套多个动画则需要使用set
<?xml version="1.0" encoding="utf-8"?>
<set xmlns: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>
3.属性动画 Animator
GIF 2020-12-29 16-37-38.gif属性动画的点击事件时随着控件移动而移动的,点击原有位置是没有作用的,属性动画的实质是通过数值的变化来改变属性,也就是ValueAnimator 的应用
使用方法
private void startAnimator() {
ObjectAnimator alphaAnim = ObjectAnimator.ofFloat(iv_image_top, "alpha", 1.0f, 0.5f, 0.8f, 1.0f);
ObjectAnimator scaleXAnim = ObjectAnimator.ofFloat(iv_image_top, "scaleX", 0.0f, 2.0f);
ObjectAnimator scaleYAnim = ObjectAnimator.ofFloat(iv_image_top, "scaleY", 0.0f, 2.0f);
ObjectAnimator rotateAnim = ObjectAnimator.ofFloat(iv_image_top, "rotation", 0, 360);
ObjectAnimator transXAnim = ObjectAnimator.ofFloat(iv_image_top, "translationX", 100, 400);
ObjectAnimator transYAnim = ObjectAnimator.ofFloat(iv_image_top, "translationY", 100, 750);
AnimatorSet set = new AnimatorSet();
set.playTogether(alphaAnim, scaleXAnim, scaleYAnim, rotateAnim, transXAnim, transYAnim);
set.setDuration(3000);
set.start();
}
上面我们实现的水平和垂直方向的平移,既然是通过数值来改变属性,我们如何自义定变换方法呢,
ValueAnimator animator=ValueAnimator.ofObject(new TypeEvaluator() {
@Override
public Object evaluate(float fraction, Object startValue, Object endValue) {
return null;
}
},0,1);
这个方法就是改变value的方法,fraction 的意思就是从初始值变了多少
xml 使用方法
<objectAnimator
android:propertyName="x"
android:duration="500"
android:valueTo="400"
android:valueType="intType"/>