前提・実現したいこと
タブレットやスマホでブラウザからアクセスした際に、カメラ映像の上にChart.jsのグラフ領域を重ね合わせて、縦軸を端末の傾き(地面に対して端末が垂直の状態を0.0°として-180.0~180.0の範囲を表示)、横軸をコンパス情報(真北を向いた状態を0.0°として0.0~359.9の範囲を表示)にしたいと考えております。
グラフを100ms毎に更新して端末の傾きに追従してy軸の値が変化することは確認できたのですが、y軸の値によってグラフ領域が若干ですが伸縮してしまうことを確認いたしました。y軸に指定する値の文字数が変化しているためと思われます。
発生している問題・エラーメッセージ
Chart.jsで表示しているグラフについて、y軸の値によらずグラフ領域が伸縮されることを回避したいと考えているのですが、方法をご存知のかたご教示願えますでしょうか。
該当のソースコード
css
1@media all and (orientation: portrait) { 2 .chartview { 3 position: absolute; 4 top: 0.5rem; 5 right: 24px; 6 bottom: 5px; 7 z-index: 3; 8 } 9}
html
1<div class="col-auto mx-auto"> 2 <video id="video" class="camera" autoplay playsinline="true" style="width:100%;height:450px;"></video> 3 <canvas id="chartview" class="chartview" style="width:100%;height:490px;"></canvas> 4</div>
javascript
1const VERTICAL_NUM = 11; 2const SIDE_NUM = 9; 3 4var betaVal = 0.000; 5var directionVal = 0.000; 6window.addEventListener("deviceorientation", function(eventOrient) { 7 // ベータ軸 8 betaVal = eventOrient.beta; 9 if (betaVal == null) { 10 betaVal = 0.0; 11 } 12 13 // 方位 14 directionVal = eventOrient.webkitCompassHeading; 15 if (directionVal == null) { 16 directionVal = 0.0; 17 } 18}); 19 20var ctx = document.getElementById('chartview').getContext('2d'); 21var chartView = new Chart(ctx, { 22type: 'category', 23options: { 24 responsive: false, 25 maintainAspectRatio: false, 26 // 凡例非表示 27 legend: { 28 display: false 29 }, 30 // アニメーション停止 31 animation: { 32 duration: 0, 33 }, 34 hover: { 35 animationDuration: 0, 36 }, 37 responsiveAnimationDuration: 0, 38 } 39}); 40 41function scalePortrait(chart) { 42 var posx = 0 - ((SIDE_NUM / 2) | 0); 43 var posy = 0 - ((VERTICAL_NUM / 2) | 0); 44 var val = 0.0; 45 var xlabelArray = []; 46 var yLabelArray = []; 47 48 // 現在のコンパス情報からx軸方向のラベルを取得 49 for (var i = 0; i < SIDE_NUM; i++, posx++) { 50 val = directionVal + (posx * 10); 51 if (val < 0.0) { 52 val += 360.0; 53 } else if (360.0 <= val) { 54 val -= 360.0; 55 } 56 if (val == 360.0) { 57 val = 0.0; 58 } 59 xlabelArray.push(val.toFixed(1).toString()); 60 } 61 62 // 現在の傾きからy方向のラベルを取得 63 for (var i = 0; i < VERTICAL_NUM; i++, posy++) { 64 val = (betaVal - 90) + (posy * 10); 65 yLabelArray.push(val.toFixed(1).toString()); 66 } 67 68 // 軸ラベル設定 69 chart.options.scales = { 70 xAxes:[{ 71 type : 'category', 72 labels : xlabelArray, 73 ticks : { 74 maxRotation: 0, 75 minRotation: 0 76 }, 77 gridLines: { 78 color : 'rgba(255, 255, 255, 0.5)', 79 borderDash: [4, 1] 80 } 81 }], 82 yAxes:[{ 83 type : 'category', 84 labels : yLabelArray, 85 ticks : { 86 maxRotation: 0, 87 minRotation: 0 88 }, 89 gridLines: { 90 color : 'rgba(255, 255, 255, 0.5)', 91 borderDash: [4, 1] 92 } 93 }] 94 } 95 chart.update(); 96} 97 98function chartUpdate() { 99 scalePortrait(chartView); 100} 101setInterval(chartUpdate, 100);
該当のソースコード
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。