global position
观察,
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的更多相关文章
- MRPT笔记——使用编译好的MRPT库建立VS2013项目
接着上一篇<MRPT在VS2013中的配置>,下面接收如何使用编译好的MRPT建立工程项目. 一.设置环境变量 上一篇中,配置MRPT时,使用到了几个相关库,opencv.zlib.wxW ...
- [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/ ...
- JQ弹出框移动-插件分享~~~
<script src="js/jQuery8.3.js" type="text/javascript"></script> <s ...
- 【异构计算】OpenCL矩阵转置
介绍 矩阵转置,主要的技巧还是利用好local memory ,防止local memory,以及glabol memory的读取尽量是合并读写. 完整代码一: main.cpp代码 #include ...
- 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 ...
- AGV
AGV AGV是(Automated Guided Vehicle)的缩写,意即“自动导引运输车”,是指装备有电磁或光学等自动导引装置,它能够沿规定的导引路径行驶,具有安全保护以及各种移载功能的运输车 ...
- Gmapping笔记
2D-slam 激光slam: 开源代码的比较HectorSLAM Gmapping KartoSLAM CoreSLAM LagoSLAM 作者:kint_zhao 原文:https://blog. ...
- QT 窗口拖拽移动实现
我们知道,要实现窗口移动可以直接鼠标点住窗口的标题栏实现拖拽移动,这是窗口默认的行为,在QT中的事件响应函数为moveEvent. 但是现实中经常需要鼠标点住窗口客户区域实现窗口的拖拽移动,代码实现如 ...
- GPS定位基本原理浅析
位置服务已经成为越来越热的一门技术,也将成为以后所有移动设备(智能手机.掌上电脑等)的标配.而定位导航技术中,目前精度最高.应用最广泛的,自然非GPS莫属了.网络上介绍GPS原理的专业资料很多,而本文 ...
随机推荐
- pymysql装饰器封装
pymysql装饰器封装 def openClose(fun): def run(sql=None): coon =pymysql.connect(host='localhost' ,port=330 ...
- 【spring源码学习】spring事务中的嵌套事务中的保存点相关知识
JDBC事务保存点(setSavepoint, releaseSavepoint )实例 以下是使用事务教程中描述的setSavepoint和回滚的代码示例. 此示例代码是基于前面章节中完成的环境和数 ...
- 【maven】命令
一.maven打包命令 mvn打包,并指定 Profiles配置文件 和 模块名 mvn clean package {-P prod} -pl {groupId}:{artifactId} -am ...
- Android如何屏蔽home键和recent键
最近在做一个项目的时候,进入一个 Activity后需要暂时屏蔽掉home键和recent键(back键可以在onKeyDown里面处理),网上找了半天,都是针对旧版本android的方法,andro ...
- java中ExecutorService使用多线程处理业务
ExecutorService executorService = Executors.newFixedThreadPool(5); List<CancelApprovalCallable> ...
- 650. Find Leaves of Binary Tree
class Solution { public: vector<vector<int>> findLeaves(TreeNode* root) { vector<vect ...
- scrapy爬虫案例:问政平台
问政平台 http://wz.sun0769.com/index.php/question/questionType?type=4 爬取投诉帖子的编号.帖子的url.帖子的标题,和帖子里的内容. it ...
- abd shell的相关命令
http://adbshell.com/commands/adb-shell-pwd adb shell pwd adb shell rm -rf /sdcard/DCIM/
- java多线程(四)死锁
1.1. 什么是死锁 多线程以及多进程改善了系统资源的利用率并提高了系统的处理能力.然而,并发执行也带来了新的问题--死锁. 所谓死锁是指多个线程因竞争资源而造成的一种僵局(互相等待),若无外力作用, ...
- 搭建FTP(win10版)以及基本FTP操作
参考链接:https://www.jianshu.com/p/ece21421e246 一.FTP服务器搭建 控制面板 - 程序和功能 - 启动或关闭Windows功能 启动以下功能: 搜索 “Int ...