演示地址:http://tools.pt.wsing.cn/VirtualRocker/

源码下载地址:https://download.csdn.net/download/lyp1215/87583275

触摸屏手动摇杆,根据移动距离触发跟踪事件得到参数:

参数

说明

VirtualRockerID

手柄ID

evType

状态:开始、移动、停止

deltaX

X轴偏移量

deltaY

Y轴偏移量

方法:

名称

描述

参数

Init2Axis

初始一个2轴的控制UI

Init3Axis

初始一个3轴的控制UI

AddVirtualRocker

添加一个摇杆

diameter 手柄直径

x 手柄在页面显示位置 X 坐标

y 手柄在页面显示位置 Y 坐标

crossDirection 十字方向

xAxisNum 手柄移动的X坐标对应板卡轴编号

yAxisNum 手柄移动的Y坐标对应板卡轴编号

AddButton_Circle

添加圆形按钮

title 按钮文字

diameter 按钮直径

x 按钮在页面显示位置 X 坐标

y 按钮在页面显示位置 Y 坐标

AddButton_Radius

添加圆角按钮

title 按钮文字

diameter 按钮直径

x 按钮在页面显示位置 X 坐标

y 按钮在页面显示位置 Y 坐标

click_Callback 点击回调事件

摇杆主要代码:

