使用陀螺仪模拟IOS系统的水平仪

向右看齐 2023-07-21 15:28 94阅读 0赞

前言

好久都没有正式的敲过代码了,今天决定使用 HTML5 中的陀螺仪模拟一下 IOS 系统的水平仪,而 Canvas 画布也有很长一段时间没有使用,顺带的复习一下 Canvas 画布的 API

文章目录

  • 前言
    • 效果
    • 创建画布
    • 获取陀螺仪参数
    • 绘制倾斜的角度
    • 清除画布
    • 渲染页面
    • 绘制圆形
    • 水平后的效果
  • 总结

效果

苹果系统的水平仪效果如下,不过在由于 IOS 系统将陀螺仪列入了用户隐私,所以 IOS 系统需要在 HTTP 协议中打开是无法获取到陀螺仪的参数信息,如需测试,请使用安卓测试。
在这里插入图片描述

创建画布

首先创建一个背景为黑色的画布,至于宽度和高度需要通过 document 获取

  1. <canvas id="myCanvas" style="background-color: black;"></canvas>
  2. // 获取文档的宽高
  3. const documentWidth = document.documentElement.clientWidth;
  4. const documentHeight = document.documentElement.clientHeight;
  5. // 获取画布
  6. var c = document.getElementById("myCanvas");
  7. // 设置画布的宽高
  8. c.width = documentWidth;
  9. c.height = documentHeight;

获取陀螺仪参数

监听 deviceorientation 事件获取陀螺仪参数,电脑上显示陀螺仪的参数是为 null

  1. window.addEventListener("deviceorientation", function(event) {
  2. console.log(event)
  3. })

在这里插入图片描述






















参数 描述
alpha 指南针(0~360°)为 0 的时候指向北
beta 手机短边倾斜的角度(-90°~90°)
gamma 手机长边倾斜的角度(-90°~90°)

绘制倾斜的角度

我们先来绘制一下中间的文本,因为有两个方向,所以我们需要判断 betagamma 的倾斜角度,展示大的倾斜角。

  1. function ctxBeta(beta, gamma) {
  2. var ctx = c.getContext("2d");
  3. ctx.fillStyle = 'white';
  4. ctx.font = "100px Arial";
  5. ctx.textBaseline = 'middle';
  6. ctx.textAlign = 'center';
  7. // 判断倾斜角度,展示倾斜角度大的数值
  8. ctx.fillText(Math.abs(gamma) > Math.abs(beta) ? gamma + '°' : beta + '°', documentWidth / 2, documentHeight / 2);
  9. }

清除画布

绘制画布前需要清除画布,下一次渲染不会有上一次的画面。

  1. function clearCanvas() {
  2. var cxt = c.getContext("2d");
  3. cxt.clearRect(0, 0, c.width, c.height);
  4. }

渲染页面

  1. window.addEventListener("deviceorientation", function(event) {
  2. // 数据精度太长,四舍五入处理
  3. let Beta = Math.ceil(event.beta);
  4. let Gamma = Math.ceil(event.gamma);
  5. clearCanvas(); // 清除画布
  6. ctxBeta(Beta, Gamma); // 渲染倾斜角度
  7. })

看看效果,当我左右摇晃手机时数值会不断变化

在这里插入图片描述

绘制圆形

圆形的位置会随着 beta 值和 gamma 值得变化而变化。

  1. function ctxarcone(beta, gamma) {
  2. var ctx = c.getContext("2d");
  3. ctx.globalCompositeOperation = "xor";
  4. ctx.beginPath();
  5. ctx.arc(documentWidth / 2 - gamma, documentHeight / 2 - beta, 200, 0, 2 * Math.PI);
  6. ctx.fillStyle = 'white';
  7. ctx.fill();
  8. ctx.stroke();
  9. }
  10. function ctxarctwo(beta, gamma) {
  11. var ctx = c.getContext("2d");
  12. ctx.globalCompositeOperation = "xor";
  13. ctx.beginPath();
  14. ctx.arc(documentWidth / 2 + gamma, documentHeight / 2 + beta, 200, 0, 2 * Math.PI);
  15. ctx.fillStyle = 'white';
  16. ctx.fill();
  17. ctx.stroke();
  18. }

将绘制函数放在监听函数里渲染,为什么要将值乘 10 是因为 beta 值和 gamma 值本身偏小,按照倍数方法后圆形移动的距离更长,效果更好。

  1. window.addEventListener("deviceorientation", function(event) {
  2. let Beta = Math.ceil(event.beta);
  3. let Gamma = Math.ceil(event.gamma);
  4. clearCanvas(); // 清除画布
  5. ctxBeta(Beta, Gamma); // 绘制倾斜角度
  6. ctxarcone(Beta * 10, Gamma * 10); // 绘制圆形
  7. ctxarctwo(Beta * 10, Gamma * 10); // 绘制圆形
  8. })

看效果
在这里插入图片描述

水平后的效果

  1. if (Beta == 0 && Gamma == 0) {
  2. c.style = 'background-color: #65C466;'
  3. } else {
  4. c.style = 'background-color: black;'
  5. }

总结

陀螺仪的功能就已近完成了,已经将其放在我的个人服务器上,请在安卓手机上查看,由于很久都没有写项目,很多API都已经生疏,在做这个案例的时候需要去翻阅以前的博客笔记,效率非常慢,需要以后多加练习,弥补自己的不足。

发表评论

表情:
评论列表 (有 0 条评论,94人围观)

还没有评论,来说两句吧...

相关阅读

    相关 加速计和陀螺

    前言 最近因为工作需要对加速计和陀螺仪进行学习和了解,过程中有所收获。 正文 一、加速计 iPhone在静止时会受到地球引力,以屏幕中心为坐标原点,建立一个...

    相关 加速计陀螺信息采集

    Sensor.TYPE\_GYROSCOPE 陀螺仪就是内部有一个陀螺,它的轴由于陀螺效应始终与初始方向平行,这样就可以通过与初始方向的偏差计算出实际方向。手机里陀螺