窗口 – 缩放缩放 – 获取触摸坐标
发布时间:2020-12-14 02:45:26 所属栏目:Windows 来源:网络整理
导读:我正在使用WinJS开发 Windows 8应用程序.我正在尝试获取用于捏合和缩放的触摸坐标.我已经通过Windows.UI.Input.GestureRecognizer实现了手势操作处理程序.当触发“manipupdated”事件时,我触发了我的捏合和缩放逻辑,event.delta.scale不是1.当在“manipupdat
我正在使用WinJS开发
Windows 8应用程序.我正在尝试获取用于捏合和缩放的触摸坐标.我已经通过Windows.UI.Input.GestureRecognizer实现了手势操作处理程序.当触发“manipupdated”事件时,我触发了我的捏合和缩放逻辑,event.delta.scale不是1.当在“manipupdated”事件对象内部发生操作时,我发现只有1个位置的坐标.如何根据此信息计算手指触摸坐标?
另外,我如何知道该位置属于哪个触摸坐标?我在事件对象中找到了多次重复的位置 – 在event.position和event.detail [0] .position 我想要实现的是在图表中执行捏合和缩放(很像地图).请帮我解决这些问题. 解决方法
公共类PZBehavior:行为
????{ bool _isDragging; bool _isPinching; Point _ptPinchPositionStart; private Image _imgZoom; private ScaleTransform _scaleTransform; private RotateTransform _rotateTransform; private TranslateTransform _translateTransform; private MatrixTransform _previousTransform; private TransformGroup _parentGroup; private TransformGroup _currentTransform; protected override void OnAttached() { _imgZoom = AssociatedObject; _imgZoom.RenderTransform = BuildTrasnformGroup(); var listener = GestureService.GetGestureListener(AssociatedObject); listener.DragStarted += DragStarted; listener.DragDelta += DragDelta; listener.DragCompleted += DragCompleted; listener.PinchStarted += PinchStarted; listener.PinchDelta += PinchDelta; listener.PinchCompleted += PinchCompleted; } private TransformGroup BuildTrasnformGroup() { _parentGroup = new TransformGroup(); _currentTransform = new TransformGroup(); _previousTransform = new MatrixTransform(); _scaleTransform = new ScaleTransform(); _rotateTransform = new RotateTransform(); _translateTransform = new TranslateTransform(); _currentTransform.Children.Add(_scaleTransform); _currentTransform.Children.Add(_rotateTransform); _currentTransform.Children.Add(_translateTransform); _parentGroup.Children.Add(_previousTransform); _parentGroup.Children.Add(_currentTransform); return _parentGroup; } void PinchCompleted(object sender,PinchGestureEventArgs e) { if (_isPinching) { TransferTransforms(); _isPinching = false; } } void PinchDelta(object sender,PinchGestureEventArgs e) { if (_isPinching) { // Set scaling _scaleTransform.ScaleX = e.DistanceRatio; _scaleTransform.ScaleY = e.DistanceRatio; // Optionally set rotation _rotateTransform.Angle = e.TotalAngleDelta; // Set translation Point ptPinchPosition = new Point(0,0); _translateTransform.X = ptPinchPosition.X - _ptPinchPositionStart.X; _translateTransform.Y = ptPinchPosition.Y - _ptPinchPositionStart.Y; } } void PinchStarted(object sender,PinchStartedGestureEventArgs e) { _isPinching = e.OriginalSource == _imgZoom; if (_isPinching) { // Set transform centers Point ptPinchCenter = e.GetPosition(_imgZoom); ptPinchCenter = _previousTransform.Transform(ptPinchCenter); _scaleTransform.CenterX = ptPinchCenter.X; _scaleTransform.CenterY = ptPinchCenter.Y; _rotateTransform.CenterX = ptPinchCenter.X; _rotateTransform.CenterY = ptPinchCenter.Y; _ptPinchPositionStart = new Point(0,0); } } void DragCompleted(object sender,DragCompletedGestureEventArgs e) { if (_isDragging) { TransferTransforms(); _isDragging = false; } } void DragDelta(object sender,DragDeltaGestureEventArgs e) { if (_isDragging) { _translateTransform.X += e.HorizontalChange; _translateTransform.Y += e.VerticalChange; } } void DragStarted(object sender,DragStartedGestureEventArgs e) { _isDragging = e.OriginalSource == _imgZoom; } void TransferTransforms() { _previousTransform.Matrix = Multiply(_previousTransform.Matrix,_currentTransform.Value); // Set current transforms to default values _scaleTransform.ScaleX = _scaleTransform.ScaleY = 1; _scaleTransform.CenterX = _scaleTransform.CenterY = 0; _rotateTransform.Angle = 0; _rotateTransform.CenterX = _rotateTransform.CenterY = 0; _translateTransform.X = _translateTransform.Y = 0; } Matrix Multiply(Matrix a,Matrix b) { return new Matrix(a.M11 * b.M11 + a.M12 * b.M21,a.M11 * b.M12 + a.M12 * b.M22,a.M21 * b.M11 + a.M22 * b.M21,a.M21 * b.M12 + a.M22 * b.M22,a.OffsetX * b.M11 + a.OffsetY * b.M21 + b.OffsetX,a.OffsetX * b.M12 + a.OffsetY * b.M22 + b.OffsetY); } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- Npcap:Nmap项目里一个为Windows而生的嗅探库 Npcap: Nmap
- win10 无法安装/启用 .net framework 3.5
- windows-7 – W7路由 – 流量不会进入默认网关
- 尝试在Windows 7 x64上使用JRuby on Rails时使用sunspot so
- windows-phone-7 – 支持芒果蓝牙的API?
- 在Windows Server 2008上安装Docker
- windows – 使用Get-ADUser时,如何在PowerShell中将用户的域
- windows – 删除目录中的很长路径
- AWS Athena 分析日志
- 如何使用Microsoft Enterprise Library以HTML格式发送电子邮
推荐文章
站长推荐
- windows-xp – Linux“traceroute -A”(AS路径查
- windows github工具 – 使用分支取消发布还是删除
- msbuild – 为什么我的.wpp.targets文件不能应用
- windows – 如何在软件安装期间锁定普通(非管理员
- windows – 如何从Perl程序中设置cmd.exe窗口的大
- 如何对Windows中任务栏的右键菜单中的“关闭窗口
- Windows 8共享目标与JQuery崩溃
- Windows10 下利用Hyper-V安装CentOS系统
- 无法在Windows 10上使用python2.7/MINGW安装pysl
- windows-phone-8 – Windows Phone 8.1应用程序无
热点阅读