观察,

GestureDetector(
child: CustomPaint(painter: StudyPaint(points: _points)),
onPanEnd: (DragEndDetails details)=>_points.add(null),
onPanUpdate: (DragUpdateDetails details){
var a = details.globalPosition;
RenderBox referenceBox = context.findRenderObject();
Offset localPosition = referenceBox.globalToLocal(details.globalPosition);
print('a: $a, localposition: $localPosition');
setState(() {
_points = List.from(_points)..add(localPosition);
});
},
),

  

减了3个 h

import 'package:flutter/material.dart';

main() => runApp(MyApp());

class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
// TODO: implement build
return MaterialApp(
home: HomePage(),
);
}
} class HomePage extends StatefulWidget {
@override
State<StatefulWidget> createState() {
// TODO: implement createState
return HomePageState();
}
} class HomePageState extends State<HomePage> {
List<Offset> _points = <Offset>[]; @override
Widget build(BuildContext context) {
// print(_points);
var h = MediaQuery.of(context).padding.top;
var b = MediaQuery.of(context).padding.bottom;
// print('h: $h, b: $b'); return Scaffold(
appBar: AppBar(title: Text('Painter'),),
body: Container(
width: MediaQuery.of(context).size.width, height: MediaQuery.of(context).size.height-h,
child: Stack(
children: <Widget>[
GestureDetector(
// child:
onPanEnd: (DragEndDetails details)=>_points.add(null),
onPanUpdate: (DragUpdateDetails details){
var a = details.globalPosition;
var x = Offset(a.dx, a.dy-h-h-h);
RenderBox referenceBox = context.findRenderObject();
Offset localPosition = referenceBox.globalToLocal(details.globalPosition);
// print('a: $a, x: $x, localposition: $localPosition');
setState(() {
_points = List.from(_points)..add(x);
});
},
),
CustomPaint(painter: StudyPaint(points: _points)),
],
)
),
);
}
} class StudyPaint extends CustomPainter {
StudyPaint({this.points});
List<Offset> points; @override
void paint(Canvas canvas, Size size) {
print(points);
Paint paint = Paint()
..color = Colors.blue
..strokeCap = StrokeCap.round
..isAntiAlias = true
..strokeJoin = StrokeJoin.bevel
..strokeWidth = 12.0; for(int i=0; i<points.length; i++){
if(points[i]!=null && points[i+1]!=null)
canvas.drawLine(points[i], points[i+1], paint);
} } @override
bool shouldRepaint(StudyPaint other) => other.points!=points;
}

  

import 'package:flutter/material.dart';

main() => runApp(MyApp());

class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
// TODO: implement build
return MaterialApp(
home: HomePage(),
);
}
} class HomePage extends StatefulWidget {
@override
State<StatefulWidget> createState() {
// TODO: implement createState
return HomePageState();
}
} class HomePageState extends State<HomePage> {
List<Offset> _points = <Offset>[]; @override
Widget build(BuildContext context) {
// print(_points);
var h = MediaQuery.of(context).padding.top;
print('h: $h');
return Scaffold(
appBar: AppBar(title: Text('Painter'),),
body: Center(
child: Container(
width: double.infinity, height: double.infinity,
child: GestureDetector(
child: CustomPaint(painter: StudyPaint(points: _points)),
onPanEnd: (DragEndDetails details)=>_points.add(null),
onPanUpdate: (DragUpdateDetails details){
var a = details.globalPosition;
RenderBox referenceBox = context.findRenderObject();
Offset localPosition = referenceBox.globalToLocal(details.globalPosition);
print('a: $a, localposition: $localPosition');
setState(() {
_points = List.from(_points)..add(localPosition);
});
},
),
),
),
);
}
} class StudyPaint extends CustomPainter {
StudyPaint({this.points});
List<Offset> points; @override
void paint(Canvas canvas, Size size) {
Paint paint = Paint()
..color = Colors.blue
..strokeCap = StrokeCap.round
..isAntiAlias = true
..strokeWidth = 12.0
..strokeJoin = StrokeJoin.bevel; for(int i=0; i<points.length; i++){
if(points[i]!=null && points[i+1]!=null)
canvas.drawLine(points[i], points[i+1], paint);
} } @override
bool shouldRepaint(StudyPaint other) => other.points!=points;
}

  

