Flutter自定义圆盘取色器
作者:风向决定发型M 发布时间:2023-07-05 23:55:43
标签:Flutter,取色器
本文实例为大家分享了Flutter自定义圆盘取色器的具体代码,供大家参考,具体内容如下
下面展示一些 内联代码片。
圆盘取色器
效果图
完整代码
import 'dart:math';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
class CircularColorFinder extends StatefulWidget {
Color color;
double size;
double thumbSize;
ValueChanged<Color> onColorChange;
ValueChanged<Color> onColorChangeEnd;
CircularColorFinder({Key key,this.color,this.size=300,this.thumbSize=25,this.onColorChange,this.onColorChangeEnd}) : super(key: key);
@override
_CircularColorFinderState createState() => _CircularColorFinderState();
}
class _CircularColorFinderState extends State<CircularColorFinder> {
Offset topPosition;
Offset center;
Offset position;
Offset currentOffset;
double radians = 0;
double radius;
double hue = 0;
Color color;
@override
void initState() {
// TODO: implement initState
super.initState();
radius = widget.size/2;
color = Colors.white;
topPosition = Offset(0, widget.size/2);
center = Offset(widget.size/2, widget.size/2);
position = Offset(widget.size/2, widget.size/2);
currentOffset = Offset(widget.size/2, widget.size/2);
}
@override
Widget build(BuildContext context) {
return Container(
alignment: Alignment.center,
width: widget.size+40,
height: widget.size+40,
child: Stack(
children: [
Container(
width: widget.size+40,
height: widget.size+40,
alignment: Alignment.center,
child: GestureDetector(
onPanDown: onPanDown,
onPanUpdate: onPanUpdate,
onPanEnd: onPanEnd,
child: Container(
alignment: Alignment.center,
width: widget.size,
height: widget.size,
child: Stack(
alignment: Alignment.center,
children: [
Transform.rotate(
angle:pi,
child: CustomPaint(
painter: CircularColorPainter(
color: color,
center: center,
radius: radius,
),
child: Container(
alignment: Alignment.center,
width: widget.size,
height: widget.size,
),
),
),
Row(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: [
Column(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: [
Icon(Icons.wb_sunny_sharp,color: Color.fromRGBO(183, 202, 208, 1.0)),
Text('Warm',style: TextStyle(color: Color.fromRGBO(183, 202, 208, 1.0)),),
Text('White',style: TextStyle(color: Color.fromRGBO(183, 202, 208, 1.0)),),
],
),
SizedBox(width: 15,),
Column(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: [
Icon(Icons.brightness_2_sharp,color: Color.fromRGBO(183, 202, 208, 1.0)),
Text('Cool',style: TextStyle(color: Color.fromRGBO(183, 202, 208, 1.0)),),
Text('White',style: TextStyle(color: Color.fromRGBO(183, 202, 208, 1.0)),),
],
),
],
),
],
),
),
),
),
Thumb(
// top: 0,
// left: 0,
top: currentOffset.dy+20,
left: currentOffset.dx+20,
thumbSize:widget.thumbSize,
color: color,
),
],
),
);
}
///获取象限
static int getQuadrant(double x, double y, double size) {
if (x >= size / 2) {
return y >= size / 2 ? 3 : 4;
}
return y >= size / 2 ? 2 : 1;
}
onPanDown(DragDownDetails details){
change(details);
widget.onColorChange(color);
}
onPanUpdate(DragUpdateDetails details){
change(details);
widget.onColorChange(color);
}
onPanEnd(DragEndDetails details){
widget.onColorChangeEnd(color);
}
change(details){
setState(() {
position = Offset(details.localPosition.dx, details.localPosition.dy);
});
double cosA;
double x = (sqrt(pow((topPosition.dx - center.dx), 2) + pow((topPosition.dy - center.dy), 2)));
double y = (sqrt(pow((position.dx - center.dx), 2) + pow((position.dy - center.dy), 2)));
double z = (sqrt(pow((topPosition.dx - position.dx), 2) + pow((topPosition.dy - position.dy), 2)));
cosA = (x * x + y * y - z * z) / (2 * x * y);
int quadrant = getQuadrant(position.dx, position.dy, center.dx*2);
radians = acos(cosA);
if (quadrant == 1 || quadrant == 4) {
radians = acos(cosA);
} else if (quadrant == 2 || quadrant == 3) {
radians = 2 * pi - acos(cosA);
}
hue = 360*radians/(2*pi);
// print('radians:${radians} hue:${hue}');
color = HSVColor.fromAHSV(1, hue, 1, 1).toColor();
if(y<=center.dx){
currentOffset = Offset(details.localPosition.dx, details.localPosition.dy);
}else{
double dx = position.dx - center.dx;
double dy = position.dy - center.dy;
double distance = sqrt(dx * dx + dy * dy);
double ratio = radius / distance;
currentOffset = Offset(dx * ratio + center.dx, dy * ratio + center.dy);
}
if(y<=center.dx/2){
if(position.dx<widget.size/2){
color =Color.fromRGBO(255, 225, 178, 1.0);
}else{
color = Color.fromRGBO(220, 244, 255, 1.0);
}
}
}
}
class CircularColorPainter extends CustomPainter {
Color color;
double radius;
Offset center;
List<Color> colorList;
CircularColorPainter({this.color,this.center,this.radius});
@override
void paint(Canvas canvas, Size size) {
Paint _paint = Paint()
..style = PaintingStyle.fill
..strokeWidth = 1
..color = Colors.black;
Paint _paint2 = Paint()
..style = PaintingStyle.fill
..strokeWidth = 1
..color = Colors.black;
Paint _paint3 = Paint()
..style = PaintingStyle.stroke
..strokeWidth = 1
..color = Colors.black;
Paint _paint4 = Paint()
..style = PaintingStyle.fill
..strokeWidth = 0
..color = Color.fromRGBO(color.red, color.green, color.blue, 0.3);
colorList = [Color(0xFFFF0000),Color(0xFFFFFF00),Color(0xFF00FF00),Color(0xFF00FFFF),Color(0xFF0000FF),Color(0xFFFF00FF),Color(0xFFFF0000),];
Gradient gradient = SweepGradient(
startAngle: 0,
endAngle: 2 * pi,
colors: colorList.map((e) => e).toList(),
);
_paint4..maskFilter = MaskFilter.blur(BlurStyle.outer, 30);
canvas.drawArc(Rect.fromLTWH(0, 0, radius * 2, radius * 2), -pi / 2, pi * 2, false, _paint4);
var rect = Rect.fromLTWH(0, 0, radius * 2, radius * 2);
_paint.shader = gradient.createShader(rect);
canvas.drawCircle(center, radius, _paint);
var rect2 = Rect.fromLTWH(radius/2, radius/2, radius, radius);
_paint2.color = Color.fromRGBO(255, 225, 178, 1.0);
canvas.drawArc(rect2, -pi/2, pi, true, _paint2);
_paint2.color = Color.fromRGBO(220, 244, 255, 1.0);
canvas.drawArc(rect2, pi/2, pi, true, _paint2);
canvas.drawCircle(center, radius/2, _paint3);
_paint3.color = Colors.grey;
canvas.drawLine(Offset(radius,radius/2), Offset(radius,radius+radius/2), _paint3);
}
@override
bool shouldRepaint(CustomPainter oldDelegate) {
return true;
}
}
class Thumb extends StatelessWidget {
const Thumb({
Key key,
@required double top,
@required double thumbSize,
@required double left,
@required Color color,
}) : _top = top,
_Thumbsize = thumbSize,
_left = left,
_color = color,
super(key: key);
final double _top;
final double _Thumbsize;
final double _left;
final Color _color;
@override
Widget build(BuildContext context) {
return Positioned(
top: _top - _Thumbsize / 2,
left: _left - _Thumbsize / 2,
child: GestureDetector(
child: Container(
// width: 50.0,
child: Icon(
Icons.circle,
color: _color == null ? Colors.white : _color,
size: _Thumbsize,
),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(300),
boxShadow: [
BoxShadow(
blurRadius: 0.1, //阴影范围
spreadRadius: 0.001, //阴影浓度
color: Colors.white, //阴影颜色
),
],
),
),
),
);
}
}
来源:https://blog.csdn.net/weixin_43758044/article/details/120724946
0
投稿
猜你喜欢
- 前言我们在 页面切换转场动画,英雄救场更有趣!介绍了 Hero 动画效果,使用 Hero 用于转场能够提供非常不错的体验。既然称之
- 本文实例讲述了Android+SQLite数据库实现的生词记事本功能。分享给大家供大家参考,具体如下:主activity命名为Dict:代码
- 前言本文的记录如何用CustomPaint、GestureDetector实现一个进度条控件。首先需要说明的是 flutter Materi
- SharedPreferences介绍:SharedPreferences是Android平台上一个轻量级的存储类,主要是保存一些常用的配置
- 一、前言在Spring中,事务有两种实现方式:编程式事务管理: 编程式事务管理使用TransactionTemplate可实现更细
- 一、百度百科Sentinel 是面向分布式服务架构的高可用流量防护组件,主要以流量为切入点,从限流、流量整形、熔断降级、系统负载保护、热点防
- 前言在电商的应用中,最常见的就是在首页或完成某事件之后,弹出一堆的活动/广告。假如重叠弹出,很丑,给用户的体验也不好,所以一般都会依次依条件
- yaml语法注解配置文件两种形式application.properties和.yaml第一种语法 key=value第二种key:空格va
- 什么是异步?为什么要用它?异步编程提供了一个非阻塞的,事件驱动的编程模型。 这种编程模型利用系统中多核执行任务来提供并行,因此提供了应用的吞
- 已知两个链表list1和list,2,各自非降序排列,将它们合并成另外一个链表list3,并且依然有序,要求保留所有节点。实现过程中,lis
- 背景在接口请求过程中,传递json对象,springboot转换为实体VO对象后,所有属性都为null。post请求:后台接收请求:当时就懵
- 本文实例讲述了C#实现对Json字符串处理方法,分享给大家供大家参考。具体分析如下:一般对于web应用开发人员来说对Json字符串都会很熟悉
- 概述:App几乎都离不开与服务器的交互,本文主要讲解了flutter网络请求三种方式 flutter自带的HttpClient、 第三方库h
- 目标效果: 点击动画按钮之后每张牌各自旋转 散开到屏幕上半部分的任意位置之后回到初始位置 比较像LOL男刀的技能动画 : )1: 创建卡牌对
- 背景大家在使用Selenium + Chromedriver爬取网站信息的时候,以为这样就能做到不被网站的反爬虫机制发现。但是实际上很多参数
- /// <summary> /// 遍历Co
- 好久没有做web了,JSON目前比较流行,闲得没事,所以动手试试将对象序列化为JSON字符(尽管DotNet Framework
- 本文主要介绍我为桌面和 Web 设计的一个超级秘密 Flutter 项目使用了画布和可拖动节点界面。本教程将展示我如何使用堆栈来使用小部件完
- 实现方案:我们直接参考实例代码:private String pattern = "((http|ftp
- 本文实例讲述了C#获取网页源代码的方法。分享给大家供大家参考。具体如下:public string GetPageHTML(string u