android 自定义View进阶学习-对TapBarMenu的源码分析(上)
来源:互联网 发布:java上传图片到ftp 编辑:程序博客网 时间:2024/06/06 03:20
最近看了《android开发艺术探索》中的几个关于自定义View的章节,感到知识点有点多,而且书上最后自定义View的例子比较初级,于是我就找到一个最近用过的TapBarMenu的源码试着分析,巩固学习成果。 首先在构造器中调用init方法如下:
private void init(AttributeSet attrs) { setWillNotDraw(false); setupAttributes(attrs); setGravity(Gravity.CENTER); setupAnimators(); setupPaint(); }); }
setupAttrirbutes方法初始化view的各种属性。其中
if (typedArray.hasValue(R.styleable.TapBarMenu_tbm_iconOpened)) { iconOpenedDrawable = typedArray.getDrawable(R.styleable.TapBarMenu_tbm_iconOpened); } else { iconOpenedDrawable = ResourcesCompat.getDrawable(getContext(), R.drawable.icon_animated); }
意思为如果用户在xml中设置了tbm_iconOpened属性,则加载用户的布局,若没设置,则加载默认的布局icon_animatedsetupAnimators方法加载动画所需的ValueAnimator,他通过定义一个ValueAnimator数组,在addUpdateListener的onAnimationUpdate方法实时更新view轮廓尺寸。最后通过AnimatorSet将ValueAnimator组合起来。
setupPaint方法初始化画笔,定义颜色。
其次在onAttachedToWindow方法中调用setupMenuItems方法,setupMenuItems中初始化Menu中的按钮,Menu关闭时,设GOES,打开时,设VISIBLE 。onAttachedToWindow在Draw过程之前调用。
然后是toggle方法,此方法用户用java代码在menu点击时调用,通过state标志值调用open或close.
open与close实现相似,我们以open为例。
public void open() { state = State.OPENED; showIcons(true); animator[LEFT].setFloatValues(button[LEFT], 0); animator[RIGHT].setFloatValues(button[RIGHT], width); animator[RADIUS].setFloatValues(button[RADIUS], 0); animator[TOP].setFloatValues(button[TOP], 0); animator[BOTTOM].setFloatValues(button[BOTTOM], height); animatorSet.cancel(); animatorSet.start(); if (iconOpenedDrawable instanceof Animatable) { ((Animatable) iconOpenedDrawable).start(); } ViewGroup parentView = (ViewGroup) TapBarMenu.this.getParent(); this.animate() .y(menuAnchor == MENU_ANCHOR_BOTTOM ? parentView.getBottom() - height : 0) .setDuration(animationDuration) .setInterpolator(DECELERATE_INTERPOLATOR) .start(); }
首先设置状态值。然后调用了showIcons方法,此方法通过动画显示menu内部的子view。接着利用ValueAnimator数组开始动画,而后调用iconOpenedDrawable的View动画(定义在res/anim中)。最后调用menu的ViewPropertyAnimator改变menu的大小。
至此TapBarMenu开关动画原理介绍完毕。下一篇我们分析其绘制原理。
阅读全文
1 0
- android 自定义View进阶学习-对TapBarMenu的源码分析(上)
- android源码分析之View的事件分发(上)
- android-进阶(3)-自定义view(2)-Android中View绘制流程以及相关方法的分析
- Android上一个类似PathMenu效果的自定义View源码分析
- Android 自定义View进阶
- Android 自定义View进阶
- Android 进阶学习:Android自定义View的实现方法,带你一步步深入了解View(四)
- Android 进阶学习:Android自定义View的实现方法,带你一步步深入了解View(四)
- Android自定义View之常用工具源码分析
- Android 自定义 View 之 onLayout 源码分析
- Android自定义View之常用工具源码分析
- Android View绘制流程(结合源码分析)上
- android View绘制源码分析(上)
- HenCoder Android 开发进阶:自定义 View 1-4 Canvas 对绘制的辅助
- android-进阶(3)-自定义view(1)
- Android自定义View(二)进阶
- Android自定义View(进阶篇)
- Android进阶之自定义view(一)
- 原型链
- Mybatis绑定错误的原因
- Qt 之QDialog的模态与非模态
- vivado使用自带IP核和创建自己定义的IP核
- scrapy:使用response.follow()方法时出现AttributeError: 'HtmlResponse' object has no attribute 'follow'
- android 自定义View进阶学习-对TapBarMenu的源码分析(上)
- 2016年蓝桥杯C&C++程序设计本科B组
- H-Find The Multiple
- 安装node和vue-cli 并从GitHub上下载vue开源项目 并运行
- 欢迎使用CSDN-markdown编辑器
- 在虚拟机上基于Redhat Linux6.5的oracle 12c安装过程
- 高级网络配置
- 2017省赛热身赛总结
- 蓝桥杯 算法训练 表达式计算 JAVA