ObjectAnimator anim = ObjectAnimator.ofFloat(textview,“alpha”,0f);
anim.start();
而使用ViewPropertyAnimator则提供了更加浅显易懂的API,如下:
textview.animate().alpha(0);
就变成了一行简洁的代码了
再来看下面这个,将控件移动到(50,100)
view.animate().x(50).y(100);
它有3个注意的点
-
animate():整个系统从调用View的这个animate()函数开始。
-
当这个动画被声明时,它就会被隐式的调用,是自动开始。
-
链式设置方法。每个接口方法都会返回一个ViewPropertyAnimator实例。
关于其别的API如下图所示:
其中对于像scaleX()、scaleY()等这些方法,还有其对应的 scaleXBy()… 它们的区别跟scrollTo和scrollBy的区别一样。
scaleXBy等带By的都是增量。
比如每次使用scaleX(2),目标view都是原来大小的两倍,而每次使用scaleXBy(2),增量放大两倍。
性能考量
(1)ViewPropertyAnimator并没有像ObjectAnimator一样使用反射或者JNI技术。
(2)它会根据每一个动画帧计算出对应的所有属性值,并设置给控件,然后调用一次invalidate()函数重绘,从而解决了在使用ObjectAnimator时每个属性都要单独计算单独重绘的问题。
(3)所以ViePropertyAnimator相对于ObjectAnimator和组合动画,性能有所提升。
并且在构造动画时会更加轻便。
但是ViewPropertyAnimator并不会取代属性动画。
ObjectAnimator更加的灵活、方便,可以作用在任何对象、属性上,而当需要对View的多个属性(SDK提供的,并非自定义的)进行操作时,ViewPropertyAnimator会更加便捷。
我佛了…昨天敲了一个小时,最后忘记保存去跑步了,然后一个小时白敲了…QAQ…
Viewgroup动画就是对Viewgroup内部的子控件做动画效果。
比如一个listview在的每个item在每次进场、退场、添加、删除时使用的动画,上述的那些动画很难实现出来。
实现ViewGroup的动画有四个
- layoutAnimation标签和LayoutAnimationController
API 1引入,子控件进场、退场都可以做动画,但是添加控件后,新的控件不能做出动画效果
- gridLayoutAnimation标签和GridLayoutAnimationController
API 1引入,作用于GridView,优缺点和上述一样。
- android:animateLayoutChanges属性
API 11引入,是解决上述两个动画的问题而出现的,可以在添加新控件后,新控件依然有动画,缺点是动画不能自定义。
- LayoutTransition
API 11引入,解决上述的所有问题。
综上所述,LayoutTransition是最强的。
第三个 android:animateLayoutChanges设置为true时,可以带来动画,但是是系统默认的,如果我们想要实现自定义动画那就得使用LayoutTranstition。
LayoutTransition使用的三个步骤
- 创建实例
LayoutTransition transition = new LayoutTransition();
- 创建动画并进行设置
PropertyValuesHolder pivLeft = PropertyValuesHolder.ofInt(“left”,0,0);
PropertyValuesHolder pivTop = PropertyValuesHolder.ofInt(“top”,0,0);
PropertyValuesHolder pivScaleX = PropertyValuesHolder.ofFloat(“scaleX”,1f,0f,1f);
Animator animator = ObjectAnimator.ofPropertyValuesHolder(ll,pivLeft,pivTop,pivScaleX);
transition.setAnimator(LayoutTransition.CHANGE_APPEARING,animator);
- 将LayoutTransition添加到ViewGroup中
ll.setLayoutTransition(transition);
然后设置监听事件
private void deleteView() {
if (i > 0) {
ll.removeViewAt(0);
}
i–;
}
private void addView() {
i++;
Button button = new Button(this);
button.setText(“Button”+i);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
button.setLayoutParams(params);
ll.addView(button,0);
}
就有下面的效果:
其中在setAnimator这一步中填入了参数,表示的是应用动画的对象范围:
-
APPEARING:元素在容器中出现时定义的动画
-
DISAPPEARING:元素在容器中消失时定义的动画
-
CHANGE_APPEARING:元素在添加新的元素时,其他需要变化的元素所应用的动画。
-
CHANGE_DISAPPEARING:容器某个元素消失时,其他需要变化的元素所应用的动画。
这些参数都比较好理解,一般最后两个我们平时很少用到,第一个第二个倒是会用到很多。
设置监听
LayoutTransition可以设置监听事件。
transition.addTransitionListener(new LayoutTransition.TransitionListener() {
@Override
public void startTransition(LayoutTransition transition, ViewGroup container, View view, int transitionType) {
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此我收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门**
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!