Android 自定义控件开发入门与实战(4)属性动画,kotlin 语言特性
}
@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 对应的三个标签
< animator />:对应 ValueAnimator
< objectAnimator />:对应 ObjectAnimator
< 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);
关于 PropertyValuesHolder 的 ofFloat 和 ofInt
就比 ObjectAnimator 中的 ofFloat 和 ofInt 少一个 target
关于将 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】 完整内容开源分享
有需要,我这里恰好有为什么,不来领取!说不定能改变你现在的状态呢!点赞+评论即可获得!
评论