6

我正在尝试编写一个 .apk 来测量旋转 Android 设备的屏幕需要多长时间(循环几个旋转)。

我正在使用调用来setRequestedOrientation()将屏幕重新定向到 4 个位置(、PORTRAITLANDSCAPE)。REVERSE_PORTRAITREVERSE_LANDSCAPE

我的问题是我无法判断轮换何时完成。我尝试了一些解决方案,但每个都有自己的问题。

  1. 我尝试使用onConfigurationChanged(). 问题是当方向改变从传感器发生时,这个方法会被触发,而不是从setRequestedOrientation(). setRequestedOrientation()在我之前FULL_SENSOR调用.onConfigurationChangedsetRequestedOrientation()
  2. 我尝试setRequestedOrientation()通过添加一个while循环来检查屏幕方向(以度为单位)来进行某种“阻塞”。android.view.Display.getRotation()我之前打电话setRequestedOrientation()并用while循环阻塞,直到它改变。不幸的是,它也不起作用。它在 UI 重新显示之前返回。
  3. 我试图遵循活动的生命周期,等待onCreate()再次被调用,假设轮换完成。以前,我一直在循环,直到我的计数器达到一个值,在每次迭代调用setRequestedOrientation(). 在这种情况下,我的 while 循环变成了一个 if 语句,我假设onCreate每次都会调用该函数,但onCreate()在几次迭代后不会被调用。UI 似乎也没有重绘。
  4. 我在网上找到的最终解决方案(但还没有完全实现)是waitForIdleSync()setRequestedOrientation(). waitForIdleSync()是 Instrumentation 类的一部分,我认为这只是为了测试而不是标准的.apk。

任何想法都会受到欢迎。我将衷心感谢您的帮助。

4

2 回答 2

0

您应该尝试使用:http: //developer.android.com/reference/android/view/OrientationEventListener.html

您需要先调用 enable(),然后您会收到有关设备每次旋转更改的通知。

于 2013-01-27T08:12:26.563 回答
0

没有直接的方法可以知道何时setRequestedOrientation()通过 Android API 完成。唯一知道的方法是在调用它之前和调用它之后检查当前方向onCreate()

在你的Activity课堂上做:

long timeStamp;

public void onCreate(Bundle savedInstanceState) {
     if (savedInstanceState == null) {
          timeStamp = System.currentTimeMillis();     
     }
     else {
          timeStamp = savedInstanceState.getLong("state_time_stamp");
     }

     // For example, check how long it takes to switch from portrait to landscape. 
     // You can modify this part to check PORTRAIT, LANDSCAPE, REVERSE_PORTRAIT and REVERSE_LANDSCAPE.
     final int orientation = getResources().getConfiguration().orientation;    
     if (orientation == Configuration.SCREEN_ORIENTATION_PORTRAIT) {
          setRequestedOrientation(ActivityInfo.ORIENTATION_LANDSCAPE);
          return;
     }

     // We will reach here only after setRequestedOrientation() is done
     // and here's the time it took to change the orientation:
     final long elapsedTime = System.currentTimeMillis() - timeStamp; 
}

public void onSaveInstanceState(Bundle outState) {
     outState.putLong("state_time_stamp", timeStamp);
}
于 2015-07-24T08:57:49.673 回答