观察,

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. 华为云ARM64服务器试用

    公司同事弄了个华为云的ARM64服务器,让我帮忙部署我们的服务,所以先试用了一下. 总体感觉还行,使用的CentOS系统,yum也能用,epel源也可以用.但是SCL软件集用不了. uname -a ...

  2. 关于uboot中的属性"u-boot,dm-pre-reloc”的意义

    "u-boot,dm-pre-reloc”属性:当设置了这个属性时,则表示这个设备在重定向之前就需要使用. 当dm_init_and_scan的参数为true时,只会对带有“u-boot,d ...

  3. Xamarin.FormsShell基础教程(9)Shell相关类体系

    Xamarin.FormsShell基础教程(9)Shell相关类体系 在Shell中,最为主要的类是Shell类.Shell类实现了大多数应用程序所需的基本UI功能的页面.除此以外,常用的类还有Sh ...

  4. SNF-软件开发机器人-免费-火爆登场-程序下载及实战配套教程免费发放

    软件开发机器人不辱使命的完成了在软件开发方面的方式方法,颠覆了传统开发,可零编程开发软件,也可二开更强大功能. 为了更好的了解和理解软件开发机器人我们以模拟用友u8系统部分供应链程序为例进行模拟. 联 ...

  5. Superset配置mysql数据源

    1.添加mysql数据源 测试连接的时候遇到 No module named 'MySQLdb'" 安装mysqlclient pip install mysqlclient 如果遇到 ER ...

  6. LeetCode_453. Minimum Moves to Equal Array Elements

    453. Minimum Moves to Equal Array Elements Easy Given a non-empty integer array of size n, find the ...

  7. 【嵌入式开发】裸机引导操作系统和ARM 内存操作 ( DRAM SRAM 类型 简介 | Logical Bank | 内存地址空间介绍 | 内存芯片连接方式 | 内存初始化 | 汇编代码示例 )

    [嵌入式开发]ARM 内存操作 ( DRAM SRAM 类型 简介 | Logical Bank | 内存地址空间介绍 | 内存芯片连接方式 | 内存初始化 | 汇编代码示例 )     一. 内存 ...

  8. python 中的eval与exec

    eval类似exec,是使用python编译器运行表达式和语句两者区别在于:eval是编译表达式并返回值(如: eval("'hello'*2") 结果是 hellohello)e ...

  9. 1.2 lvm镜像卷

    镜像能够分配物理分区的多个副本,从而提高数据的可用性.当某个磁盘发生故障并且其物理分区变为不可用时,您仍然可以访问可用磁盘上的镜像数据.LVM 在逻辑卷内执行镜像.  系统版本: # cat /etc ...

  10. SGU 127. Telephone directory --- 模拟

    <传送门> 127. Telephone directory time limit per test: 0.25 sec. memory limit per test: 4096 KB C ...