【问题标题】:gwt canvas- handling events altogether differentlygwt canvas - 以完全不同的方式处理事件
【发布时间】:2013-04-13 14:08:05
【问题描述】:

Gwt HTML5 Canvas 包装器可以响应鼠标和键盘事件,它绑定到 5 - 6 种不同的事件,我的问题是,是否可以定义全新的事件系统,例如 CanvasEvent(以及相关的处理程序 CanvasEventHandler 扩展为 GwtEvent等),将此绑定到画布对象,然后使用处理程序接口方法以不同方式处理所有事件,例如 onDraw()、onDrag()、onMove()、onSelect() 等。

我对 GWT 事件系统不太清楚,但我想知道这是否可能在没有个性附加单独的事件处理程序以形成处理我的问题的逻辑的情况下,我可以将所有可能的事件作为一个合并对象访问并触发基于自定义事件根据条件。最好的方法是什么,有 GWT 自定义事件的线程,但它们包括发件人,而在我的情况下,发件人已经存在(画布)

非常感谢

【问题讨论】:

    标签: events gwt canvas handler


    【解决方案1】:

    当然 - 请记住,所有 GwtEvent 对象都是完全人造的,并且基于从本机 JavaScript 触发的事件。该 JavaScript 事件对象(通过 onBrowserEvent 传入)根据原始对象的详细信息封装为 ClickEventKeyDownEvent,然后通过内部 HandlerManager 实例触发。同样的,你可以监听MouseDownEvent,设置一些状态,然后如果MouseMoveEvent发生,触发你自己的CanvasDrag事件。一旦MouseUpEvent 发生,您可能会停止收听这些移动事件,然后您会发出类似CanvasDropEvent 的消息。如果MouseUpEvent 不是立即发生而没有移动,您可以触发CanvasSelectEvent(或者您可能对该选择事件有其他想法)。

    您随后声明的这些新事件类型中的每一个都可能包含有关正在发生的任何事情的细节。例如,虽然 MouseMoveEvent 仅包含鼠标悬停的元素和 x/y 坐标,但您可能表示 什么 在页面上被拖动。这可能是最后一次点击的形状,甚至是它所代表的数据。

    是的,“发件人”或来源已经存在,但如果您公开某种方法来添加处理程序,如addCanvasDragHandler 等,它会更容易使用。这是不是 必需 - 您的代码的所有用户都可以使用addHandler,但它确实使小部件是否支持相关事件有点模棱两可。然后,您将在画布对象上调用 fireEvent 以使该事件类型的所有处理程序都侦听。

    或者,您可以创建一个包含内部 Canvas 小部件的新类 - 可能是 Composite 对象或只是实现 IsWidget 的东西(Canvas 有一个私有构造函数,因此您不能对其进行子类化)。这将使您能够添加自己的特定处理程序,并保留自己的 HandlerManager/EventBus 来跟踪您关心的事件。

    【讨论】:

    • 那行得通!要触发复杂事件,必须实现那些简单的处理程序以并行运行。哈哈,我的整个代码都包含在单个类中“公共类 CanvasEvent 扩展 GwtEvent 实现 MouseDownHandler、MouseMoveHandler、MouseUpHandler”
    • 小问题,但请记住,GWT 中没有“并行”——​​浏览器中的所有代码都在单个线程中运行。您可以一个接一个地触发多个事件,但每个事件都会在下一个事件启动之前运行完整的过程。这是浏览器中 JavaScript VM 的本质。不过,您应该或多或少地将其视为并行 - 这将鼓励您编写更多异步(也称为非阻塞)代码,从而为用户带来更灵敏的体验。
    • 哦,是的,“javascript 的旧单线程说法”,我会牢记这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-30
    • 2015-07-04
    • 2019-05-04
    • 1970-01-01
    • 1970-01-01
    • 2018-10-02
    相关资源
    最近更新 更多