Android12 添加屏幕方向旋转方案

添加屏幕方向属性值

  • device/qcom/qssi/system.prop
persist.panel.orientation=0

修改开机动画方向

  • frameworks/base/cmds/bootanimation/BootAnimation.cpp
status_t BootAnimation::readyToRun() {
    mAssets.addDefaultAssets();

    mDisplayToken = SurfaceComposerClient::getInternalDisplayToken();
    if (mDisplayToken == nullptr)
        return NAME_NOT_FOUND;

    DisplayMode displayMode;
    const status_t error =
            SurfaceComposerClient::getActiveDisplayMode(mDisplayToken, &displayMode);
    if (error != NO_ERROR)
        return error;

    mMaxWidth = android::base::GetIntProperty("ro.surface_flinger.max_graphics_width", 0);
    mMaxHeight = android::base::GetIntProperty("ro.surface_flinger.max_graphics_height", 0);
    ui::Size resolution = displayMode.resolution;
    resolution = limitSurfaceSize(resolution.width, resolution.height);
    
    // add start
    char rAngleValue[PROPERTY_VALUE_MAX];
    property_get("persist.panel.orientation", rAngleValue, "0");
    int rAngle = atoi(rAngleValue);
    SurfaceComposerClient::Transaction t;
    
    int d_width = resolution.getWidth(),d_height = resolution.getHeight();
    
    if (rAngle == 90) {
        d_width = resolution.getHeight();
        d_height = resolution.getWidth();
        Rect destRect(d_width, d_height);
        t.setDisplayProjection(mDisplayToken, ui::ROTATION_90, destRect, destRect);
        ALOGD("BootAnimation default set rotation to be 90...");
    } else if (rAngle == 180) {
        Rect destRect(d_width, d_height);
        t.setDisplayProjection(mDisplayToken, ui::ROTATION_180, destRect, destRect);
        ALOGD("BootAnimation default set rotation to be 180...");
    } else if (rAngle == 270) {
        d_width = resolution.getHeight();
        d_height = resolution.getWidth();
        Rect destRect(d_width, d_height);
        t.setDisplayProjection(mDisplayToken, ui::ROTATION_270, destRect, destRect);
        ALOGD("BootAnimation default set rotation to be 270...");
    }

    // create the native surface
    sp<SurfaceControl> control = session()->createSurface(String8("BootAnimation"),
            d_width/*resolution.getWidth()*/, d_height/*resolution.getHeight()*/, PIXEL_FORMAT_RGB_565);

    //SurfaceComposerClient::Transaction t;
    // add end

修改导航栏位置

  • frameworks/base/services/core/java/com/android/server/wm/DisplayPolicy.java
@NavigationBarPosition
int navigationBarPosition(int displayWidth, int displayHeight, int displayRotation) {
	// add start
   /*if (navigationBarCanMove() && displayWidth > displayHeight) {
         if (displayRotation == Surface.ROTATION_270) {
             return NAV_BAR_LEFT;
         } else if (displayRotation == Surface.ROTATION_90) {
             return NAV_BAR_RIGHT;
         }
    }*/
    // add end
    return NAV_BAR_BOTTOM;
}

应用界面横竖屏修改

  • frameworks/base/services/core/java/com/android/server/wm/DisplayRotation.java
private int mDefaultOrientation = Surface.ROTATION_0;
DisplayRotation(WindowManagerService service, DisplayContent displayContent,
     DisplayPolicy displayPolicy, DisplayWindowSettings displayWindowSettings,
     Context context, Object lock) {
     ...
     if (isDefaultDisplay) {
     	...
     	t.start();

     	// add start
     	String orientation = SystemProperties.get("persist.panel.orientation");
     	if (orientation.startsWith("0")){
        	mDefaultOrientation = Surface.ROTATION_0;
     	} else if(orientation.startsWith("90")){
         	mDefaultOrientation = Surface.ROTATION_90;
     	} else if(orientation.startsWith("180")){
         	mDefaultOrientation = Surface.ROTATION_180;
     	} else if(orientation.startsWith("270")){
         	mDefaultOrientation = Surface.ROTATION_270;
     	}
     	mRotation = mDefaultOrientation;
     	// add end
    }
}
...
boolean updateRotationUnchecked(boolean forceUpdate) {
	...
	final int oldRotation = mRotation;
    final int lastOrientation = mLastOrientation;
    // add start
    final int rotation = mDefaultOrientation/*rotationForOrientation(lastOrientation, oldRotation)*/;
    // add end
    ...
}
...
@VisibleForTesting
@Surface.Rotation
int rotationForOrientation(@ScreenOrientation int orientation,
        @Surface.Rotation int lastRotation) {
    ProtoLog.v(WM_DEBUG_ORIENTATION,
            "rotationForOrientation(orient=%s (%d), last=%s (%d)); user=%s (%d) %s",
            ActivityInfo.screenOrientationToString(orientation), orientation,
            Surface.rotationToString(lastRotation), lastRotation,
            Surface.rotationToString(mUserRotation), mUserRotation,
            mUserRotationMode == WindowManagerPolicy.USER_ROTATION_LOCKED
                    ? "USER_ROTATION_LOCKED" : "");

    if (isFixedToUserRotation()) {
        return mUserRotation;
    }
    ...
    	default:
            // For USER, UNSPECIFIED, NOSENSOR, SENSOR and FULL_SENSOR,
            // just return the preferred orientation we already calculated.
            if (preferredRotation >= 0) {
                return preferredRotation;
            }
    		// add start
    		//return Surface.ROTATION_0;
    		return mDefaultOrientation;
    		// add end
    }
}
  • frameworks/base/services/core/java/com/android/server/wm/DisplayContent.java
@ScreenOrientation
@Override
int getOrientation() {
	// add start
    int mDefaultOrientation = 0;
    String persistOrientation = SystemProperties.get("persist.panel.orientation");
    if (!persistOrientation.isEmpty()){
        if (persistOrientation.startsWith("0")){
            mDefaultOrientation = Surface.ROTATION_0;
        } else if(persistOrientation.startsWith("90")){
            mDefaultOrientation = Surface.ROTATION_90;
        } else if(persistOrientation.startsWith("180")){
            mDefaultOrientation = Surface.ROTATION_180;
        } else if(persistOrientation.startsWith("270")){
            mDefaultOrientation = Surface.ROTATION_270;
        }
        return mDefaultOrientation;
    }
    // add end
    mLastOrientationSource = null;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值