没有合适的资源?快使用搜索试试~ 我知道了~
Android动画工具类的封装实战记录
1 下载量 37 浏览量
2021-01-04
21:48:06
上传
评论
收藏 115KB PDF 举报
温馨提示
起因 最近在做一个组件化框架的封装,现在开发到一些常用工具类的封装了,突然意识到好像还没有做动画的工具类,于是开始着手开发之。 思路 既然要做动画,肯定是要做属性动画的工具类的封装了,由于补间动画和逐帧动画并不能改变目标动画主题的实际属性,在Android的开发中已经越来越少人去用这两个动画框架做开发了,而属性动画则相对的越来越广泛的使用在开发过程中了,于是这次的工具类的封装,只针对属性动画来封装。 属性动画对应的类叫做ObjectAnimator,主要就是用这个类来实现动画的一些基础设置,其具体的使用方式我就不写了,有兴趣的朋友可以自行学习属性动画的相关知识。 封装属性动画工具类不可
资源推荐
资源详情
资源评论
Android动画工具类的封装实战记录动画工具类的封装实战记录
起因起因
最近在做一个组件化框架的封装,现在开发到一些常用工具类的封装了,突然意识到好像还没有做动画的工具类,于是开始着
手开发之。
思路思路
既然要做动画,肯定是要做属性动画的工具类的封装了,由于补间动画和逐帧动画并不能改变目标动画主题的实际属性,在
Android的开发中已经越来越少人去用这两个动画框架做开发了,而属性动画则相对的越来越广泛的使用在开发过程中了,于
是这次的工具类的封装,只针对属性动画来封装。
属性动画对应的类叫做ObjectAnimator,主要就是用这个类来实现动画的一些基础设置,其具体的使用方式我就不写了,有兴
趣的朋友可以自行学习属性动画的相关知识。
封装属性动画工具类不可避免的还要考虑到属性动画的组合播放动画的需求,而属性动画的组合播放有大约三种方式:
1.使用使用AnimatorSet的的Builder来组合播放来组合播放
AnimatorSet.Builder是一个使用的动画工具类,用于方便向AnimatorSet添加动画以及设置各种动画之间的关系。在
AnimatorSet.Builder中,共声明了after(long)、after(Animator)、before(Animator)、with(Animator)等四个方法。
after(delay) 设置动画延迟delay时间后播放
after(anim) 设置在anim动画结束后播放此动画
before(anim) 设置此动画早于anim播放
with(anim) 设置此动画与anim一起播放
然后再调用paly(anim)方法来链式调用动画
AnimatorSet set=new AnimatorSet();
set.play(anim1).before(anim2).with(anim3).after(anim4);
我们注意到他是先执行的after,然后是play和with同时执行,最后执行的before。所以大家记住这个顺序,无论怎么写,都是
这个执行顺序。
2.使用使用AnimatorSet的的playSequentially
API
playSequentially(List items):添加一组动画,播放顺序为逐一播放
playSequentially(Animator… items):添加一组动画,播放顺序为逐一播放
AnimatorSet bouncer = new AnimatorSet();
ObjectAnimator objectAnimatorA = ObjectAnimator.ofFloat(btnProperty, PropertyConstant.PROPERTY_TRANSLATION_X, 0f, 300f);
ObjectAnimator objectAnimatorB = ObjectAnimator.ofFloat(btnProperty, PropertyConstant.PROPERTY_TRANSLATION_Y, 0f, 300f);
ObjectAnimator objectAnimatorC = ObjectAnimator.ofFloat(btnProperty, PropertyConstant.PROPERTY_ROTATION, 0f, 360f);
bouncer.playSequentially(objectAnimatorA, objectAnimatorB, objectAnimatorC);
bouncer.setDuration(6000);
bouncer.start();
3.使用使用AnimatorSet的的palyTogether
API
playTogether(Collection items):添加一组动画,播放顺序为一起播放
playTogether(Animator… items):添加一组动画,播放顺序为一起播放
AnimatorSet bouncer = new AnimatorSet();
ObjectAnimator objectAnimatorA = ObjectAnimator.ofFloat(btnProperty, PropertyConstant.PROPERTY_TRANSLATION_X, 0f, 300f);
ObjectAnimator objectAnimatorB = ObjectAnimator.ofFloat(btnProperty, PropertyConstant.PROPERTY_TRANSLATION_Y, 0f, 300f);
ObjectAnimator objectAnimatorC = ObjectAnimator.ofFloat(btnProperty, PropertyConstant.PROPERTY_ROTATION, 0f, 360f);
bouncer.playSequentially(objectAnimatorA, objectAnimatorB, objectAnimatorC);
bouncer.setDuration(6000);
bouncer.start();
掌握以上的知识点后,我的思路是,其实最后就是对执行方式的封装,所谓的执行方式就是如何正常的调用
play,playSequentially和playTogether三个方法,这里需要合理的封装。
还有就是对于监听接口的封装,每个ObjectAnimator都有三个接口:
Animator.AnimatorListener 对整个动画生命周期的监听
anim.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animator) {
Toast.makeText(MainActivity.this, "start", Toast.LENGTH_LONG).show();
}
@Override
public void onAnimationEnd(Animator animator) {
Toast.makeText(MainActivity.this, "End", Toast.LENGTH_LONG).show();
}
@Override
public void onAnimationCancel(Animator animator) {
Toast.makeText(MainActivity.this, "Cancel", Toast.LENGTH_LONG).show();
}
@Override
public void onAnimationRepeat(Animator animator) {
Toast.makeText(MainActivity.this, "rapeat", Toast.LENGTH_LONG).show();
}
});
anim.start();
ValueAnimator.AnimatorUpdateListener 对于该动画逐帧的监听
ValueAnimator vanim = ValueAnimator.ofInt(0,10,20);
vanim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator valueAnimator) {
//如果之前的ValueAnimtor指定的是Int的i话,那么返回的Value就是int类型,
也就是返回值类型与你创建的类型一致
int value = (int) valueAnimator.getAnimatedValue();
}
});
Animator.AnimatorPauseListener 对于该动画的暂停和播放的监听
new Animator.AnimatorPauseListener() {
@Override
public void onAnimationPause(Animator animator) {
}
@Override
public void onAnimationResume(Animator animator) {
}
}
由于我的初步构想是使用建造者模式的链式调用模式来设计我的工具类,如果按照普通的写法,那么整个监听接口的设置将会
是灾难性的,因为所有的监听接口的设置都是混乱的,所以这里必须处理,我的思路是,学习SpringSecurity的链式调用设
计,为每个类型的监听设置自己的类,然后再让工具主类调用该类型的监听接口,然后设置完毕后,在通过该监听接口类的
and()方法回到工具类的主类型来,这样在链式调用的时候就有一个起止顺序,不会混乱执行了,而且如果不用设置监听,
不调用监听类设置也不会影响主类的执行。
截取关键代码,以Play方法的监听接口设置为例:
/**
*工具类的主类
**/
public static class AnimatorSetWrap{
PlayAnimationListener playListener;
public PlayAnimationListener toAddPlayListener(){
playListener=new PlayAnimationListener(this);
return playListener;
}
}
/**
* Play方法对应的ObjectAnimator的监听实例
*/
public static class PlayAnimationListener implements IAnimatorListener<PlayAnimationListener>{
private Animator.AnimatorListener animatorListener;
private ValueAnimator.AnimatorUpdateListener updateListener;
private Animator.AnimatorPauseListener pauseListener;
public AnimatorSetWrap animatorSetWrap;
public PlayAnimationListener(AnimatorSetWrap animatorSetWrap){
this.animatorSetWrap=animatorSetWrap;
}
@Override
public PlayAnimationListener setAnimatorListener(Animator.AnimatorListener animatorListener) {
this.animatorListener=animatorListener;
return this;
}
@Override
public PlayAnimationListener setUpdateListener(ValueAnimator.AnimatorUpdateListener animatorListener) {
this.updateListener=animatorListener;
return this;
}
@Override
public PlayAnimationListener setPauseListener(Animator.AnimatorPauseListener animatorListener) {
this.pauseListener=animatorListener;
return this;
}
@Override
public AnimatorSetWrap and(){
return animatorSetWrap;
}
}
/**
* 动画监听的公用模板接口
* @param <T>
*/
interface IAnimatorListener<T>{
/**
* 设置AnimatorListener的方法
* @param listener
* @return
*/
T setAnimatorListener(Animator.AnimatorListener listener);
/**
* 设置AnimatorUpdateListener的方法
* @param listener
* @return
*/
T setUpdateListener(ValueAnimator.AnimatorUpdateListener listener);
/**
* 设置AnimatorPauseListener的方法
* @param listener
* @return
*/
T setPauseListener(Animator.AnimatorPauseListener listener);
/**
* 桥接动画监听与动画工具类的方法
* @return
剩余14页未读,继续阅读
资源评论
weixin_38583278
- 粉丝: 5
- 资源: 886
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 2024年手机号段归属地-517152.rar
- 社区物资交易互助平台 基于Spring Boot框架实现的社区物资交易互助平台 (程序+数据库+报告)
- 使用 RRT* 和最小抖动轨迹生成进行四轴飞行器路径规划+C++项目源码+文档说明+代码注释
- 小马哥教程片段之汇编语言核心概念图解与常用指令详解
- 在线无人机规划框架-用于在先前未知的环境中生成安全、动态可行的轨迹(自主四旋翼飞行器的贝塞尔轨迹生成)+项目源码+文档说明+注释
- 基于AT89C51单片机的智能化水塔水位控制系统设计与实现(毕业论文设计)
- 主动磁轴承市场报告2024
- 【Unity 天气系统插件】Enviro 3 - Sky and Weather 高度可定制的云、雾和光照系统
- 智能电机市场报告2024-2030
- B.10-本科毕业生对学校的满意度分析.pdf
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功