观察,

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. 冰多多团队-第二次scrum例会

    冰多多团队-第二次Scrum会议 会议基本情况 会议时间:4月8日 19:00 - 19:30 会议地点:新主楼F座2楼沙发休息处 工作情况 团队成员 已完成任务 待完成任务 zpj Service实 ...

  2. str.replace替换变量名的字符串

    网易云课堂该课程链接地址 https://study.163.com/course/courseMain.htm?share=2&shareId=400000000398149&cou ...

  3. springboot vue前后端分离 跨跨域配置

    public class CustomCorsFilter extends OncePerRequestFilter { @Override protected void doFilterIntern ...

  4. JS的base64编码解码

    Unicode问题解法 有个小坑是它只支持ASCII. 如果你调用btoa("中文")会报错: Uncaught DOMException: Failed to execute ' ...

  5. 【jmeter】使用csv文件生成用户名和密码列表

    介绍 在[jmeter]使用jmeter进行测试-示例 中介绍了jmeter的基本使用,本文将介绍如何使用csv文件生成多个用户名. 应用场景 实际测试中,经常需要模拟多个用户进行负载测试,而用户名和 ...

  6. WSL记录

    cmder(mini版)作为wsl的终端,很好用,可以split屏.但是:千万不要在settings里面设置start up(启动) 里面设置 命令行“bash -cur_console:p1”!目前 ...

  7. docker批量删除镜像

    docker rmi `docker images | grep swb | grep -v grep | awk '{print $3}'` 参考: https://blog.csdn.net/hi ...

  8. An unexpected exception occurred while binding a dynamic operation 错误的一种情况

    这种错误,出现在dynamic传值的时候,无法动态访问变量. 出错原因是: 使用了嵌套类,class里面又定义了class

  9. java jdbc使用SSH隧道连接mysql数据库demo

    java jdbc使用SSH隧道连接mysql数据库demo   本文链接:https://blog.csdn.net/earbao/article/details/50216999   packag ...

  10. python:将时间戳格式化为yyyyMMdd hh:mm:ss

    import time #将10位时间戳或者13位转换为时间字符串,默认为2017-10-01 13:37:04格式 def timestamp_to_date(time_stamp, format_ ...