方案一

通过 getResources().getConfiguration().orientation 可以获取到当前的屏幕方向,有两种取值 ORIENTATION_LANDSCAPE 和 ORIENTATION_PORTRAIT。这样我们通过对比就可以判断出当前的方向:

public String getOrientation(Context ctx){
    if (ctx.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
        //竖屏
        return "portrait";
    else {
        //横屏
        return "landscape";
    }
}

方案二

实现 android.view.OrientationEventListener 抽象类的 onOrientationChanged 方法,onOrientationChanged 获取到的 “orientation” 范围是从 0 到 359。0 代表手机正放、竖直方向,90 代表从 0 顺时针旋转 90 度,以此类推。更多的内容可以参考神策 Android SDK 中的实现

public abstract class OrientationEventListener {
    /**
     * Called when the orientation of the device has changed.
     * orientation parameter is in degrees, ranging from 0 to 359.
     * orientation is 0 degrees when the device is oriented in its natural position,
     * 90 degrees when its left side is at the top, 180 degrees when it is upside down,
     * and 270 degrees when its right side is to the top.
     * {@link #ORIENTATION_UNKNOWN} is returned when the device is close to flat
     * and the orientation cannot be determined.
     *
     * @param orientation The new orientation of the device.
     *
     *  @see #ORIENTATION_UNKNOWN
     */
    abstract public void onOrientationChanged(int orientation)
}

方案对比

方案一使用较为简单,只需要有 Context 对象就可以获取到当前的屏幕方向。但该方案有一个缺陷,例如当 Activity 在 manifest 中使用 android:screenOrientation=”portrait” 锁定竖屏,此时即使你将手机横置,页面仍然停留在 “portrait” 状态,因此方案一获取到的也同样是 “portrait”,但其实此时手机是横向的。

方案二不会遇到这样的问题,onOrientationChanged 传入的 orientation 就是真实的屏幕朝向。我们对 0 到 359 做处理,计算出屏幕方向即可,因此方案二更适合用来获取当前真正的屏幕方向。

每日一问的答案中可能无法全完解读这个问题,如果您是相关技术专家或者是对本问题有自己的见解,欢迎带着「批判性」的态度阅读,指正其中的不足。