global position的更多相关文章

  1. MRPT笔记——使用编译好的MRPT库建立VS2013项目

    接着上一篇<MRPT在VS2013中的配置>,下面接收如何使用编译好的MRPT建立工程项目. 一.设置环境变量 上一篇中,配置MRPT时,使用到了几个相关库,opencv.zlib.wxW ...

  2. [SLAM]2D激光扫描匹配方法

    1.Beam Model 2.Likehood field for k=1:size(zt,1) if zt(k,2)>0 d = -grid_dim/2; else d = grid_dim/ ...

  3. JQ弹出框移动-插件分享~~~

    <script src="js/jQuery8.3.js" type="text/javascript"></script> <s ...

  4. 【异构计算】OpenCL矩阵转置

    介绍 矩阵转置,主要的技巧还是利用好local memory ,防止local memory,以及glabol memory的读取尽量是合并读写. 完整代码一: main.cpp代码 #include ...

  5. English trip V2 - 5 Technology Teacher:Taylor Key:adjective + preposition

    In this lesson you will learn to talk about technology and innovation. 课上内容(Lesson) What is your fav ...

  6. AGV

    AGV AGV是(Automated Guided Vehicle)的缩写,意即“自动导引运输车”,是指装备有电磁或光学等自动导引装置,它能够沿规定的导引路径行驶,具有安全保护以及各种移载功能的运输车 ...

  7. Gmapping笔记

    2D-slam 激光slam: 开源代码的比较HectorSLAM Gmapping KartoSLAM CoreSLAM LagoSLAM 作者:kint_zhao 原文:https://blog. ...

  8. QT 窗口拖拽移动实现

    我们知道,要实现窗口移动可以直接鼠标点住窗口的标题栏实现拖拽移动,这是窗口默认的行为,在QT中的事件响应函数为moveEvent. 但是现实中经常需要鼠标点住窗口客户区域实现窗口的拖拽移动,代码实现如 ...

  9. GPS定位基本原理浅析

    位置服务已经成为越来越热的一门技术,也将成为以后所有移动设备(智能手机.掌上电脑等)的标配.而定位导航技术中,目前精度最高.应用最广泛的,自然非GPS莫属了.网络上介绍GPS原理的专业资料很多,而本文 ...

随机推荐

  1. Spring Cloud Ribbon源码分析---负载均衡实现

    上一篇结合 Eureka 和 Ribbon 搭建了服务注册中心,利用Ribbon实现了可配置负载均衡的服务调用.这一篇我们来分析Ribbon实现负载均衡的过程. 从 @LoadBalanced入手 还 ...

  2. OpenCV3与深度学习实例:Dlib+VGG Face实现两张脸部图像相似度比较

    原文:https://my.oschina.net/wujux/blog/2221444 实现思路: 1.使用Dlib识别并提取脸部图像 2.使用VGG Face模型提取脸部特征 3.使用余弦相似度算 ...

  3. ERROR: type "sum" does not exist

    开发问pg中执行一个简单的语句,多次报错: > ERROR: type "sum" does not exist LINE 1: SELECT SUM ^ 看看具体的语句,其 ...

  4. .Net Core 3.0 Api json web token 中间件签权验证和 Cors 中间件处理跨域请求

    第一步:在Nuget上安装"Microsoft.AspNet.WebApi.Cors"包,并对api controller使用[EnableCors]特性以及Microsoft.A ...

  5. SQL存储实现将JSON自动转化成SQL数据列

    CREATE PROCEDURE sp_GetJsonFields ( @Json VARCHAR(MAX) ) AS BEGIN SELECT @Json=REPLACE(@Json,'{','') ...

  6. SDN实验---Ryu的应用开发(二)Learning Switch

    一:自学习交换机(二层MAC交换机)的编程思路 (一)明确问题 如何实现软件定义的自学习交换机? (二)设计解决方案 通过控制器来实现自学习交换算法,然后指导数据平面实现交换机操作 (三)确定具体的技 ...

  7. Python的网页解析库-PyQuery

    PyQuery库也是一个非常强大又灵活的网页解析库,如果你有前端开发经验的,都应该接触过jQuery,那么PyQuery就是你非常绝佳的选择,PyQuery 是 Python 仿照 jQuery 的严 ...

  8. Ipinstall软件工具-可视对讲

    Ipinstall软件工具操作说明 安居宝Ipinstall软件工具是用于联网型对讲系统中网络设备的属性及参数修改,该设备在系统中是否能正常运行,其属性和参数的设置起着决定性的作用, 然而设备的属性. ...

  9. ArcGIS Server 10.2忘记用户名密码的解决方案

    忘记了ArcGIS Server Manager的密码,可以采用以下方法进行重置. 1.找到ArcGIS Server的安装目录 D:\Program Files\ArcGIS\Server\tool ...

  10. 1-1docker加速器

    配置加速器 #编译配置 sudo vim /etc/docker/daemon.json #加入下面的数据 { "registry-mirrors": ["https:/ ...