flex <param name="wmode" value="transparent">鼠标滚轮控制问题

本文介绍了解决Flash在透明模式下无法响应鼠标滚轮的问题。通过JS捕获滚轮事件并传递给Flash,实现对Flex DataGrid组件滚动条的控制。包括不同浏览器的事件监听适配。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、网页嵌入flash后会覆盖html dom 元素,使用wmode为transparent时可以解决覆盖问题,因为此时它已经透明了。

2、transparent带来另一个问题,鼠标滚轮控制不了flash中的滚动条。

3、思路:通过js捕获鼠标滚轮事件,js调用flash方法传递滚轮->flash组件调用滚轮事件传递的参数。

eg:使用js捕获鼠标滚轮事件后控制flex dataGrid组件的滚动条

js代码

[javascript] view plain copy print ?
  1. function addMouseWheelListener(){ 
  2.     var flash = thisMovie("videoControl"); 
  3.     var ua = navigator.userAgent; 
  4.     if(ua.indexOf("Firefox") > -1){ 
  5.            flash.addEventListener('DOMMouseScroll',onWheelZoom,false);  
  6.     }else if(ua.indexOf("MSIE") == -1){ 
  7.         flash.addEventListener('mousewheel',onWheelZoom,false);  
  8.     }else
  9.         flash.attachEvent('onmousewheel',onWheelZoom);  
  10.     } 
  11.  
  12. function onWheelZoom(event){   
  13.     var app = window.document["videoControl"];   
  14.     if (app) {   
  15.         var o= {delta: event.wheelDelta} 
  16.         thisMovie("videoControl").jsWheelZoom(o);   
  17.     }   
  18. }   
function addMouseWheelListener(){
	var flash = thisMovie("videoControl");
	var ua = navigator.userAgent;
	if(ua.indexOf("Firefox") > -1){
	       flash.addEventListener('DOMMouseScroll',onWheelZoom,false); 
    }else if(ua.indexOf("MSIE") == -1){
        flash.addEventListener('mousewheel',onWheelZoom,false); 
    }else{
    	flash.attachEvent('onmousewheel',onWheelZoom); 
    }
}

function onWheelZoom(event){  
    var app = window.document["videoControl"];  
    if (app) {  
        var o= {delta: event.wheelDelta}
        thisMovie("videoControl").jsWheelZoom(o);  
    }  
}  

flex代码

在初始化时候注册js 监听方法和回调方法 ,方法如下


  1. ExternalInterface.addCallback("jsWheelZoom", jsWheelZoom); 
ExternalInterface.addCallback("jsWheelZoom", jsWheelZoom);
  1. ExternalInterface.call("addMouseWheelListener"); 
ExternalInterface.call("addMouseWheelListener");
 
  1. private function jsWheelZoom(o:Object):void 
  2.     var e:MouseEvent = new MouseEvent(MouseEvent.MOUSE_WHEEL,true);   
  3.     e.delta = -(o.delta); 
  4.     onWheelZoom(e);  
  5. private function onWheelZoom(e:MouseEvent):void 
  6.     if(e.delta>2)   
  7.     {   
  8.         this.camera.verticalScrollPosition += 1
  9.         if(this.camera.verticalScrollPosition > this.camera.maxVerticalScrollPosition) 
  10.         { 
  11.             this.camera.verticalScrollPosition = this.camera.maxVerticalScrollPosition 
  12.         } 
  13.     }   
  14.     if(e.delta<-2)   
  15.     {   
  16.         this.camera.verticalScrollPosition -= 1;      
  17.         if(this.camera.verticalScrollPosition < 0
  18.         { 
  19.             this.camera.verticalScrollPosition = 0
  20.         }              
  21.     }   
  22. }  
