并且从源码中可以看出, isRepaintBoundary
只有 get
,所以它只能被子类 override
,由子类表明是否是为重绘的边缘,比如 RenderProxyBox
、RenderView
、RenderFlow
等 RenderObject
的 isRepaintBoundary
都是 true。
所以如果一个区域绘制很频繁,且可以不影响父控件的情况下,其实可以将 override isRepaintBoundary
为 true。
3、Layer
上文我们知道了,当 isRepaintBoundary
为 true 时,那么该区域就是一个可更新绘制区域,而当这个区域形成时, 其实就会新创建一个 Layer
。
不同的 Layer
下的 RenderObject
是可以独立的工作,比如 OffsetLayer
就在 RenderObject
中用到,它就是用来做定位绘制的。
同时这也引生出了一个结论:不是每个 RenderObject
都具有 Layer
的,因为这受 isRepaintBoundary
的影响。
其次在 RenderObject
中还有一个属性叫 needsCompositing
,它会影响生成多少层的 Layer
,而这些 Layer
又会组成一棵 Layer Tree 。好吧,到这里又多了一个树,实际上这颗树才是所谓真正去给引擎绘制的树。
到这里我们大概就了解了 RenderObject
的整个绘制流程,并且这个绘制时机我们是去“触发”的,而不是主动调用,并且更新是判断区域的。 嗯~有点 React 的味道!
二、Slider 控件的绘制实现
前面我们讲了那么多绘制的流程,现在让我们从 Slider
这个控件的源码,去看看一个绘制控件的设计实现吧。
整个 Slider
的实现可以说是很 Flutter
了,大体结构如下图。
在 _RenderSlider
中,除了 手势 和 动画 之外,其余的每个绘制的部分,都是独立的 Component 去完成绘制,而这些 Component 都是通过 SliderTheme
的 SliderThemeData
提供的。
巧合的是,SliderTheme
本身就是一个 InheritedWidget
。看过以前篇章的同学应该会知道, InheritedWidget
一般就是用于做状态共享的,所以如果你需要自定义 Slider
,完成可以通过 SliderTheme
嵌套,然后通过 SliderThemeData
选择性的自定义你需要的模块。
并且如下图,在 _RenderSlider
中注册时手势和动画,会在监听中去触发 markNeedsPaint
方法,这就是为什么你的触摸能够响应画面的原因了。
同时可以看到 _SliderRender
内的参数都重写了 get
、 set
方法, 在 set
时也会有 markNeedsPaint()
,或者调用 _updateLabelPainter
去间接调用 markNeedsLayout
。
至于 Slider
内的各种 Shape 的绘制这里就不展开了,都是 Canvas
标准的 pathTo
、drawRect
、translate
、drawPath
等熟悉的操作了。
自此,第九篇终于结束了!(///▽///)
资源推荐
- Github : github.com/CarGuo/
- 开源 Flutter 完整项目:github.com/CarGuo/GSYG…
- 开源 Flutter 多案例学习型项目: github.com/CarGuo/GSYF…
- 开源 Fluttre 实战电子书项目:github.com/CarGuo/GSYF…
完整开源项目推荐:
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!
AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算
b前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算**