android - 钛/Appcelerator 合金无法正​​确检测方向变化

标签 android titanium appcelerator appcelerator-titanium titanium-alloy

在使用钛检测方向时,我有一些奇怪的行为。

代码

这是我在 index.js 上使用的代码:

// Start code
Ti.API.info('Orientation: ' + Ti.Gesture.orientation);
Ti.API.info('Portrait: ' + Ti.Gesture.portrait);
Ti.API.info('Landscape: ' + Ti.Gesture.landscape);
Ti.API.info(Ti.Platform.displayCaps.platformWidth + ' x ' + Ti.Platform.displayCaps.platformHeight);

// Code when orientation changes
Ti.Gesture.addEventListener('orientationchange',function(e) {
    Ti.API.info('orientation changed!');
    Ti.API.info('Orientation: ' + e.orientation);
    Ti.API.info('Portrait: ' + e.source.isPortrait());
    Ti.API.info('Landscape: ' + e.source.isLandscape());
    Ti.API.info(Ti.Platform.displayCaps.platformWidth + ' x ' + Ti.Platform.displayCaps.platformHeight);    
});

初始

  • 我在 Nexus 6 上使用 Andriod 模拟器。
  • 我从 0 度(正常纵向位置)开始应用程序。

程序启动时我得到以下输出:

Orientation: 1        (Same as Ti.UI.PORTRAIT)
Portrait: true
Landscape: false
1440 x 2392

90度

将手机旋转到90 度 位置时,甚至不会触发该事件! 为什么不呢?

180度

再次顺时针旋转到 180 度 位置会触发事件并在控制台上给出以下正确值:

orientation changed!
Orientation: 4         (Same as Ti.UI.LANDSCAPE_RIGHT)
Portrait: false
Landscape: true
2392 x 1440

(请注意,尽管手机在技术上是纵向的,但由于手机的方向是错误的,因此应用程序会以横向显示。这是 Android 的预期行为)

270度

再次顺时针旋转到 270 度 位置会触发事件并给出以下正确值:

orientation changed!
Orientation: 4         (Same as Ti.UI.LANDSCAPE_RIGHT. Should be Ti.UI.LANDSCAPE_LEFT?)
Portrait: false
Landscape: true
2392 x 1440

0度

但是,当再次顺时针旋转时(回到 0 度),我得到了不正确的值:

orientation changed!
Orientation: 2         (Same as Ti.UI.UPSIDE_PORTRAIT)
Portrait: false
Landscape: true
2392 x 1440

注意如何:

  • 它声称在应该是纵向模式时处于横向模式
  • e.orientation 似乎给出了 Ti.UI.UPSIDE_PORTRAIT 的半正确结果,而它应该是 Ti.UI.PORTRAIT .没什么大不了的。
  • 宽度和高度被翻转了(可能是因为它认为它仍然是横向的)!

问题

  1. 为什么第一次轮换没有触发事件!
  2. 为什么最后一次旋转显示的所有值都不正确。

最佳答案

orientationchange 监听器中,如果您检查 e.orientation 并将其与正常方向常量(Ti.UI.PORTRAIT, Ti.UI.UPSIDE_PORTRAIT、Ti.UI.LANDSCAPE_LEFT、Ti.UI.LANDSCAPE_RIGHT)。

这是因为还有其他方向(FACE_DOWN、FACE_UP),有一次我疯狂地试图理解为什么我的一些客户有时会注意到一些“闪烁”(从 FACE_DOWNFACE_UP)。

此外:使用真实设备测试您的监听器,因为在模拟器中测试orientationchange事件几乎完全没有用。

关于android - 钛/Appcelerator 合金无法正​​确检测方向变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42927033/

相关文章:

javascript - 在钛的本地数据库中插入特殊字符

ios - Titanium Appcelerator PUT方法不起作用

android - Appcelerator 更改应用程序名称部署应用程序的两个实例

ios - app.js不是由Alloy创建的。 [找不到文件app.js]错误

javascript - 函数遍历循环并工作一次但再也不会

java - Android 在 AsyncTask onPostExecute 中使用 Interface 返回值

Javascript 和 Titanium - 无法读取 XML 文本节点

方向更改后,Android 找不到 fragment View

android - 使用数组作为公共(public)数组来保存随机数生成

android - 在 Android 中定位 subview