Web控件UI手动摇杆(虚拟手柄)

这篇具有很好参考价值的文章主要介绍了Web控件UI手动摇杆(虚拟手柄)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

html虚拟摇杆,小工具,开发语言,javascript,Powered by 金山文档

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

参数

说明

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 点击回调事件

摇杆主要代码:文章来源地址https://www.toymoban.com/news/detail-799639.html

/*
参数说明:
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))) {
                //X
                moveY = virtualRockerRadius;
                if (current_CrossDirection == "") current_CrossDirection = "X";
            }
            else {
                //Y
                moveX = 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 * k
        let bX = 2 * k * (b - n) - 2 * m
        let cX = m * m + (b - n) * (b - n) - r * r
    
        let insertPoints = []
        let xArr = quadEquationGetX(aX, bX, cX)
        xArr.forEach(function (x) {
            let y = k * x + b
            insertPoints.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 * c
        if (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手动摇杆(虚拟手柄)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 简易虚拟培训系统-UI控件的应用2

    目录 Text组件-文字显示 Text组件-文字动态显示 ScrollView组件 使用文件流动态读取硬盘文件   本篇介绍Text和ScrollView的简单应用,以及读取硬盘中.txt文本的内容 Text组件-文字显示   1. 加入Text:在mainCanvas上点右键-UI-选择Text和TextMeshPro都可以。   以下以TextMeshPro为例,第一次选

    2024年02月11日
    浏览(16)
  • 简易虚拟培训系统-UI控件的应用1

    目录 前言 UI结构总体介绍 建立初步的系统UI结构 Image控件 前言   前面的文章介绍了关于Oculus设备与UI控件的关联,从本文开始采用小示例的方式介绍基本的UI控件在系统中的基本作用(仅介绍“基本作用”,详细的API教程可参考官方文档)。应用的背景是工程场景类的虚拟培

    2024年02月10日
    浏览(23)
  • 简易虚拟培训系统-UI控件的应用3

    目录 Button组件的组成 Button组件方法1-在Button组件中设置OnClick()回调 Button组件方法2-在脚本中添加Button类的监听   上一篇使用了文件流读取硬盘数据并显示在Text组件中,本篇增加使用按钮来控制显示哪一篇文字信息。 Button组件的组成   1. 新建Button:如果使用的按键较多,可

    2024年02月10日
    浏览(22)
  • 利用Unity开发UI并接入HTC VIVE 手柄(基本上写完了,挖个坑12.1开完会更新)

    Unity 2018.3(之前用2021.3,教程比较少,自己复写很困难,就换了个版本)、HTC Vive Pro 2 专业套装、SteamVR 安装Unity资源包:SteamVR Plugin(SDK要求 1.14.15)、vive input unity、icons(可能还有补充) 比较重要的官方文档: 目前发现了两种做法 第①种将全景视频渲染到整个skybox,让天

    2024年02月05日
    浏览(64)
  • Unity UGUI一键绑定UI控件工具(编辑器拓展)

    全为一键生成 实现自动生成代码绑定UI控件 并生成字典保存UI控件 减少自己拖拽 和手动书写过程 适用动态加载面板 建议搭配UI框架使用 根据当前选中的gameobject 查找其下方是否有对应类型的控件 有就保存到字典中 然后通过向上递归拼凑地址,然后生成到粘贴板 直接粘贴到目

    2024年04月23日
    浏览(62)
  • 【你也能从零基础学会网站开发】Web建站之HTML+CSS入门篇 工欲善其事必先利其器 Dreamweaver安装教程 它依旧是初学者最好用的代码开发工具!

    🚀 个人主页 极客小俊 ✍🏻 作者简介:web开发者、设计师、技术分享博主 🐋 希望大家多多支持一下, 我们一起学习和进步!😄 🏅 如果文章对你有帮助的话,欢迎评论 💬点赞👍🏻 收藏 📂加关注 Dreamweaver介绍与历史 Dreamweaver是一款由Adobe开发的网页设计和开发软件,也

    2024年03月10日
    浏览(68)
  • 基于PyQt5的UI界面开发——对基本控件的介绍

    在PyQt中,控件是用户界面上的可见元素。控件可以包括按钮、标签、文本框、进度条等。每个控件都有自己的属性和方法,可以通过编程方式进行调整和操作。 以下是一些常用的PyQt控件: QLabel(标签):用于显示文本或图片的静态控件。 QPushButton(按钮):用于触发特定动

    2024年02月16日
    浏览(37)
  • Unity中使用VR手柄射线触发UI事件

    2024年02月11日
    浏览(46)
  • 软件测试/测试开发丨Selenium Web自动化测试 高级控件交互方法

    本文为霍格沃兹测试开发学社学员学习笔记分享 原文链接:https://ceshiren.com/t/topic/27045 使用场景 对应事件 复制粘贴 键盘事件 拖动元素到某个位置 鼠标事件 鼠标悬停 鼠标事件 滚动到某个元素 滚动事件 使用触控笔点击 触控笔事件(了解即可) https://www.selenium.dev/documentati

    2024年02月09日
    浏览(102)
  • 【ArcGIS Pro二次开发】(3):UI管理_显示隐藏Tab、Group、Control等控件

    在ArcGIS Pro工作中,有时候会涉及到工具栏UI的管理,比如,打开模型构建器时,工具栏才会出现新的选项卡(Tab)【ModelBuilder】,工程未做更改,则【保存】按钮显示灰色不可用。 下面以一个小例子来学习一下。 1、新建一个项目,命名为【UIManager】,再添加4个ArcGIS Pro 按钮【

    2024年02月08日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包