写点什么

Android 自定义控件开发入门与实战(4)属性动画,kotlin 语言特性

作者:嘟嘟侠客
  • 2021 年 11 月 27 日
  • 本文字数:2466 字

    阅读完需:约 8 分钟

}


@Override


public void onAnimationEnd(Animator animation) {


v.setVisibility(View.INVISIBLE);


}


@Override


public void onAnimationCancel(Animator animation) {


}


@Override


public void onAnimationRepeat(Animator animation) {


}


});


}


private void closeMenu() {


doAnimationClose(mItemButton1, 0, 5, 300);


doAnimationClose(mItemButton2, 1, 5, 300);


doAnimationClose(mItemButton3, 2, 5, 300);


doAnimationClose(mItemButton4, 3, 5, 300);


doAnimationClose(mItemButton5, 4, 5, 300);


}


private void doAnimationClose(View v, int index, int total, int radius) {


if (v.getVisibility() != View.VISIBLE) {


v.setVisibility(View.VISIBLE);


}


double degree = Math.PI * index / ((total - 1) * 2);


int translationX = (int) -(radius * Math.sin(degree));


int translationY = (int) -(radius * Math.cos(degree));


AnimatorSet set = new AnimatorSet();


set.playTogether(ObjectAnimator.ofFloat(v, "translationX", translationX, 0),


ObjectAnimator.ofFloat(v, "translationY", translationY, 0),


ObjectAnimator.ofFloat(v, "scaleX", 1f, 0f),


ObjectAnimator.ofFloat(v, "scaleY", 1f, 0f),


ObjectAnimator.ofFloat(v, "alpha", 1, 0));


set.setDuration(500).start();


}


Animator 的 XML 实现


在 XML 中有 Animator 对应的三个标签


  1. < animator />:对应 ValueAnimator

  2. < objectAnimator />:对应 ObjectAnimator

  3. < set />:对应 AnimatorSet


要将动画放在 res/animator 下:



这些值得定义为:



第四章、属性动画进阶




这一章开始就有很多我没有学过的知识啦。


4.1 PropertyValuesHolder 与 KeyFrame


ValueAnimator 和 ObjectAnimator 除了上述那些创建 Animator 实例的函数意外。还都有一个函数:


public static ValueAnimator ofPropertyValuesHolder(PropertyValuesHolder.....values)


public static ObjectAnimator ofPropertyValuesHolder(Object target,PropertyValuesHolder...values)


两个 Animator 都有这个函数,但一般而言,ValueAnimator 使用的情况并不多,所以我们就看下 ObjectAnimator 中的 ofPropertyValuesHolder。


ofPropetyValuesHolder


其含义就是:保存了动画过程中所需的操作和对应的值。我们通过 ofFloat 构造的动画,ofFloat 函数的内部实现其实就是将传入的参数封装成 PropetyValuesHolder 实例来保存动画状态的。在封装成实例之后,后期的各种操作也是由 ofPropetyValuesHolder 为主的。


所以 ObjectAnimator 通过暴露出 PropertyValuesHolder 方法,我们就可以用它来构造动画。


通过 PropetyValuesHolder 实例的函数有以下几个:


public static PropertyValuesHolder ofFloat(String propertyName,float.....values);


public static PropertyValuesHolder ofInt(String propertyName,int.....values);


public static PropertyValuesHolder ofObject(String propertyName,TypeEvaluator evaluator,Object.....values);


public static PropertyValuesHolder ofKeyframe(String propertyName,Keyframe....values);


  1. 关于 PropertyValuesHolder 的 ofFloat 和 ofInt


就比 ObjectAnimator 中的 ofFloat 和 ofInt 少一个 target


  1. 关于将 PropertyValuesHolder 设置到 ObjectAnimator 中


ObjectAnimator 有个暴露的方法,所以我们可以将构造好的 PropertyValuesHolder 实例加入进去


ObjectAnimator.ofPropertyValuesHolder(Object target,PropertyValuesHolder ....values)


如果传入多个实例,就会在 targert 上同时做多个操作。


关于 PropertyValuesHolder 的 ofObject 除了要加一个 TypeEvaluator 也差不多~


Keyframe


想要控制动画速率的变化,可以通过自定义插值器,也可以通过自定义 Evaluator 来实现。但如果真的让我们为了速率变化而自定义插值器或者 Evaluator,因为要设计数学知识,所以也不简单,Google 为我们定义了一个 Keyframe 类,直译就是关键帧。


跟 flash 中的那个一样~


生成方式为:


public static Keyframe ofFloat(float fraction,float value)


fraction 为当前进度,value 为动画当前所在的位置的值。


比如 Keyframe.ofFloat(0,0)表示动画进度为 0 的时候,动画所在的位置数值为 0


Keyframe.ofFloat(0.25f,-20f),表示动画进度为 25 的时候,动画所在的位置数值为-20.


在理解 Keyframe.ofKeyframe 函数的参数后,我们来看 PropertyValuesHolder 是如何使用 Keyframe 对象的。


public static PropertyHolder ofKeyframe(String propertyName,Ketframe .... values)


所以使用完成的 Keyframe 代码如下:


Keyframe frame0 = Keyframe.ofFloat(0f,0);


Keyframe frame1 = Keyframe.ofFloat(0.1f,-20f);


Keyframe frame2 = Keyframe.ofFloat(1,0);


PropertyValuesHolder holder = PropertyValuesHolder.ofKeyframe("rotation",frame0,frame1,frame2);


Animator animator = ObjectAnimator.ofPropertyValuesHolder(mImage,frameHolder);


animator.setDuration(1000);


animator.start();

小福利:

在当下这个碎片化信息环境的时代,很多资源都可以在网络上找到,只取决于你愿不愿意找或是找的方法对不对了


很多朋友不是没有资料,大多都是有几十上百个 G,但是杂乱无章,不知道怎么看从哪看起,甚至是看后就忘


如果大家觉得自己在网上找的资料非常杂乱、不成体系的话,我也分享一套给大家,比较系统,我平常自己也会经常研读。


2021 大厂最新 Android 面试真题解析



各个模块学习视频:如数据结构与算法



只有系统,有方向的学习,才能在段时间内迅速提高自己的技术。




这份体系学习笔记,适应人群:**第一,**学习知识比较碎片化,没有合理的学习路线与进阶方向。**第二,**开发几年,不知道如何进阶更进一步,比较迷茫。第三,到了合适的年纪,后续不知道该如何发展,转型管理,还是加强技术研究。如果你


《Android 学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》

【docs.qq.com/doc/DSkNLaERkbnFoS0ZF】 完整内容开源分享


有需要,我这里恰好有为什么,不来领取!说不定能改变你现在的状态呢!点赞+评论即可获得!


本文已被CODING开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》收录

用户头像

嘟嘟侠客

关注

还未添加个人签名 2021.03.19 加入

还未添加个人简介

评论

发布
暂无评论
Android自定义控件开发入门与实战(4)属性动画,kotlin语言特性