- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
好吧,我只是很困惑(而且可能太累了,不利于我现在从事这项工作......)。当鼠标悬停在场景中特定类型的实体上时,我试图让我的 Three.js 应用程序针对不同的鼠标事件执行不同的函数。 “mousemove”类型的事件运行良好,并且
console.log( 'INTERSECTED.isGraphElement: ', INTERSECTED.isGraphElement, 'MouseEvent: ', mouse.type );
语句注册了我正在监听的所有鼠标事件,其中包括“mousemove”、“click”、“dblclick”、“wheel”和“oncontextmenu”。它还检测 INTERSECTED.isGraphElement
对象如预期。
尽管如此,当 transformGraphElement()
运行时,只有“mousemove”事件在 transformGraphElement
内注册。功能。即使是注释掉的测试代码行也应该输出“Got the dblclick!”不运行。看来这里没有检测到我正在监听的其他鼠标事件。
我在 transformGraphElement
中尝试过的事情功能:
obj.referent.transformOnDblClick()
是否有错误功能。我只知道它根本没有被调用(当我将它与“mousemove”事件关联时,它运行得很好)。mouseEventHandler()
进行一些重构功能。没有骰子。这是我的相关代码:
function render() { mouseEventHandler( transformGraphElement, unTransformGraphElement ); requestAnimationFrame( render ); renderer.render(scene, entities.cameras.perspCamera ); } function mouseEventHandler( fn, revFn ){ // update the picking ray with the camera and mouse position ray.setFromCamera( mouse, entities.cameras.perspCamera ); // calculate objects intersecting the picking ray var intersects = ray.intersectObjects( scene.children ); if ( intersects && intersects[0] && intersects[0].object ){ if ( intersects[ 0 ].object != INTERSECTED ){ // if there's an intersected object if ( INTERSECTED ) { // and if a previous INTERSECTED object exists: revFn( INTERSECTED, mouse ); // restore the previous intersected object to its non-intersected state. } INTERSECTED = intersects[ 0 ].object; // set the currently intersected object to INTERSECTED fn( INTERSECTED, mouse ); // transform the currentlY INTERSECTED object. } console.log( 'INTERSECTED.isGraphElement: ', INTERSECTED.isGraphElement, 'MouseEvent: ', mouse.type ); } } function transformGraphElement( obj, mouse ){ // Check if INTERSECTED is a Graph Element, and if so, invoke it's transform function. if ( mouse.type === "mousemove" && obj.isGraphElement ) { obj.referent.transformOnMouseOver(); } //if ( mouse.type === 'dblclick' ) { console.log('Got the dblclick Inside!') } if ( mouse.type === 'dblclick' && obj.isGraphElement ) { obj.referent.transformOnDblClick(); ) } } function unTransformGraphElement( obj, mouse ){ // Check if INTERSECTED is a Graph Element, and if so, revert it to it's pre-mouseEvent state. if ( mouse.type === "mousemove" && obj.isGraphElement ) { obj.referent.transformOnMouseOut(); } if ( mouse.type === 'dblclick' ) { console.log('Got the dblclick Out!') } }
我想知道我遇到的是否是某种默认行为或覆盖,但 event.preventDefault() 行不应该处理这个问题吗? (下面的代码在上面的代码之前运行):
var ray = new THREE.Raycaster(); var mouse = new THREE.Vector2(); var INTERSECTED; // Object closest to the camera function onMouse( event ) { event.preventDefault(); // calculate mouse position in normalized device coordinates // (-1 to +1) for both components mouse.x = ( event.clientX / window.innerWidth ) * 2 - 1; mouse.y = - ( event.clientY / window.innerHeight ) * 2 + 1; mouse.type = ( event.type ); } function listenFor(){ document.addEventListener( 'click', onMouse, false ); document.addEventListener( 'mousemove', onMouse, false ); document.addEventListener( 'mousedown', onMouse, false ); document.addEventListener( 'dblclick', onMouse, false ) document.addEventListener( 'wheel', onMouse, false ); document.addEventListener( 'contextmenu', onMouse, false ); } listenFor();
Console.log( mouse.type )
从里面onMouse()
函数完美地注册了我正在监听的所有鼠标事件。
我已经为此苦苦挣扎了三个小时。我希望这是因为我心情不好而错过的一些愚蠢而简单的事情。欢迎所有帮助,如果有任何缺失的代码对于提供有用的答案很重要,请告诉我...我不这么认为,但心情不好...
感谢您的帮助!
最佳答案
第二天早上我起床并解决了问题。问题出在代码中的逻辑上:
if ( intersects[ 0 ].object != INTERSECTED ){ // if there's an intersected object if ( INTERSECTED ) { // and if a previous INTERSECTED object exists: revFn( INTERSECTED, mouse ); // restore the previous intersected object to its non-intersected state. } INTERSECTED = intersects[ 0 ].object; // set the currently intersected object to INTERSECTED fn( INTERSECTED, mouse ); // transform the currentlY INTERSECTED object. } console.log( 'INTERSECTED.isGraphElement: ', INTERSECTED.isGraphElement, 'MouseEvent: ', mouse.type ); }
Non-mousemove events could not be passed. My solution was to wrap this section with another conditional if (mouse.type === 'mousemove')
and then have additional conditionals for other event types. Here's the whole, with a bit of refactoring to make the whole easier to reason about:
var ray = new THREE.Raycaster();
var mouse = new THREE.Vector2();
var INTERSECTED; // Object closest to the camera
function onMouse( event ) {
event.preventDefault();
// calculate mouse position in normalized device coordinates
// (-1 to +1) for both components
mouse.x = ( event.clientX / window.innerWidth ) * 2 - 1;
mouse.y = - ( event.clientY / window.innerHeight ) * 2 + 1;
mouseEventHandler( event /*, transformGraphElement, unTransformGraphElement */ );
}
function listenFor(){
document.addEventListener( 'click', onMouse, false );
document.addEventListener( 'mousemove', onMouse, false );
document.addEventListener( 'mousedown', onMouse, false );
document.addEventListener( 'dblclick', onMouse, false )
document.addEventListener( 'wheel', onMouse, false );
document.addEventListener( 'contextmenu', onMouse, false );
}
listenFor();
/* ... */
function render() {
requestAnimationFrame( render );
renderer.render(scene, entities.cameras.perspCamera );
}
function mouseEventHandler( event /* , fn, revFn */ ){
// update the picking ray with the camera and mouse position
ray.setFromCamera( mouse, entities.cameras.perspCamera );
// calculate objects intersecting the picking ray
var intersects = ray.intersectObjects( scene.children );
// if there's at least one intersected object...
if ( intersects && intersects[0] && intersects[0].object ){
// Check if the event is a mouse move, INTERSECTED exists and we're sitting on the same INTERSECTED object as the last time this function ran...
if ( event.type === 'mousemove' ){
// Check if the current top-level intersected object is the previous INTERSECTED
if ( intersects[ 0 ].object != INTERSECTED ){
// ... if there is a previous INTERSECTED
if ( INTERSECTED ) {
// restore the previous INTERSECTED to it's previous state.
unTransformGraphElementOnMouseOut( INTERSECTED, event );
}
// set the currently intersected object to INTERSECTED
INTERSECTED = intersects[ 0 ].object;
// and transform it accordingly.
transformGraphElementOnMouseOver( INTERSECTED, event );
}
}
// Check if the mouse event is a doubble click
if ( event.type === 'dblclick' ){
// If the currently intersected object is INTERSECTED
if ( intersects[ 0 ].object === INTERSECTED ){
// select it.
transformGraphElementOnSelect( INTERSECTED, event );
}
// If the currently intersected object is not INTERSECTED
if ( intersects[ 0 ].object !== INTERSECTED ){
// If there is a previous INTERSECTED
if ( INTERSECTED )
// restore it to its unselected state.
unTransformGraphElementOnUnselect( INTERSECTED, event );
}
}
INTERSECTED && console.log( 'INTERSECTED.isGraphElement: ', INTERSECTED.isGraphElement, 'MouseEvent: ', event.type );
}
}
function transformGraphElementOnMouseOver( obj, event ){
if ( obj.isGraphElement ) { obj.referent.transformOnMouseOver(); }
}
function unTransformGraphElementOnMouseOut( obj, event ){
if ( obj.isGraphElement ) { obj.referent.transformOnMouseOut(); }
}
function transformGraphElementOnSelect( obj, event ){
if ( obj.isGraphElement ) { obj.referent.transformOnDblClick(); }
}
function unTransformGraphElementOnUnselect( obj, event ){
if ( obj.isGraphElement ) { obj.referent.unTransformOnDblClick(); }
}
mouseEventHandler()
的逻辑仍然存在一些问题,但核心的挫败感已经得到解决。一些值得一提的额外重构:
event.type
至mouse
.mouseEventHandler()
调用 render()
至onMouse()
。这可确保鼠标事件仅注册一次。mouseEventHandler()
中的 'fn'/'revFn' 回调因为他们只是让事情变得比他们需要的更加困惑。 Event
不需要是转换函数的参数,很快就会发布。希望这对某人有帮助。
关于Javascript 鼠标事件不适用于 Three.JS 场景元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47950150/
我正在尝试为我的网站创建一个功能,允许用户使用 mousemove 和 touchmove 事件水平滚动 div 内容(类似于 Apple AppStore any app Screenshots s
我有固定的侧边栏导航栏,它在悬停时工作,但我想通过单击折叠按钮打开第一个菜单。类似于悬停在菜单 1 上的工作方式。我已经尝试了以下方法。 jsfiddle Demo $(document).on('c
Mouse.Synchronize() 在 .Net 中有什么作用? MSDN 说它“强制鼠标重新同步” 最佳答案 只是我的假设: Stylus 中存在类似的方法类别:Stylus.Synchroni
有没有什么办法可以同时使用鼠标, pygame.mouse.set_visible(False) 已激活。当前鼠标仅在尝试使用时返回右下坐标。需要在隐藏鼠标时能够获得正确的坐标。 在他们的 docum
我有一个缺少数据的数据库。我需要估算数据(我使用的是鼠标),然后根据原始列创建新列(使用估算数据)。我需要使用这些新列进行统计分析。 具体来说,我的参与者使用李克特 7 分量表填写了几份问卷。有些人没
我正在编写一个与电脑交互的机器人。简而言之,我所做的是: -截取屏幕截图- 在此屏幕截图上识别对象(使用 cv2 matchTemplate) -使用找到的位置进行一些鼠标操作(例如:将鼠标指针移动到
我的程序是一个文本游戏,它使用 WindowsForm 上的文本框模拟控制台输出。我试图实现的一个功能是通过单击一个按钮,它将以一定的速度输出到 TextBox,这是通过这种方法实现的 atm: pu
我遇到了一个问题。如果有任何帮助,我将不胜感激。 我正在尝试从玩家位置射击到鼠标点击位置。代码没有给我任何错误,根据我的逻辑,它应该可以工作,但它没有 它创建了项目符号对象,仅此而已。 //Bulle
给定一个带蓝牙的 Windows Mobile 6.1 智能手机,我想将它注册为鼠标。 基本上我现在做的: 使用 Guid {00001124-0000-1000-8000-00805f9b34fb}
我有一个关于在 JavaFX 中实现鼠标拖动事件的正确方法的问题。 我的 playGame() 方法当前使用 onMouseClicked,但这只是一个占位符 理想情况下,我希望“飞盘”沿着鼠标拖动的
已关闭。此问题旨在寻求有关书籍、工具、软件库等的建议。不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以
我目前正在使用 Windows 的 RawInput API 来访问键盘和鼠标输入。我有点困惑的一件事是,当我将鼠标注册为 RawInputDevice 时,我无法移动我的 Win32 窗口或使用那里
我想在我的网站浏览器窗口中 move 鼠标,如下所示:www.lmsify.com。我怎样才能做到这一点?(javascript、flash、activex) 问候,丽莎M 最佳答案 他们并没有真正
我想要一个动画。我是后端开发人员,但我必须使用 jquery 创建动画。 动画、背景和元素位置随鼠标移动而变化。 类似于http://www.kennedyandoswald.com/#!/premi
如何将鼠标“锁定”到某个 OpenGL 窗口。有点像在 Minecraft 中是如何完成的。GameDev 是一个更好的询问地点吗? 最佳答案 正如 Robert 在评论中所说,OpenGL 实际上并
我正在尝试实现一个颜色选择器,它从屏幕上各处的像素中获取颜色。为此,我计划使用全局鼠标 Hook 来监听 WM_MOUSEMOVE,以便在鼠标四处移动时更新颜色,并监听鼠标点击以确认 (WM_LBUT
如何使用 Java 和 JNA(Java native 访问)与 Windows API 交互?。我试图通过在鼠标输入流上排队鼠标事件来让鼠标做某事,并且代码有效,因为 SendInput(...)
我想用 C++ 脚本 move 鼠标光标。我在 Parallels 中的 Windows 7 中使用 Visual C++ 2010 Express,并创建了一个控制台应用程序。 我知道 SetCur
我有一些关于 WH_MOUSE 的问题。根据我的阅读,通过将钩子(Hook)放入 DLL 中,它会注入(inject)进程。这是否意味着捕获鼠标也适用于我的桌面、菜单启动等?那么应用程序的标题栏呢?我
如何为多只鼠标显示另一个光标? 我有两个 TMemos,两个可以输入各自 TMemo 的键盘,2 个鼠标,我需要 2 个光标。 如果假设的话,我已经可以检测出哪只鼠标是哪只了。我怎样才能让我自己的光标
我是一名优秀的程序员,十分优秀!