class Orientation extends eruda.Tool {
constructor() {
super()
this.name = 'orientation'
this.displayName = 'デバイスの回転'
}
init($el) {
super.init($el)
this._style = eruda.util.evalCss(
[
'.eruda-dev-tools .eruda-tools .eruda-orientation {',
' padding: 10px;',
' font-family: Arial, sans-serif;',
'}',
'.eruda-cube {',
' width: 100px;',
' height: 100px;',
' margin: 10px auto;',
' background: #eee;',
' border: 1px solid #ccc;',
' transform-style: preserve-3d;',
' transition: transform 0.3s ease;',
'}',
'.eruda-coordinates, .eruda-acceleration, .eruda-acceleration-including-gravity, .eruda-rotation-rate, .eruda-interval {',
' margin-top: 5px;',
' font-size: 12px;',
' color: #333;',
'}',
'.eruda-not-supported {',
' color: red;',
' text-align: center;',
' padding: 20px;',
'}',
].join('')
)
const isSupported =
window.DeviceOrientationEvent && window.DeviceMotionEvent
if (!isSupported) {
$el.html(
'
Not supported for this browser!
'
)
} else {
$el.html(
[
'',
'Alpha: 0, Beta: 0, Gamma: 0
',
'Acceleration: 0, 0, 0
',
'Acceleration Including Gravity: 0, 0, 0
',
'Rotation Rate: 0, 0, 0
',
'Interval: 0
',
].join('')
)
this._$cube = $el.find('.eruda-cube')
this._$coordinates = {
alpha: $el.find('.alpha'),
beta: $el.find('.beta'),
gamma: $el.find('.gamma'),
}
this._$acceleration = {
x: $el.find('.eruda-acceleration .x'),
y: $el.find('.eruda-acceleration .y'),
z: $el.find('.eruda-acceleration .z'),
}
this._$accGravity = {
xg: $el.find('.eruda-acceleration-including-gravity .xg'),
yg: $el.find('.eruda-acceleration-including-gravity .yg'),
zg: $el.find('.eruda-acceleration-including-gravity .zg'),
}
this._$rotationRate = {
alpha: $el.find('.alpha-rate'),
beta: $el.find('.beta-rate'),
gamma: $el.find('.gamma-rate'),
}
this._$interval = $el.find('.interval')
this._bindEvent()
}
}
_bindEvent() {
this._onDeviceorientation = (event) => {
if (!this._isShow) return
const { alpha, beta, gamma } = event
this._$coordinates.alpha.text(alpha.toFixed(2))
this._$coordinates.beta.text(beta.toFixed(2))
this._$coordinates.gamma.text(gamma.toFixed(2))
// 回転キューブの回転
this._$cube.css(
'transform',
`rotateZ(${alpha}deg) rotateX(${beta}deg) rotateY(${gamma}deg)`
)
}
this._onDevicemotion = (event) => {
if (!this._isShow) return
const acc = event.acceleration
const accG = event.accelerationIncludingGravity
const rotRate = event.rotationRate
const interval = event.interval
if (acc) {
this._$acceleration.x.text(acc.x ? acc.x.toFixed(2) : '0')
this._$acceleration.y.text(acc.y ? acc.y.toFixed(2) : '0')
this._$acceleration.z.text(acc.z ? acc.z.toFixed(2) : '0')
}
if (accG) {
this._$accGravity.xg.text(accG.x ? accG.x.toFixed(2) : '0')
this._$accGravity.yg.text(accG.y ? accG.y.toFixed(2) : '0')
this._$accGravity.zg.text(accG.z ? accG.z.toFixed(2) : '0')
}
if (rotRate) {
this._$rotationRate.alpha.text(rotRate.alpha ? rotRate.alpha.toFixed(2) : '0')
this._$rotationRate.beta.text(rotRate.beta ? rotRate.beta.toFixed(2) : '0')
this._$rotationRate.gamma.text(rotRate.gamma ? rotRate.gamma.toFixed(2) : '0')
}
this._$interval.text(interval ? interval.toFixed(2) : '0')
}
window.addEventListener('deviceorientation', this._onDeviceorientation)
window.addEventListener('devicemotion', this._onDevicemotion)
}
show() {
super.show()
this._isShow = true
}
hide() {
super.hide()
this._isShow = false
}
destroy() {
super.destroy()
eruda.util.evalCss.remove(this._style)
window.removeEventListener('deviceorientation', this._onDeviceorientation)
window.removeEventListener('devicemotion', this._onDevicemotion)
}
}
module.exports = Orientation