<?xml version="1.0"?> <launch> <arg name="lidar" default="$(optenv TIANBOT_LIDAR osight)" /> <!-- gmapping --> <node pkg="gmapping" type="slam_gmapping" name="slam_gmapping" output="screen"> <remap from="scan" to="scan"/> <param name="map_update_interval" value="0.5"/> <param if="$(eval 'osight' in lidar)" name="maxUrange" value="20"/> <param if="$(eval 'richbeam' in lidar)" name="maxUrange" value="20"/> <param if="$(eval 'rplidar' in lidar)" name="maxUrange" value="6"/> <param name="sigma" value="0.05"/> <param name="kernelSize" value="1"/> <param name="lstep" value="0.05"/> <param name="astep" value="0.05"/> <param name="iterations" value="5"/> <param name="lsigma" value="0.075"/> <param name="ogain" value="3.0"/> <param name="lskip" value="0"/> <param name="minimumScore" value="200"/> <param name="srr" value="0.05"/> <param name="srt" value="0.05"/> <param name="str" value="0.05"/> <param name="stt" value="0.05"/> <param name="linearUpdate" value="0.25"/> <param name="angularUpdate" value="0.2"/> <param name="temporalUpdate" value="-1"/> <param name="resampleThreshold" value="0.5"/> <param name="particles" value="30"/> <param name="xmin" value="-50.0"/> <param name="ymin" value="-50.0"/> <param name="xmax" value="50.0"/> <param name="ymax" value="50.0"/> <param name="delta" value="0.05"/> <param name="llsamplerange" value="0.01"/> <param name="llsamplestep" value="0.01"/> <param name="lasamplerange" value="0.005"/> <param name="lasamplestep" value="0.005"/> <param name="odom_frame" value="odom"/> <param name="base_frame" value="base_footprint"/> </node> </launch>
最新发布
03-17
### 正确设置 ROS GMapping 节点参数 GMapping 是一种基于概率的 SLAM 方法,在 ROS 中广泛用于构建二维地图。为了正确配置其节点参数并针对不同类型的 LIDAR 设备调整 `maxUrange` 参数,以下是详细的说明。 #### 1. GMapping 的核心参数解释 在 GMapping 节点中,有几个关键参数会影响建图效果: - **`base_frame`**: 表示机器人底盘的坐标系名称,默认为 `base_link`[^1]。 - **`odom_frame`**: 表示里程计数据的坐标系名称,默认为 `odom`。 - **`map_update_interval`**: 定义更新地图的时间间隔(秒),默认值通常为 0.4 秒[^2]。 - **`linearUpdate`, `angularUpdate`**: 当机器人位移超过指定线性或角速度阈值时触发扫描匹配过程。 - **`particles`**: 粒子数越多,计算越精确但也更耗资源,默认值一般设为 80。 - **`maxUrange`**: 指定激光测距仪的最大有效测量范围(米)。此参数应根据实际使用的 LIDAR 性能设定[^3]。 #### 2. 如何根据具体型号调整 maxUrange 值? 对于不同的 LIDAR 类型,需依据设备规格手册中的最大探测距离来合理设置该参数。下面列举了几种常见品牌及其推荐取值范围作为参考: - **OSight (Osense)**: 这款固态 LiDAR 提供较远的有效检测能力,建议将其 `maxUrange` 设置为接近官方宣称的最大量程减去一定安全裕度后的数值,比如约等于7m至9m之间。 ```yaml maxUrange: 8.5 ``` - **RichBeam RLM Series**: 如果采用的是 RichBeam 生产的旋转式机械 Lidar,则可以根据产品系列的不同而有所差异;例如 RLM-16 可达 10 米左右,因此可相应地将此参量赋值如下所示: ```yaml maxUrange: 9.0 ``` - **RPLiDAR A3/A3M8 by Slamtec**: 对于此类经济实惠但性能可靠的平面扫瞄器而言,由于它们能够实现最远可达25米的距离读数,所以在这里我们可以大胆一点把上限提到更高水平上去尝试一下效果如何: ```yaml maxUrange: 24.0 ``` 注意:上述仅为指导性的初始配置方案,最终还是应该结合实验测试结果进一步微调优化这些超参数直至获得满意成果为止! #### 3. 实际操作流程概览 按照标准工作流完成整个系统的搭建部署之后,可以通过修改 launch 文件内的 `<param>` 字段或者创建独立 YAML 配置文件的方式来持久化存储自定义选项集。例如: ```xml <node pkg="gmapping" type="slam_gmapping" name="slam_gmapping"> <param name="base_frame" value="base_footprint"/> <param name="odom_frame" value="odom"/> <param name="map_update_interval" value="0.4"/> <param name="maxUrange" value="8.5"/> <!-- Adjust based on your sensor --> </node> ``` 或者利用 `.yaml` 方便管理复杂场景下的多组变量组合情况: ```yaml # gmapping_params.yaml base_frame: base_footprint odom_frame: odom map_update_interval: 0.4 maxUrange: 8.5 # Example for OSense OSight series lidars. ``` 随后只需确保对应的包路径被正确加载即可生效。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值