/*
参数说明:
diameter        手柄直径
x               手柄在页面显示位置 X 坐标
y               手柄在页面显示位置 Y 坐标
crossDirection  十字方向
xAxisNum        手柄移动的X坐标对应板卡轴编号
yAxisNum        手柄移动的Y坐标对应板卡轴编号
*/
function AddVirtualRocker(diameter, x, y, crossDirection, xAxisNum, yAxisNum) {//添加摇杆crossDirection = crossDirection || false;var current_CrossDirection = "";var radius = diameter / 2;var virtualRockerDiameter = radius;var virtualRockerRadius = virtualRockerDiameter / 2;var $VirtualRockerBox = $("<div data-kq='control' data-type='VirtualRocker' class='VirtualRockerBox' style='width:" + diameter + "px;height:" + diameter + "px;border-radius:" + diameter + "px;left:" + x + "px; top:" + y + "px;'></div>");var $VirtualRocker = $("<div class='VirtualRocker' style='width:" + virtualRockerDiameter + "px;height:" + virtualRockerDiameter + "px;left:" + virtualRockerRadius + "px; top:" + virtualRockerRadius + "px;'></div>");$("body").append($VirtualRockerBox);$VirtualRockerBox.append($VirtualRocker);if (crossDirection) {var $VirtualRockerLineX = $("<div class='VirtualRockerLineX' style='left:0px; top:" + radius + "px;'></div>");var $VirtualRockerLineY = $("<div class='VirtualRockerLineY' style='left:" + radius + "px; top:0px;'></div>");$VirtualRockerBox.append($VirtualRockerLineX);$VirtualRockerBox.append($VirtualRockerLineY);}var virtualRockerMove = false;var startX, startY, moveEndX, moveEndY;var virtualRockerStartX, virtualRockerStartY;var hammer1 = "";var hammer2 = "";var vid = ++_virtualRockerID;var panId = 0;var hammerVirtualRocker = new Hammer($VirtualRocker[0]);hammerVirtualRocker.get('pan').set({ direction: Hammer.DIRECTION_ALL });hammerVirtualRocker.on('panstart panmove panend pancancel', function (ev) {if (vid == 1) {hammer1 += (++panId) + ".VirtualRockerID:" + vid + " evType:" + ev.type + " deltaX:" + ev.deltaX + " deltaY:" + ev.deltaY + "<br>";$("#divTips2").html(hammer1);}else if (vid == 2) {hammer2 += (++panId) + ".VirtualRockerID:" + vid + " evType:" + ev.type + " deltaX:" + ev.deltaX + " deltaY:" + ev.deltaY + "<br>";$("#divTips2").html(hammer2);}if (ev.type == "panstart") {panStart(ev);}else if (ev.type == "panmove") {panMove(ev);}else if (ev.type == "panend" || ev.type == "pancancel") {panEnd(ev);}});function panStart(e) {/    /开始移动startX = e.deltaX;startY = e.deltaY;virtualRockerStartX = $VirtualRocker.position().left;virtualRockerStartY = $VirtualRocker.position().top;virtualRockerMove = true;};function panMove(e) {if (!virtualRockerMove) return;moveEndX = e.deltaX;moveEndY = e.deltaY;var moveX = moveEndX - startX, moveY = moveEndY - startY;moveX += virtualRockerStartX;moveY += virtualRockerStartY;//超出宽度if (moveX <= -virtualRockerRadius) moveX = -virtualRockerRadius;if ((moveX + virtualRockerDiameter) > (diameter + virtualRockerRadius)) moveX = (diameter - virtualRockerRadius);if (moveY <= -virtualRockerRadius) moveY = -virtualRockerRadius;if ((moveY + virtualRockerDiameter) > (diameter + virtualRockerRadius)) moveY = (diameter - virtualRockerRadius);//遥感内圈圆点var virtualRockerX = moveX + virtualRockerRadius, virtualRockerY = moveY + virtualRockerRadius;//移动的距离大于半径时var moveRadius = Math.sqrt(Math.pow(Math.abs((virtualRockerX) - radius), 2) + Math.pow(Math.abs((virtualRockerY) - radius), 2));if (moveRadius > radius) {var isLeft = virtualRockerX - radius < 0;var isTop = virtualRockerY - radius < 0;var p = GetPoint(radius, radius, virtualRockerX, virtualRockerY, radius, radius, radius);if (isLeft) p = p[1];else p = p[0];moveX = p.x - virtualRockerRadius;moveY = p.y - virtualRockerRadius;}var isLeft = (moveX + virtualRockerRadius) - radius < 0;var isRight = (moveX + virtualRockerRadius) - radius > 0;var isTop = (moveY + virtualRockerRadius) - radius < 0;var isBottom = (moveY + virtualRockerRadius) - radius > 0;if (crossDirection) {//十字方向if (current_CrossDirection == "") {if (parseInt(Math.abs(moveX - radius + virtualRockerRadius)) > parseInt(Math.abs(moveY - radius + virtualRockerRadius))) {//XmoveY = virtualRockerRadius;if (current_CrossDirection == "") current_CrossDirection = "X";}else {//YmoveX = virtualRockerRadius;if (current_CrossDirection == "") current_CrossDirection = "Y";}}else {if (current_CrossDirection == "X") {moveY = virtualRockerRadius;}else if (current_CrossDirection == "Y") {moveX = virtualRockerRadius;}}}var posX = parseInt(moveX - radius + virtualRockerRadius);var posY = -parseInt(moveY - radius + virtualRockerRadius);//var text = _isOpenGas ? "已连接" : "未连接";text += " ";text += isLeft ? "左" : isRight ? "右" : "";text += isTop ? "上" : isBottom ? "下" : "";text += " ";text += " X(" + xAxisNum + "):" + posX;text += " Y(" + yAxisNum + "):" + posY;$("#divTips").text(text);//if (_isOpenGas && (xAxisNum != 0 || yAxisNum != 0)) {//摇杆JsInterface.VirtualRocker(xAxisNum, yAxisNum, posX, posY, function (flag, msg) {if (!flag) {$("#divTips").text(msg);}});}$VirtualRocker.css({ left: moveX + "px", top: moveY + "px" });ShowVirtualRockerInfo(moveX, moveY);};function panEnd(e) {//停止移动virtualRockerMove = false;current_CrossDirection = "";if (_isOpenGas) {//停止运动JsInterface.Stop(function (flag, msg) {if (!flag) {Wsfly.Tips.Info(msg);}});}$VirtualRocker.css({ left: virtualRockerRadius + "px", top: virtualRockerRadius + "px" });HideVirtualRockerInfo();};function ShowVirtualRockerInfo(moveX, moveY) {//显示摇杆信息var isLeft = (moveX + virtualRockerRadius) - radius < 0;var isRight = (moveX + virtualRockerRadius) - radius > 0;var isTop = (moveY + virtualRockerRadius) - radius < 0;var isBottom = (moveY + virtualRockerRadius) - radius > 0;var text = isLeft ? "左" : isRight ? "右" : "";text += isTop ? "上" : isBottom ? "下" : "";text += "X:" + parseInt(Math.abs(moveX - radius + virtualRockerRadius));text += " Y:" + parseInt(Math.abs(moveY - radius + virtualRockerRadius));$("#divVirtualRockerInfo").text(text);}function HideVirtualRockerInfo() {$("#divVirtualRockerInfo").text("");}/*** 求圆和直线之间的交点* 直线方程:y = kx + b* 圆的方程:(x - m)² + (x - n)² = r²* x1, y1 = 线坐标1, x2, y2 = 线坐标2, m, n = 圆坐标, r = 半径*/function GetPoint(x1, y1, x2, y2, m, n, r) {let kbArr = binaryEquationGetKB(x1, y1, x2, y2)let k = kbArr[0]let b = kbArr[1]let aX = 1 + k * klet bX = 2 * k * (b - n) - 2 * mlet cX = m * m + (b - n) * (b - n) - r * rlet insertPoints = []let xArr = quadEquationGetX(aX, bX, cX)xArr.forEach(function (x) {let y = k * x + binsertPoints.push({ x: x, y: y })})return insertPoints}/*** 求二元一次方程的系数* y1 = k * x1 + b => k = (y1 - b) / x1* y2 = k * x2 + b => y2 = ((y1 - b) / x1) * x2 + b*/function binaryEquationGetKB(x1, y1, x2, y2) {let k = (y1 - y2) / (x1 - x2)let b = (x1 * y2 - x2 * y1) / (x1 - x2)return [k, b]}/*** 一元二次方程求根* ax² + bx + c = 0*/function quadEquationGetX(a, b, c) {let xArr = []let result = Math.pow(b, 2) - 4 * a * cif (result > 0) {xArr.push((-b + Math.sqrt(result)) / (2 * a))xArr.push((-b - Math.sqrt(result)) / (2 * a))} else if (result == 0) {xArr.push(-b / (2 * a))}return xArr}
};

