Android自定义控件开发入门与实战(5)KeyFrame和ViewPropertyAnimator,Android插件化入门指南

本文介绍了Android中的ViewPropertyAnimator、ObjectAnimator和LayoutTransition三种动画API的性能差异、用途和适用场景,特别强调了LayoutTransition在处理ViewGroup动画时的优越性。同时提到了兼容性库NineOldAndroids作为备选解决方案。
摘要由CSDN通过智能技术生成

关于其别的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会更加便捷。

ViewGroup内的组件添加


我佛了…昨天敲了一个小时,最后忘记保存去跑步了,然后一个小时白敲了…QAQ…

Viewgroup动画就是对Viewgroup内部的子控件做动画效果。

比如一个listview在的每个item在每次进场、退场、添加、删除时使用的动画,上述的那些动画很难实现出来。

实现ViewGroup的动画有四个

  1. layoutAnimation标签和LayoutAnimationController

API 1引入,子控件进场、退场都可以做动画,但是添加控件后,新的控件不能做出动画效果

  1. gridLayoutAnimation标签和GridLayoutAnimationController

API 1引入,作用于GridView,优缺点和上述一样。

  1. android:animateLayoutChanges属性

API 11引入,是解决上述两个动画的问题而出现的,可以在添加新控件后,新控件依然有动画,缺点是动画不能自定义。

  1. LayoutTransition

API 11引入,解决上述的所有问题。

综上所述,LayoutTransition是最强的。

第三个 android:animateLayoutChanges设置为true时,可以带来动画,但是是系统默认的,如果我们想要实现自定义动画那就得使用LayoutTranstition。

LayoutTransition使用的三个步骤

  1. 创建实例

LayoutTransition transition = new LayoutTransition();

  1. 创建动画并进行设置

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);

  1. 将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) {

}

@Override

public void endTransition(LayoutTransition transition, ViewGroup container, View view, int transitionType) {

}

});

上面四个参数分别是 LayoutTransition实例、ViewGrop父容器、View 当前所做动画的子控件、transitionType就是刚刚讲的那四个类型。

开源动画库NineOldAndroids


这是Android 3.0推出的全新的Animation API,使用起来很方便,但是不能再3.0一下版本中使用。NineOldAndroids是一个可以再任意Android版本上使用的AnimationAPI,和Android3.0中的API类似。

常用的有ObjectAnimator、ValueAnimator、AnimatorSet、PropertyValuesHolder、Keyframe、ViewPropertyAnimator和ViewHelper。

前面的那一堆都和Android 官方API是对应的,只是包名换成了 com.nineoldandroids.animation。ViewPropertyAnimator和官方API只有一点点出入。只有LayoutTransition只在官方API才有。

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

尾声

如果你想成为一个优秀的 Android 开发人员,请集中精力,对基础和重要的事情做深度研究。

对于很多初中级Android工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。 整理的这些架构技术希望对Android开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。

这里,笔者分享一份从架构哲学的层面来剖析的视频及资料给大家梳理了多年的架构经验,筹备近6个月最新录制的,相信这份视频能给你带来不一样的启发、收获。

Android进阶学习资料库

一共十个专题,包括了Android进阶所有学习资料,Android进阶视频,Flutter,java基础,kotlin,NDK模块,计算机网络,数据结构与算法,微信小程序,面试题解析,framework源码!

大厂面试真题

PS:之前因为秋招收集的二十套一二线互联网公司Android面试真题 (含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)

《2019-2021字节跳动Android面试历年真题解析》

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

oid扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)

[外链图片转存中…(img-OxqT6xS6-1712440323367)]

《2019-2021字节跳动Android面试历年真题解析》

[外链图片转存中…(img-0Y9INruT-1712440323367)]

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值