cesium 常用鼠标事件

文章详细描述了如何在Cesium库中使用ScreenSpaceEventHandler来处理屏幕上的鼠标点击、滚动、移动和键盘事件,以便获取和更新地球表面位置信息。
var handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);

获取屏幕中心点坐标

PositionHandler.setInputAction(e => {
                const center = new Cesium.Cartesian2(viewer.canvas.clientWidth / 2, viewer.canvas.clientHeight / 2)
                // 使用pickEllipsoid方法获取地球表面位置
                const centerResult = viewer.camera.pickEllipsoid(center)
                const curPosition = Cesium.Ellipsoid.WGS84.cartesianToCartographic(centerResult)
                if (curPosition) {
                    const curLongitude = (curPosition.longitude * 180) / Math.PI
                    const curLatitude = (curPosition.latitude * 180) / Math.PI
                    // console.log(curLongitude)
                    // console.log(curLatitude)
                    viewer.cesiumNavigation.navigationViewModel.pick_longitude = viewer.cesiumNavigation.navigationViewModel.camera_longitude
                    viewer.cesiumNavigation
<think> 我们正在回答用户关于Cesium中改变鼠标样式的问题。根据之前的引用,用户提到了多种鼠标样式,如'crosshair', 'default', 'text', 'move', 'wait', 'pointer', 'n-resize', 'not-allowed', 'progress', 'help'等。同时,引用[2]提到了鼠标移入模型时显示手型或自定义图标的方法。 因此,我们需要介绍在Cesium中如何改变鼠标样式的几种方法,包括全局设置和针对特定实体(如模型)的设置。 方法1:全局改变鼠标样式(整个画布) 我们可以通过直接修改Cesium Viewer的canvas元素的鼠标样式来实现。 方法2:根据鼠标位置下的实体类型动态改变鼠标样式 例如,当鼠标悬停在模型上时,将鼠标样式改为手型(pointer)或自定义图标。 具体步骤如下: 1. 全局设置鼠标样式: ```javascript viewer.scene.canvas.style.cursor = 'pointer'; // 设置整个画布的鼠标样式 ``` 2. 动态改变鼠标样式(基于悬停的实体): - 使用`ScreenSpaceEventHandler`监听鼠标移动事件。 - 在事件处理函数中,判断当前鼠标位置下是否有实体(使用`scene.pick`或`scene.drillPick`)。 - 如果有实体,则根据实体的类型或自定义属性来设置不同的鼠标样式;如果没有,则恢复默认样式。 示例代码: ```javascript // 创建事件处理器 const handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas); // 监听鼠标移动 handler.setInputAction((movement) => { const picked = viewer.scene.pick(movement.endPosition); if (picked) { // 如果悬停在实体上,设置鼠标样式为手型 viewer.scene.canvas.style.cursor = 'pointer'; } else { // 没有悬停在实体上,恢复默认样式 viewer.scene.canvas.style.cursor = 'default'; } }, Cesium.ScreenSpaceEventType.MOUSE_MOVE); ``` 3. 自定义鼠标图标: 如果需要使用自定义图标,可以使用CSS来设置。例如: ```javascript viewer.scene.canvas.style.cursor = 'url(custom-cursor.png), auto'; ``` 注意:在移除事件处理器或销毁Viewer时,记得销毁事件处理器以避免内存泄漏。 此外,引用[2]中提到了超图的示例,但我们的回答可以基于原生的Cesium API。 总结: - 全局设置:直接修改canvas的style.cursor属性。 - 动态设置:通过监听鼠标移动事件,根据拾取的实体来改变鼠标样式。 下面按照要求组织回答: </think> ### Cesium 中改变鼠标样式的方法详解 在 Cesium 中,可通过以下三种方式灵活控制鼠标样式: #### 1. **全局设置鼠标样式** ```javascript // 设置整个场景的鼠标样式 viewer.scene.canvas.style.cursor = 'pointer'; // 手型 // 常用样式类型: viewer.scene.canvas.style.cursor = 'crosshair'; // 十字准星 viewer.scene.canvas.style.cursor = 'wait'; // 加载中 viewer.scene.canvas.style.cursor = 'help'; // 帮助问号 ``` **适用场景**:整个场景需要统一交互状态时(如加载期间显示等待光标) #### 2. **动态响应实体悬停** ```javascript const handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas); handler.setInputAction((movement) => { const picked = viewer.scene.pick(movement.endPosition); // 悬停在实体上时显示手型 if (picked && Cesium.defined(picked.id)) { viewer.scene.canvas.style.cursor = 'pointer'; } // 无实体时恢复默认 else { viewer.scene.canvas.style.cursor = 'default'; } }, Cesium.ScreenSpaceEventType.MOUSE_MOVE); ``` **效果**:当鼠标滑过模型/实体时自动变为手型图标[^2] #### 3. **高级:自定义光标图标** ```css /* 定义自定义光标 */ .custom-cursor { cursor: url('custom-icon.png'), auto; } ``` ```javascript // 应用自定义光标 viewer.scene.canvas.classList.add('custom-cursor'); // 根据实体类型切换不同光标 handler.setInputAction((movement) => { const picked = viewer.scene.pick(movement.endPosition); if (picked?.id?.customType === 'drone') { viewer.scene.canvas.style.cursor = 'url(drone-cursor.png), auto'; } else if (picked?.id?.customType === 'sensor') { viewer.scene.canvas.style.cursor = 'url(sensor-cursor.png), auto'; } }, Cesium.ScreenSpaceEventType.MOUSE_MOVE); ``` ### 光标样式对照表 | 样式值 | 效果描述 | 适用场景 | |------------------|---------------------------|------------------------| | `pointer` | 手型图标 | 可点击元素 | | `crosshair` | 十字准星 | 精确测量/拾取点 | | `move` | 四向箭头 | 可拖拽元素 | | `wait` | 加载旋转图标 | 数据加载中 | | `not-allowed` | 禁止操作图标 | 不可交互区域 | | `zoom-in` | 放大镜(带+号) | 地图缩放操作 | | `grab` | 抓取手掌 | 3D模型旋转操作 | ### 注意事项 1. **性能优化**:频繁切换光标可能影响性能,建议在`requestAnimationFrame`中更新[^3] ```javascript Cesium.requestAnimationFrame(() => { viewer.scene.canvas.style.cursor = newCursor; }); ``` 2. **移动端适配**:部分光标样式在移动设备上不生效,需使用CSS媒体查询 3. **自定义图标规格**:推荐使用 32×32 或 48×48 的 PNG 透明图标 4. **销毁处理**:页面关闭时移除事件监听 ```javascript handler.destroy(); // 防止内存泄漏 ``` > **最佳实践**:通过实体自定义属性(如`entity.customType`)触发不同类型的光标变化,实现精细化交互反馈[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值