Android WMS - '强制横屏' 与 '强制缩放' 实现

Android Framework层 - WMS '强制横屏' 与 '强制缩放' 实现

前期说明

  • 为什么需要 “横屏”?
    根据产品需求, 另外是硬件上没有GSensor.

  • 为什么需要 “缩放”?
    横屏后, 第三方APK显示异常, 例如微信视频聊天, 整体画面会被拉伸或者是倒置, 所以强制横屏&缩放优化后, 效果图如下:
    在这里插入图片描述

如何实现

主要修改: 
frameworks/base/services/core/java/com/android/server/wm/WindowManagerService.java 

关键变量 & 函数:
// 旋转函数
1. WindowManagerService::updateRotationUncheckedLocked()           
    int rotation;   //局部变量, 决定应用程序显示方向.
2. WindowManagerService::updateDisplayAndOrientationLocked()
    boolean mAltOrientation; //全局变量    
    
// 焦点改变函数
3. WindowManagerService::setFocusedApp()    

代码修改

  • 新增API
// API: doForceRotationSpecificApp: specific activity rotation direction.
//      doForceDisplaySizeSpecificApp: specific activity window size.
private boolean mAlreadyForcedDisplaySize = false;	

// 用于读取自定义 '旋屏' 配置
private int doForceRotationSpecificApp(AppWindowToken focusad) {
	return SystemProperties.getInt("custom.system.disp_rotation", Surface.ROTATION_0);
}

// 用于强制应用横屏, 这里演示微信视频(com.tencent.mm/.plugin.voip.ui.VideoActivity)
private void doForceDisplaySizeSpecificApp(AppWindowToken focusad) {
	if (null != focusad) {
	    if ((focusad.token + "").contains("com.tencent.mm") && 
			(focusad.token + "").contains("plugin.voip.ui.VideoActivity")) {
	        mAlreadyForcedDisplaySize = true;
		    final DisplayContent displayContent = getDisplayContentLocked(Display.DEFAULT_DISPLAY);
               if (displayContent != null) {
				setForcedDisplaySize(Display.DEFAULT_DISPLAY, (int)(displayContent.mInitialDisplayWidth / 2.2f), displayContent.mInitialDisplayHeight);
               }
	    } else {
	        if (mAlreadyForcedDisplaySize) {
			    clearForcedDisplaySize(Display.DEFAULT_DISPLAY);
				mAlreadyForcedDisplaySize = false;
			}
		}
	}
}

  • 强制缩放:
WindowManagerService::setFocusedApp()
	if (changed) {
	    mFocusedApp = newFocus;
	    doForceDisplaySizeSpecificApp(mFocusedApp);
		...
	}
  • 强制横屏:
WindowManagerService::updateRotationUncheckedLocked()
	//int rotation = mPolicy.rotationForOrientationLw(mForcedAppOrientation, mRotation);
	// doForceRotationSpecificApp 添加可以通过build.prop 配置显示方向
	int rotation = doForceRotationSpecificApp(mFocusedApp);
	if (rotation > Surface.ROTATION_270) {
		rotation = Surface.ROTATION_0; 
	}
		
WindowManagerService::updateDisplayAndOrientationLocked()
    // 直接注释掉防止, APK设置旋转
    //if (mAltOrientation) {
    if (false) {
        if (realdw > realdh) {
            // Turn landscape into portrait.
            int maxw = (int)(realdh / 1.3f);
            if (maxw < realdw) {
                dw = maxw;
            }
        } else {
            // Turn portrait into landscape.
            int maxh = (int)(realdw / 1.3f);
            if (maxh < realdh) {
                dh = maxh;
            }
        }
    }

[补充]: 有问题可以邮件沟通 iFinelio Tower <308662170@qq.com>

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值