Web控件UI手动摇杆(虚拟手柄)相关推荐

  1. 使用 TreeView IE Web 控件

    使用 TreeView IE Web 控件 摘要:了解 TreeView Web 控件,并学习如何在 ASP.NET Web 应用程序中使用 TreeView Web 控件.除了标准的 ASP.NET ...

  2. Asp.net 实现验证码功能的Web控件

          Asp.net的设计方式和设计理念和其他的如Asp,Jsp,Php,Perl 等都不一样,几乎是完全的面向对象设计!代码的复用就是其 中差异较大的特点之一,Asp.net除了可以用Incl ...

  3. [原]动态创建Web控件制做计算器

    最近参加了Web基础开发的培训,收获不少,做了一个练习,在后台动态创建控件制作了一个简单功能的计算器.程序中控件创建好以后,往往不能放在想要的位置,前台的布局非常麻烦,我用Table.TableRow ...

  4. [转]利用ASP.NET 2.0创建自定义Web控件(1)

    原址:http://hi.baidu.com/sjbh/blog/item/cc58fd1bd35d3ad2ad6e7593.html   简介 从使用基本的文本编辑器到创作标记页面,Web 开发已经 ...

  5. 自定义服务器控件(扩展现有 Web 控件)

    很多情况下,你并不需要从头开始创建一个新控件.有些功能也许在 ASP.NET 的 Web 控件的基本集合中已经存在了.所有这些控件都是普通类,你可以组合它们(使用其他类的实例来创建一个新类)或者继承它 ...

  6. 如何编写自定义的Web控件

    建一个自定义的Web控件MyContro的步骤: 1)引用 using System; using System.IO; using System.Drawing; using System.Web. ...

  7. Asp.Net Web控件 (八)(TabControl 选项卡控件)

    在项目开发中经常会用到选项卡控件,网上也有很多,其实只是简单的功能,很多却实现的很复杂,功能很强大,并不是我需要的. 下面来实现一个简单的TabControl . 先看演示: 位置:TabContor ...

  8. 免费打工仔:一个完善的ActiveX Web控件教程

    免费打工仔:一个完善的ActiveX Web控件教程 出自Ogre3D开放资源地带 跳转到: 导航, 搜索 原作者 David Marcionek. 翻译 免费打工仔 这个教程可以帮助你快速开发一个A ...

  9. 一个完善的ActiveX Web控件教程

    免费打工仔:一个完善的ActiveX Web控件教程 出自Ogre3D开放资源地带 跳转到:  导航,  搜索 原作者 David Marcionek. 翻译 免费打工仔 这个教程可以帮助你快速开发一 ...

最新文章

  1. 5G:4G到5G的演进,整体网络架构的主要区别。
  2. 银河麒麟安装远程桌面
  3. python区域增长_Python – 有效地为高密度区域创建密度图,稀疏区域的点
  4. Java中key可以重复的Map集合:IdentityHashMap
  5. 前端学习(1045):todolist本地存储加载到页面
  6. gzip,bzip2
  7. zabbix监控进程的CPU和内存占用量
  8. VS2012 使用条件断点和内存断点
  9. Linux 用户he用户组管理
  10. linux ping 虚拟网卡_Linux下添加虚拟网卡,实现一块物理网卡绑定多个IP地址
  11. 零基础起步Keras+LSTM+CRF的实践命名实体识别NER
  12. 关于调用ArcGIS中GP工具.Erase、SymDiff
  13. Gitlab项目迁移
  14. HBuilderX报错:ESC[0;31m--> LibSass的二进制文件.....]
  15. 2021信息安全工程师学习笔记(二十四)
  16. matlab 画标准正态曲线,matlab中如何画标准正态分布的密度函数曲线?
  17. 公司股权等比稀释是什么意思
  18. matplotlib中的imshow()绘图长宽比例失调,调整长宽比(备忘)
  19. java ipv6校验_IPV6地址校验(java)
  20. java游戏 飞机对战

热门文章

  1. 艾媒报告 | 2016 年中国 APP 活跃用户排行榜(Top450)
  2. 无良公司把我从上家挖过来,白嫖了六个月,临近试用期结束才说不合适,催我赶紧找下家!...
  3. Excel中用函数按照某字段分列取得指定字段的值
  4. python程序员专用壁纸_Python开发专属壁纸下载与轮换程序
  5. 【每周一本书】之《人之彼岸》:郝景芳带你提前踏入人机交互的未知世界
  6. 紫光展锐六款芯片支持Android 11,SC9863A备受手机厂商青睐
  7. 自动化编程 ai_使用AI自动化在线采购
  8. Swift 系统学习 09 repeat while
  9. O2O与B2B、B2C、C2C之间的区别
  10. postman mac (安装 汉化)