我在HTML5 Canvas上绘制了一些图像,我想检查它们是否在鼠标点击时被点击.看似简单,我有图像的边界,但图像被转换(翻译和缩放).不幸的是,上下文没有获取当前变换矩阵的方法,而且,没有用于矩阵乘法的API.似乎唯一的解决方案是自己跟踪变换并实现矩阵乘法.欢迎提出建议.
我有一个视图层次结构,包含滚动视图上较小的视图.每个视图都可以包含子视图,例如按钮等.
由于某种原因,视图上的按钮没有被点击; 探索这一点进一步表明,虽然滚动视图接收到touchBegan事件,但按钮却没有.调用hitTest:event:消息显示该按钮未返回,即使它在限制范围内.
我已经包含了一个日志输出,描述了滚动视图中触摸的位置,从hitTest返回的项目,触摸位置,如果我调用locationInView:使用预期项目,以及预期项目的层次结构(打印了框架).从这个输出我可以推断该按钮应该被调用...
有谁能解释一下?我错过了什么吗?
touched ({451, 309}) on <VCViewContainersView: 0x4b31ee0; frame = (0 0; 748 1024); transform = [0, 1, -1, 0, 0, 0]; autoresize = W+H; layer = <CALayer: 0x4b32130>> (location in expected item: {17, 7.5})
expected touched item is:
view: <UIButtonLabel: 0x482b920; frame = (32 5; 36 19); text = 'Click'; clipsToBounds = YES; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x4831370>>, layer transform: [1, 0, 0, 1, 0, 0]
view: <UIRoundedRectButton: 0x482c100; …
Run Code Online (Sandbox Code Playgroud) 我有一个我称之为的视图,parentView
它有一个名为 的子视图childView
。的一部分childView
在 的范围之外parentView
,childView
并附有panGestureRecognizer
。我已经实现了以下内容,以便即使超出其超级视图范围,parentView
它也能识别触摸:childView
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
if (!self.clipsToBounds && !self.hidden && self.alpha > 0)
{
for (UIView *subview in self.subviews)
{
CGPoint subPoint = [subview convertPoint:point fromView:self];
UIView *result = [subview hitTest:subPoint withEvent:event];
if (result != nil)
{
return result;
break;
}
}
}
return [super hitTest:point withEvent:event];
}
Run Code Online (Sandbox Code Playgroud)
然而当我触摸或拖动时childView
,hitTest
却根本不被调用了parentView
。为什么是这样?
我在XAML中有这个矩形:
<Rectangle x:Name="MyRectangle" Height="300" Width="300"></Rectangle>
Run Code Online (Sandbox Code Playgroud)
我想检查它是否与另一个矩形相交.在关于SO的这个问题中,他们说必须使用IntersectsWith方法.但是我无法在代码隐藏中使用它.当我用C#写的时候:
MyRectangle.IntersectsWith(
Run Code Online (Sandbox Code Playgroud)
我得到标准错误:
"System.Windows.Shapes.Rectangle不包含'IntersectsWith'的定义,也没有扩展方法[...]"
我认为那是因为XAML中的矩形是a System.Windows.Shapes.Rectangle
,而且方法适用于System.Windows.Rect
?如果是这样,有没有办法将我Rectangle
变成一个Rect
?
这是我的问题:
我使用SpriteKit,我想在某个矩形中发生忽略触摸事件(阻止调用touchesBegan
).我想如何做到这一点的方式是一样的东西"重写hitTestWithEvent
的UIView
".但我找不到任何类似的方法SKSpriteNode
可以忽略事件并阻止调用touchesBegan
.
当然
isUserInteractionEnabled
为false但它会禁用整个精灵而不仅仅是一部分.touchesBegan
方法中的触摸位置,但这是迟到的 - 在同一位置下面的其他精灵将不再接收此事件.SKCropNode
,但它只是阻止显示精灵,甚至在不可见区域处理事件.有没有人知道如何防止部分精灵处理事件?
是否可以忽略 SceneKit 的 hitTest 中的对象,以便在发送 hitTest 光线时,它会穿过一个对象?我仍然想看到两个物体,我只想让光线忽略另一个。
这里最上面的图片显示了它是如何工作现在,底部是我想拥有的。
我认为将球体放到另一个视图中是可能的,但我认为那时我看不到物体。
我在编写 WPF UI 多年后转向 UWP。
使用 WPF 控件,可以通过重写控件的 HitTestCore 方法来提供自定义命中测试逻辑,如下所示:
protected override HitTestResult HitTestCore(PointHitTestParameters params)
{
//Do some kind of test on params.HitPoint
if (HitPointIsOverTheControl(params.HitPoint))
return new PointHitTestResult(this, params.HitPoint);
else
return null;
}
Run Code Online (Sandbox Code Playgroud)
我一直在成功地使用这种方法,通过测试当前鼠标点正下方的图像像素以查看它是否具有 alpha 通道字节,可以测试鼠标是否位于任何不规则形状的 PNG 图像(在图像控件中)上值为 0,如果是,则在上述函数中返回 null。
换句话说,这种方法允许我通过 PNG Alpha 通道蒙版选择可见控件堆栈中位于其下方的任何内容。而且效果出奇的好。
现在到 UWP...
我在 UWP 框架中找不到与上述类似的方法,因此我怀疑“命中测试覆盖”在 UWP 中不可用。
谁能告诉我这种方法在 UWP 中是否仍然可行,如果不行,是否有其他方法可以用来实现相同的结果?
谢谢
编辑:示例
假设有 2 个图像控件彼此重叠,最上面的控件是一个中间有孔的黄色圆圈的图像,底部的图像是一个实心蓝色正方形,它完全被顶部控件覆盖,但可以部分覆盖。透过圆圈中的洞看到。
现在我希望能够a)通过单击它的黄色部分来移动圆圈,或者b)通过通过圆圈中的孔单击它来从下面移动蓝色方块。
好的。当我将鼠标移到黄色圆圈上时,它会触发 PointerMoved 事件,然后我可以确定鼠标是否位于 PNG 图像蒙版的一部分上。到目前为止,一切都很好。
现在假设鼠标位于圆中间的孔上方,我真的想开始接收来自正方形而不是圆的所有指针和操作事件。我能想到的唯一方法是,每当鼠标位于图像的“洞”部分上方时,在圆圈上设置属性“IsHitTestVisible = false”,并在鼠标悬停时在圆圈上设置“IsHitTestVisible = true”图像的“黄色”部分。
这种方法的问题是,一旦我在圆圈上设置“IsHitTestVisible=false”,它将不再引发进一步的 PointerMoved 事件。
换句话说,现在开始更改 PointerMoved 事件中的 IsHitTestVisible 属性为时已晚,因此能够在 WPF 中重写 …
在我的渲染器委托中,我从视图的中心创建了一个光线投射查询来跟踪估计平面并显示一个跟随光线投射结果的 3D 指针。
它是通过完成的,view.raycastQuery(from:allowing:alignment:)
但返回零。
我的问题是为什么?没有文档说明为什么这个函数会返回一个 nil 值。我知道光线投射结果可能为空,但为什么不会创建查询?
func renderer(_ renderer: SCNSceneRenderer, updateAtTime time: TimeInterval) {
guard view.session.currentFrame?.camera.trackingState == .normal else {
return
}
DispatchQueue.main.async {
let center = view.center
DispatchQueue.global(qos: .userInitiated).async {
if let query = view.raycastQuery(from: center, allowing: .estimatedPlane, alignment: .any) {
let results = view.session.raycast(query)
...
}
else {
// sometimes it gets here
}
}
}
}
Run Code Online (Sandbox Code Playgroud) 我想创建一个旋转动画,其中包含一组按钮(排列成圆圈),这些按钮从单击的中心按钮旋转和延伸。
虽然动画和旋转工作良好,并且打开按钮和关闭按钮工作顺利并且尽管旋转但仍响应 onTap(),但外部按钮在“onTap”-GestureDetector 方面不起作用。
目标:我想让红色容器可点击(例如GestureDetector)。问题:红色容器对 onTap() 没有反应。
import "dart:developer" as dev;
import 'dart:math';
import 'package:flutter/material.dart';
import 'package:sdg3/Widget/rotation_controller.dart';
import 'package:sdg3/Widget/rotation_menu_button.dart';
import 'package:vector_math/vector_math.dart' show radians, Vector3;
class RadialMenu extends StatefulWidget {
final Widget open;
final Widget? close;
final int startAngle;
final List<RotationMenuButton> rotationButtons;
final RotationController? rotationController;
const RadialMenu({
Key? key,
this.rotationController,
required this.open,
this.startAngle = 0,
this.close,
required this.rotationButtons,
}) : super(key: key);
@override
createState() => _RadialMenuState();
}
class _RadialMenuState extends State<RadialMenu>
with SingleTickerProviderStateMixin {
late AnimationController controller;
late double maxButtonRadius;
@override …
Run Code Online (Sandbox Code Playgroud) hittest ×10
ios ×3
iphone ×2
scenekit ×2
swift ×2
wpf ×2
arkit ×1
c# ×1
canvas ×1
cocoa-touch ×1
flutter ×1
html5 ×1
ipad ×1
rectangles ×1
skspritenode ×1
sprite-kit ×1
transform ×1
uiview ×1
uwp ×1
xaml ×1