1

我试图弄清楚 iMobileDevice 如何知道何时旋转视口。我的预感是它与加速度计有关,因为视口的旋转似乎取决于它与重力的线性关系(而不是它相对于自身的旋转关系)。

我使用 iPad 的AccelerationIncludivinGravity 属性对此做了一些粗略的探索,发现x、y 和z 的[portrait -> landscape] 值与x、y 和z 的[landscape -> portrait] 值不同。

在我最初的测试中,我发现纵向到横向的旋转事件发生在 (x,y,z) = (8.5, 6.8, 0),横向到纵向的旋转事件发生在 (x,y,z) = (4.5, 6.8, 0)。

然而,我意识到,系统地继续这个测试是困难的、不可靠的和耗时的,而且由于设备似乎始终知道何时旋转视口,所以有程序员也知道这一点是有道理的。

你们谁能告诉我iMobileDevice知道何时旋转视口的方法,例如,如果有一个方程(或表格或其他什么)考虑到方向和加速度包括重力值,或者它是否完全是别的东西?

4

1 回答 1

0

这不是一个完整的答案,但我确实开发了一个记录旋转数据的测试,并想在此处发布(对收集的数据进行一般分析),以便其他人可以想出更好的方法来测试它或分析数据,欢迎他们参与。

对于测试,我将以下 javascript 代码放在一个 <script> 标记内,该标记位于一个框架 HTML 文档中:

var ax, ay, az;

window.addEventListener("devicemotion", function(e) { // DO NOT PUT ALERTS IN THIS LISTENER BLOCK!!
   ax = e.accelerationIncludingGravity.x;
   ay = e.accelerationIncludingGravity.y;
   az = e.accelerationIncludingGravity.z;
}, false);

window.addEventListener("orientationchange", function() {
   orient = Math.abs(parseInt(window.orientation)); // returns positive integer value of device orientation
   // It's worth noting that on an iPad, the orientationchange event does not
   // fire until after the rotation has already taken place, so a value of 0 or 
   // 180 corresponds to the accelerometer values for a Landscape-Portrait
   // rotation, while a value of 90 corresponds to the accelerometer values for
   // a Portrait-Landscape rotation event.
   ax = Math.abs(ax);
   ay = Math.abs(ay);
   az = Math.abs(az);
   //I put an ajax call here that sends orient, ax, ay and az as $_POST data to a PHP document
}, false);

这是该 PHP 文档中的相关 PHP 代码:

<?php
//I stored my $_POST variables as $orient, $ax, $ay, and $az for consistency
$XYangle = rad2deg(atan($ay/$ax));
$XZangle = rad2deg(atan($az/$ax));
$YZangle = rad2deg(atan($az/$ay));

//tab-delimit the data and enter it into a .txt file that can be imported into Excel for "easy" reading and sorting
$string = $orient."\t".$ax."\t".$ay."\t".$az."\t".$XYangle."\t".$XZangle."\t".$YZangle."\n";

//Open file and write $string to file
?>

设置好之后,我拿起 iPad,在我能想到的尽可能多的方向(相对于重力)上缓慢旋转了数百次。然后,我将记录的数据导入 Excel 文件,并以各种方式对其进行排序,直到开始出现趋势。

你问这些趋势是什么?我的分析是初步的,并不一定能解释在我看来像异常值的东西,但它看起来像:

仅当 XYangle < 28 时才会发生纵向-横向旋转事件。但是,随着 az 值的增加(您将 iPad 相对于地面变平),看起来 XYangle 必须减小。似乎 az 越接近 9.8,旋转事件就越难以预测。

仅当 XYangle > 45 时才会发生 Landscape-Portrait 旋转事件。同样,随着 az 值的增加,XYangle 也必须增加。此外,随着 az 接近 9.8,旋转事件变得难以预测。

我希望这可以为某人提供更好的测试和更好的分析的良好起点。我打算在 iOS 旋转错误修复中使用这些数据,类似于 Scott Jehl 在这里所做的:https ://github.com/scottjehl/iOS-Orientationchange-Fix ,到目前为止我已经很好地使用了它,但它仍然不是一个非常干净的解决方案,尤其是当用户将移动设备展平时。

我希望我的分析遗漏了一些东西,一个更细心的人可以用来微调轮换事件的可预测性。

于 2012-08-16T02:02:25.137 回答