- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当缩放中心因捏合(缩放)或 metro 风格应用中的其他手势而发生变化时,如何避免在 Canvas 对象上缩放时出现“跳跃”
我尝试存档的行为类似于预装 win8 map 应用程序的缩放行为。如果您执行捏合手势(放大或缩小),则缩放中心设置在手指之间的中间位置。如果你抬起其中一根手指,放在另一个点上,你可以立即执行另一个缩放操作,缩放中心正确改变,没有任何跳跃( Canvas 中对象的UI坐标的跳跃)。
我正在尝试使用复合转换在大型 Canvas 对象(在 C# WinRT 应用程序中)上实现类似的行为。我想允许平移和缩放,而不是旋转(现在,也许我稍后会添加它):
我这样初始化,将缩放中心放在屏幕中心:
this.compositeTransform = new CompositeTransform();
this.compositeTransform.CenterX = this.mainPage.Width / 2.0;
this.compositeTransform.CenterY = this.mainPage.Height / 2.0;
this.innerCanvas.RenderTransform = compositeTransform;
然后我将使用操作增量事件来获取输入数据
private void InnerCanvas_ManipulationDelta(object sender, ManipulationDeltaRoutedEventArgs e)
{
this.compositeTransform.ScaleX *= e.Delta.Scale;
this.compositeTransform.ScaleY *= e.Delta.Scale;
this.compositeTransform.CenterX = e.Position.X;
this.compositeTransform.CenterY = e.Position.Y;
this.compositeTransform.TranslateX += e.Delta.Translation.X;
this.compositeTransform.TranslateY += e.Delta.Translation.Y;
}
只要我执行相同的手势,它就可以正常工作。当我执行捏合手势时,新中心计算正确。但是,更改缩放中心会导致突然跳跃,例如在捏合手势后抬起其中一根手指时。当然,我可以只为捏手势改变中心,但跳跃的问题仍然存在。这当然是合乎逻辑的,因为缩放适用于新的缩放中心。我还没有想出办法,如何避免跳跃。由于比例值本身保持不变,因此一定有可能具有相同的外观(坐标不变)但中心已更改。
我目前的推理是,我必须以某种方式更改 TranslateX 和 TranslateY 坐标,以便以某种方式平衡新的中心点,即 ui 元素的当前屏幕坐标保持不变。像这样(scaleTransform 是一个 ScaleTransform,它只获取缩放数据)...
Point reverseScaleTransform =
this.scaleTransform.Inverse.TransformPoint(new Point(e.Position.X,e.Position.Y));
this.compositeTransform.TranslateX += reverseScaleTransform.X - e.Position.X;
this.compositeTransform.TranslateY += reverseScaleTransform.Y - e.Position.Y;
但这也行不通。整个事情似乎是平板电脑上的标准问题,但是尽管搜索了很多,但我仍未找到解决方案,也许我使用了错误的关键字。
最佳答案
我终于想通了,如何通过手动转换来解决问题,而不是使用 ScrollViewer。
TranslateTransform tmpTranslate = new TranslateTransform();
private void InnerCanvas_ManipulationDelta(object sender, ManipulationDeltaRoutedEventArgs e)
{
//Transform world space into local space (origin: Scale center from the last manipulation event)
this.tmpTranslate.X = this.compositeTransform.CenterX;
this.tmpTranslate.Y = this.compositeTransform.CenterY;
Point center = this.compositeTransform.Inverse.TransformPoint(e.Position);
Point localPoint = tmpTranslate.Inverse.TransformPoint(center);
//Now scale the point in local space
localPoint.X *= this.compositeTransform.ScaleX;
localPoint.Y *= this.compositeTransform.ScaleY;
//Transform local space into world space again
Point worldPoint = tmpTranslate.TransformPoint(localPoint);
//Take the actual scaling...
Point distance = new Point(
worldPoint.X - center.X,
worldPoint.Y - center.Y);
//...amd balance the jump of the changed scaling origin by changing the translation
this.compositeTransform.TranslateX += distance.X;
this.compositeTransform.TranslateY += distance.Y;
//Also set the scaling values themselves, especially set the new scale center...
this.compositeTransform.ScaleX *= e.Delta.Scale;
this.compositeTransform.ScaleY *= e.Delta.Scale;
this.compositeTransform.CenterX = center.X;
this.compositeTransform.CenterY = center.Y;
//And consider a translational shift
this.compositeTransform.TranslateX += e.Delta.Translation.X;
this.compositeTransform.TranslateY += e.Delta.Translation.Y;
}
关于c# - 当缩放中心因捏合(缩放)或 metro 风格应用程序中的其他手势而发生变化时,如何在 Canvas 上缩放时避免出现 "jump",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14011895/
Textmate 语法(.tmLanguage 文件)有时以 XML 格式表示。 我想转换为更易读的格式(即 JSON 或 YAML)以集成到 VS Code 语法突出显示扩展中。 为了澄清我的意思,
如何通过 pandas 样式隐藏列标签?有一个 hide_index() 方法可以删除索引行,不幸的是 hide_column() 标签会删除整个列(标题和数据)。我只想隐藏标题。谢谢! 最佳答案 s
我正在考虑为一组服务使用 SOA 架构来支持我咨询的业务,以前我们使用数据库集成,其中每个应用程序从共享的 MS SQL 数据库中挑选出它需要的东西并使用它等等。我们有各种与怪物数据库(包括 java
所以我有以下代码,我想知道 Objective-C 中哪种“风格”被认为更好。 选项 1: id temp = [dictionary objectForKey: @"aBooleanValue"];
当创建一个没有类参数的对象时,我很难决定是否应该包含空括号。一个具体的例子:我正在与现有的 Java 代码交互,并创建一个实现名为 EventResponder 的接口(interface)的对象。我
我有一个抽象类Stack和一个扩展它的类:MyStack。我需要为 MyStack 创建一个复制构造函数。只传入 MyStack 对象更好,还是传入任何 Stack 对象更好? public MySt
我正在考虑将那些在函数体中未修改的 Python 函数参数拼写为 ALL_UPPERCASE,向此类 API 的用户发出信号,表明传递的值不会被修改(如果一切都如广告所言,无论如何) )。我不知道这会
我的 build.gradle 文件、staging、stable 和 production 以及默认构建类型 debug 和 release。对于其中的每一个,我都有不同的 AAR 文件,例如,我有
假设我有以下文件: main.cpp 例程.cpp 例程.h 进一步假设 main.cpp 调用了在 routine.cpp 中定义的函数 routine(),但是 routine.cpp 还包含仅由
我对此进行了一些搜索,但实际上我还没有找到 MySQL 中用于创建外键的样式概念是什么 - 在创建表定义中或在 alter 语句中。谢谢。 最佳答案 何时创建外键: 如果在创建表时明确需要外键,则在创
您好,我正在尝试将 Android 应用风格(免费且完整)实现为动态壁纸。在 Eclipse 中,我曾经使用以下代码从我自己的 Android Activity 打开动态壁纸预览: I
我的 Android 应用程序有两种不同的风格,lite 和 pro。在应用程序中,我有一个名为 customFragment.java 的类,它包含在 main 中(不同风格之间没有区别)并且还包含
我有一个包含多个子目录的项目,如下所示: /opt/exampleProject/src ├── __init__.py ├── dir1 │ ├── __init__.py │ ├──
假设我们有类似的东西 int f(int n); .... do{ int a = b; int b = f(a); } 这样说有没有风险 do{ int b = f(b);
是否有风格指导或理由来选择其中一种模式而不是另一种? 最小化上下文管理器下的代码量“感觉”更干净,但我无法指出具体原因。这可能只是偏好,并没有关于此事的官方指导。 1) 里面的所有代码都有上下文。 w
module Hints module Designer def self.message "Hello, World!" end
我正在开发一个具有多种风格的 android 项目。 这很好用,我可以自定义应用程序的元素,例如颜色和字符串资源。 我想让一些风格基于 AppCompat 浅色主题,一些基于 AppCompat 深色
因此,这不起作用,因为 seatsAvailable 是最终的。如何使用更多的 lambda 风格的从头开始的方式来完成我想要完成的事情? final boolean seatsAvailable =
考虑以下代码: cpu_set_t cpuset; CPU_ZERO(&cpuset); CPU_SET(0, &cpuset); sched_setaffinity(0, sizeof(cpuset
从历史上看,我总是这样编写我的异常处理代码: Cursor cursor = null; try { cursor = db.openCursor(null, null
我是一名优秀的程序员,十分优秀!