我正在尝试开发可以在画布中渲染图像和文本的程序.我试图在画布上处理点击图像,但它适用于可直接图像.
我的问题:您是否知道处理解决方案或框架在画布上点击图像的可见部分(不是透明部分)?
如果有人熟悉它,我正在寻找ActionScript hitTestObject函数的javascript实现.
这是一个简单的算法与可直接命中文本:http://jsfiddle.net/V92Gn/298/
var hitted = e.clientX >= position.x &&
e.clientX <= position.x + logoImg.width &&
e.clientY >= position.y &&
e.clientY <= position.y + logoImg.height;
Run Code Online (Sandbox Code Playgroud) 我正在使用 渲染文本FormattedText,但似乎确实有任何方法可以对渲染的输出执行每个字符的命中测试。它是只读的,所以我基本上只需要选择,不需要编辑。
我会使用RichTextBox或类似的,但我需要根据嵌入文本本身的控制代码输出文本,因此它们并不总是嵌套,这使得构建正确的内联元素非常复杂。我也有点担心该解决方案的性能;我有大量的行,并且经常添加新行。
我看过GlyphRun,看来我可以从它或相关的类中进行命中测试,但我会重新实现很多功能,而且似乎应该有一种更简单的方法......
有谁知道实现这个的好方法?
假设我有两个代表A行的点,例如:
var A = [ { x: 385, y: 380 }, { x: 420, y: 400 }]
Run Code Online (Sandbox Code Playgroud)
我还有另外两点B和C,例如:
var B = { x: 385, y: 420 }
var C = { x: 405, y: 423 }
Run Code Online (Sandbox Code Playgroud)
我如何确定B和C是否都在A行的同一侧?为了添加一点上下文,我试图对六边形进行命中测试,其中B是六边形的中心点,C是当前鼠标位置,A是六边形的每条线.所有这些点基本上都是像素坐标,其中0,0是左上角.
我不需要这个快速开始我只是想尝试创建最简单的六边形命中测试算法.我的理论是,如果我能确定C与六边形的每条线的同一侧与B相同,则命中测试成功.我已经阅读了几个数学算法来做这个,但它们似乎总是在不同类型的坐标系中,我很难将它转换为可用于javascript的东西.
编辑:这是我的实际六角函数给出以下答案.这个问题的答案在更新功能中.
var TILE_WIDTH = 70
var TILE_HEIGHT = 80
function Hexagon(x, y) {
var normalColor = 'rgb(207, 226, 243)'
var hilightColor = 'rgb(204, 204, 204)'
var currentColor = normalColor
var coords = new TileCoordinates(x, y)
var points = [
{ x: …Run Code Online (Sandbox Code Playgroud) 我想检查一个BitmapData对象是否完全被BitmapData对象遮挡.有什么像hitTest函数,但确保每个像素被覆盖而不是任何像素?
编辑:检查对象是否被遮挡时,不包括透明像素非常重要.
我有两个项目,一个在另一个上,也就是说,一个挡住了另一个。假设 Item2 被 Item1 阻止。现在每当我使用
project.hitTest(Item2);
Run Code Online (Sandbox Code Playgroud)
效果很好。
但是当我使用鼠标的event.point时,就会出现问题。当我使用
project.hitTest(event.point);
Run Code Online (Sandbox Code Playgroud)
在
function onMouseUp(event){}
Run Code Online (Sandbox Code Playgroud)
它只检测顶部的项目。是否可以检测所有项目?
我知道这是可能的 -在创建窗口时通过SetWindowLongAPI 或 WPFWindow类的托管属性以某种方式......但我不知道如何做到这一点。我根本找不到有关如何设置窗口样式的信息,因此它无法接收有关鼠标单击它的任何系统消息,并且任何单击都会通过窗口到达底层窗口。
有谁知道那个样式代码之类的?
假设您有一个超级视图,其尺寸小于其子视图。您将clipsToBound超级视图的属性设置为false。如果点击子视图超出父视图边界的突出区域,为什么命中测试返回 nil?
我的理解是,命中测试从子视图开始,一直到超级视图。那么为什么晚于子视图测试的父视图的属性很重要呢?或者命中测试是否从根开始到树视图(例如视图控制器 -> 主视图 -> 子视图)?
我从这里找到了一个自定义命中测试,它确实允许您点击超级视图边界之外的子视图区域,但我不确定为什么反转子视图的顺序会产生影响(它有效,我是只是不知道为什么)。我的示例甚至只有一个子视图。
class ViewController: UIViewController {
let superview = CustomSuperview(frame: CGRect(origin: .zero, size: .init(width: 100, height: 100)))
let subview = UIView(frame: CGRect(origin: .zero, size: .init(width: 200, height: 200)))
override func viewDidLoad() {
super.viewDidLoad()
self.view.addSubview(self.superview)
self.superview.backgroundColor = .red
self.superview.clipsToBounds = false
self.superview.addSubview(self.subview)
self.subview.backgroundColor = .blue
let tap = UITapGestureRecognizer(target: self, action: #selector(tapped))
self.subview.addGestureRecognizer(tap)
}
@objc func tapped(_ sender: UIGestureRecognizer) {
print("tapped")
}
}
class CustomSuperview: UIView {
override func hitTest(_ …Run Code Online (Sandbox Code Playgroud) 在 FireMonkey (FMX) 中,每个TControl组件都有一个HitTest属性,允许我启用或禁用组件上的鼠标事件。
VCL中有类似的东西吗?我试着寻找它,但我HitTest在任何地方都找不到房产。
如果没有HitTestVCL,如何实现同样的效果呢?有人可以提供一个关于如何在 VCL 中执行此操作的代码示例吗?
我正在使用 Embarcadero Delphi 12。
hittest ×8
javascript ×3
c# ×2
wpf ×2
.net ×1
bitmapdata ×1
canvas ×1
delphi ×1
firemonkey ×1
ios ×1
lines ×1
math ×1
mouseevent ×1
paperjs ×1
points ×1
swift ×1
text ×1
touch-event ×1
vcl ×1
window ×1