当前位置: 代码迷 >> Android >> Android批改横屏的默认角度为顺时针270度
  详细解决方案

Android批改横屏的默认角度为顺时针270度

热度:99   发布时间:2016-04-28 02:42:04.0
Android修改横屏的默认角度为顺时针270度

默认的横屏角度是顺时针90度,修改为顺时针270度,即是逆时针90度。


1.查看相关逻辑,可以看到有个布尔值com.android.internal.R.bool.config_reverseDefaultRotation控制翻转:

frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java

  @Override    public void setInitialDisplaySize(Display display, int width, int height, int density) {        // This method might be called before the policy has been fully initialized        // or for other displays we don't care about.        if (mContext == null || display.getDisplayId() != Display.DEFAULT_DISPLAY) {            return;        }        mDisplay = display;        final Resources res = mContext.getResources();        int shortSize, longSize;        if (width > height) {            shortSize = height;            longSize = width;            mLandscapeRotation = Surface.ROTATION_0;            mSeascapeRotation = Surface.ROTATION_180;            if (res.getBoolean(com.android.internal.R.bool.config_reverseDefaultRotation)) {                mPortraitRotation = Surface.ROTATION_90;                mUpsideDownRotation = Surface.ROTATION_270;            } else {                mPortraitRotation = Surface.ROTATION_270;                mUpsideDownRotation = Surface.ROTATION_90;            }        } else {            shortSize = width;            longSize = height;            mPortraitRotation = Surface.ROTATION_0;            mUpsideDownRotation = Surface.ROTATION_180;            if (res.getBoolean(com.android.internal.R.bool.config_reverseDefaultRotation)) {                mLandscapeRotation = Surface.ROTATION_270;                mSeascapeRotation = Surface.ROTATION_90;            } else {                mLandscapeRotation = Surface.ROTATION_90;                mSeascapeRotation = Surface.ROTATION_270;            }        }        mStatusBarHeight =                res.getDimensionPixelSize(com.android.internal.R.dimen.status_bar_height);        // Height of the navigation bar when presented horizontally at bottom        mNavigationBarHeightForRotation[mPortraitRotation] =        mNavigationBarHeightForRotation[mUpsideDownRotation] =                res.getDimensionPixelSize(com.android.internal.R.dimen.navigation_bar_height);        mNavigationBarHeightForRotation[mLandscapeRotation] =        mNavigationBarHeightForRotation[mSeascapeRotation] = res.getDimensionPixelSize(                com.android.internal.R.dimen.navigation_bar_height_landscape);        // Width of the navigation bar when presented vertically along one side        mNavigationBarWidthForRotation[mPortraitRotation] =        mNavigationBarWidthForRotation[mUpsideDownRotation] =        mNavigationBarWidthForRotation[mLandscapeRotation] =        mNavigationBarWidthForRotation[mSeascapeRotation] =                res.getDimensionPixelSize(com.android.internal.R.dimen.navigation_bar_width);        // SystemUI (status bar) layout policy        int shortSizeDp = shortSize * DisplayMetrics.DENSITY_DEFAULT / density;        int longSizeDp = longSize * DisplayMetrics.DENSITY_DEFAULT / density;        // Allow the navigation bar to move on small devices (phones).                /// M: read the critical dp from mtk resource @{        //mNavigationBarCanMove = shortSizeDp < 600;        mNavigationBarCanMove = shortSizeDp < mContext.getResources().getInteger(            com.mediatek.internal.R.integer.config_dp_for_rotation);        /// @}        mHasNavigationBar = res.getBoolean(com.android.internal.R.bool.config_showNavigationBar);        /// M:[SmartBook]Don't show navigation bar if SmartBook plugged in @{        if (FeatureOption.MTK_SMARTBOOK_SUPPORT) {            mNavigationBarCanMove = false;            mHasNavigationBar = mSmartBookPlugIn ? false : mContext.getResources().getBoolean(                com.android.internal.R.bool.config_showNavigationBar);            Slog.d(TAG, "mSmartBookPlugIn:" + mSmartBookPlugIn + ", mHasNavigationBar:" + mHasNavigationBar);        }        /// @}        // Allow a system property to override this. Used by the emulator.        // See also hasNavigationBar().        String navBarOverride = SystemProperties.get("qemu.hw.mainkeys");        if ("1".equals(navBarOverride)) {            mHasNavigationBar = false;        } else if ("0".equals(navBarOverride)) {            mHasNavigationBar = true;        }        // For demo purposes, allow the rotation of the HDMI display to be controlled.        // By default, HDMI locks rotation to landscape.        if ("portrait".equals(SystemProperties.get("persist.demo.hdmirotation"))) {            mDemoHdmiRotation = mPortraitRotation;        } else {            mDemoHdmiRotation = mLandscapeRotation;        }        mDemoHdmiRotationLock = SystemProperties.getBoolean("persist.demo.hdmirotationlock", false);        // Only force the default orientation if the screen is xlarge, at least 960dp x 720dp, per        // http://developer.android.com/guide/practices/screens_support.html#range        mForceDefaultOrientation = longSizeDp >= 960 && shortSizeDp >= 720 &&                res.getBoolean(com.android.internal.R.bool.config_forceDefaultOrientation) &&                // For debug purposes the next line turns this feature off with:                // $ adb shell setprop config.override_forced_orient true                // $ adb shell wm size reset                !"true".equals(SystemProperties.get("config.override_forced_orient"));    }


修改:frameworks/base/core/res/res/values/config.xml

<!-- If true, the direction rotation is applied to get to an application's requested         orientation is reversed.  Normally, the model is that landscape is         clockwise from portrait; thus on a portrait device an app requesting         landscape will cause a clockwise rotation, and on a landscape device an         app requesting portrait will cause a counter-clockwise rotation.  Setting         true here reverses that logic. -->    <bool name="config_reverseDefaultRotation">true</bool>






  相关解决方案