android5.0 renderthread对应用层影响的分析
来源:互联网 发布:阿里云1m带宽慢不慢 编辑:程序博客网 时间:2024/05/19 18:45
最近听公司同事分享了一个android5.0新特性的介绍,其他的和本人负责模块相关性不大,没有特别关注,但是有一条比较有兴趣,就是renderthread的引入。说是终于能异步跑动画了,主线程堵塞不会导致动画卡了
流程和之前的完全一样,这个和renderthread没有关系。
view parent的ValueAnimator.AnimatorUpdateListener为空;
view parent的Animator.AnimatorListener为空;
view开启硬件加速,目前的android 4.4默认是开启硬件加速的;
view parent的hasActions()返回为false,这个函数我没有详细研究。
当四个条件都满足时,就使用renderthread渲染动画。
ViewPropertyAnimator使用线程渲染还是有很多限制的,但是其实可以直接用RenderNodeAnimator,因为它本身就是一个Animator
public class RenderNodeAnimator extends Animator
使用它就可以解决属性动画不能设置Listener等限制。
昨天从ftp上下了android5.0的源码,赶快看下renderthread到底对app的动画有啥影响。
1.最早的动画方式Animation
通过View.startAnimation(Animation animation)流程和之前的完全一样,这个和renderthread没有关系。
2.属性动画ViewPropertyAnimator
private void startAnimation() { if (mRTBackend != null && mRTBackend.startAnimation(this)) { return; } ....}第一行代码就和renderthread建立了关系
/** * A RenderThread-driven backend that may intercept startAnimation */ private ViewPropertyAnimatorRT mRTBackend;mRTBackend类型为ViewPropertyAnimatorRT ,该类就是java层与renderthread建立关系的类。
/** * @return true if ViewPropertyAnimatorRT handled the animation, * false if ViewPropertyAnimator needs to handle it */ public boolean startAnimation(ViewPropertyAnimator parent) { cancelAnimators(parent.mPendingAnimations); if (!canHandleAnimator(parent)) { return false; } doStartAnimation(parent); return true; }canHandleAnimator是判断view是否可以启用renderthread,有四个条件:
view parent的ValueAnimator.AnimatorUpdateListener为空;
view parent的Animator.AnimatorListener为空;
view开启硬件加速,目前的android 4.4默认是开启硬件加速的;
view parent的hasActions()返回为false,这个函数我没有详细研究。
当四个条件都满足时,就使用renderthread渲染动画。
ViewPropertyAnimatorRT.doStartAnimation(ViewPropertyAnimator parent)
private void doStartAnimation(ViewPropertyAnimator parent) RenderNodeAnimator animator = new RenderNodeAnimator(property, finalValue); ... animator.start(); ...}创建了RenderNodeAnimator 对象并启动动画,最终在java层的最后
private void doStart() { mState = STATE_RUNNING; nStart(mNativePtr.get(), this); ...}通过jni调用C层的代码。java层的代码流程到此结束。
3.RenderNodeAnimator
ViewPropertyAnimator使用线程渲染还是有很多限制的,但是其实可以直接用RenderNodeAnimator,因为它本身就是一个Animator
public class RenderNodeAnimator extends Animator
使用它就可以解决属性动画不能设置Listener等限制。
总结:
使用Animation和之前的流程一样,运行在主线程队列,没有享受renderthread的机制;使用属性动画可以享用rt的机制,但是有限制,如不能有设置AnimatorListener;想完全替代以前的动画,还是用RenderNodeAnimator 重写吧。本文完全是看代码分析的结果,我这里还没有5.0的机器验证,如有错误敬请指正。 0 0
- android5.0 renderthread对应用层影响的分析
- 内核处理信号对应用层堆栈的影响
- Android5.0 源码分析--- Launcher启动应用的过程
- 3G对应用的影响
- Android5.0中Binder机制相关的native层的Parcel分析
- Android5.0 MTk Camera HAL层代码分析
- Android5.0框架层短信接收过程分析
- 应用层对SOCKET层的需求
- android5.0版本对.so文件适配的简单测试分析
- Log4J对应用性能的影响
- Log4J对应用性能的影响
- MrSID对GIS应用的影响
- 移动应用对商业生态的影响
- dex2oat对应用启动性能的影响
- 感受VMware NAT对应用层协议的影响(配置guest机FTP server蛋疼实录)
- Ajax 对Web性能的影响分析
- 油价上涨对中国经济的影响分析
- 手把手教你Tiny4412 Android5.0 定制 按下开发板上的按键通过广播发送到应用层
- 12_3
- Exception while invoking! org.apache.thrift.protocol.TProtocolException: Bad version in readMessageB
- 漏斗模型的头脑风暴
- 深入浅出DDoS攻击防御--攻击篇
- POJ3259 Wormholes 【SPFA判断负环】
- android5.0 renderthread对应用层影响的分析
- 判断点是否在多边形内(包括在多边形上)的一个算法
- Apache 多路复用模块(MPMs) - Prefork, Worker, Event
- Java中获取键盘输入值的三种方法
- 计算矩阵边缘元素之和
- Understanding Bootstrap Of Oracle Database
- "Modern C++"为什么采用泛型编程
- ubuntu缩短终端路径名称显示
- 关于banana PI代理商深圳市乐美客科技有限公司(lemaker)严重违法行为的严正声明