| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 移动开发 -> [译] 用 Flutter 打造一个圆形滑块(Slider),缓存架构技术 -> 正文阅读 |
|
[移动开发][译] 用 Flutter 打造一个圆形滑块(Slider),缓存架构技术 |
可以看到, 现在 BasePainter 的功能用法已经不言自明,然而 SliderPainter 却有一点儿不寻常,现在我们不仅要绘制一个圆弧而非圆,还需要绘制 Handler。 import ‘dart:math’; import ‘package:flutter/material.dart’; class SliderPainter extends CustomPainter { Offset initHandler; SliderPainter( @override Paint progress = _getPaint(color: selectionColor); center = Offset(size.width / 2, size.height / 2); canvas.drawArc(Rect.fromCircle(center: center, radius: radius), Paint handler = _getPaint(color: selectionColor, style: PaintingStyle.fill); // 绘制 handler endHandler = radiansToCoordinates(center, -pi / 2 + endAngle, radius); Paint _getPaint({@required Color color, double width, PaintingStyle style}) => @override 再一次地,我们获取了 center 和 radius 的值,但我们这次绘制的是圆弧。SliderPainter 将根据用户交互反馈的值作为 start、end 和 sweap 属性的值,以便于我们根据这些参数来绘制圆弧。值得一提的是我们需要从初始角度中减去 pi/2,因为我们的滑块的圆弧的起始位置是在圆形的正上方,而 当我们绘制好圆弧以后我们就需要准备绘制 Handler 了。为此,我们将分别绘制两个圆,一个在内部填充,一个在外部包裹。我调用了一些工具集函数用来将弧度转换为圆的坐标。你可以在 Github 仓库内查阅这些函数。 让滑块响应交互目前来看,仅仅使用 CustomPaint 以及两个 Painter 就已经足够绘制想要的东西了。然而它们还是不能够进行交互。因此就要使用 GestureDetector 来对它进行封装。这样一来我们就可以在画布上对用户事件做出相应处理。 一开始我们将为 Handler 赋初值,当获取这些 Handler 的坐标后,我们将按照以下策略执行操作:
因为我们需要分别计算出坐标值、新的角度值再传递给 Handler 和 Painter,所以我们的 CircularSliderPaint 必须是一个 StatefulWidget。 import ‘package:flutter/material.dart’; class CircularSliderPaint extends StatefulWidget { CircularSliderPaint( @override class _CircularSliderState extends State { SliderPainter _painter; /// 用弧度制表示的起始角度,用来确定 init Handler 的位置。 /// 用弧度制表示的结束角度,用来确定 end Handler 的位置。 /// 用弧度制表示的选择区间的绝对角度(夹角) @override // 我们需要使用 gesture detector 来更新此部件, @override void _calculatePaintData() { _startAngle = percentageToRadians(initPercent); _painter = SliderPainter( _onPanUpdate(DragUpdateDetails details) { var angle = coordinatesToRadians(_painter.center, position); lobalPosition); var angle = coordinatesToRadians(_painter.center, position); |
|
移动开发 最新文章 |
Vue3装载axios和element-ui |
android adb cmd |
【xcode】Xcode常用快捷键与技巧 |
Android开发中的线程池使用 |
Java 和 Android 的 Base64 |
Android 测试文字编码格式 |
微信小程序支付 |
安卓权限记录 |
知乎之自动养号 |
【Android Jetpack】DataStore |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 14:01:17- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |