• RK3288 6.0 双屏异显,横屏+竖屏【转】


    本文转载自:http://blog.csdn.net/clx44551/article/details/78215730?locationNum=8&fps=1

    RK3288 6.0 双屏异显,横屏+竖屏

    由于是横屏+竖屏的组合,目前考虑两种实现方案。1.副屏存在黑边 2.对副屏内容进行拉伸。

    默认情况下,我们设置的双屏初始rotation都为Surface.ROTATION_0,因此需将WSM中的updateRotationUncheckedLocked方法的该语句进行屏蔽。

    [java] view plain copy
     
    1. if (mRotateOnBoot) {  
    2.      mRotation = Surface.ROTATION_0;  
    3.      rotation = Surface.ROTATION_90;  
    4. }       
    5.         /* display portrait, force android rotation according to 90 */  
    6. if("true".equals(SystemProperties.get("persist.display.portrait","false"))){  
    7.      rotation = Surface.ROTATION_90;  
    8. }       
    9. //LQH   
    10. // rotation = Surface.ROTATION_0;  
    11. /* display portrait end */  
    12.   
    13. // if("vr".equals(SystemProperties.get("ro.target.product","tablet")))  
    14.   // rotation = Surface.ROTATION_0;  
    15. if (mRotation == rotation && mAltOrientation == altOrientation) {  
    16.     // No change.  
    17.     return false;  
    18. }       


    同时在该工程中集成了对于主屏和副屏初始角度控制的补丁,通过build.prop文件进行配置即可。

    ro.sf.hwrotation=0                   主屏初始方向 (在./native/services/surfaceflinger/SurfaceFlinger.cpp进行赋值)
    ro.orientation.einit=90             副屏初始方向
    ro.same.orientation=false       主副屏orientaion是否相同
    ro.rotation.external=false        副屏是否随主屏旋转

    参考http://blog.csdn.net/ljp1205/article/details/53405641,了解Display框架及其初始化过程,主要对Display初始化时的参数进行调整。

    该部分的代码在base/services/core/java/com/android/server/display/LocalDisplayAdapter.java的getDisplayDeviceInfoLocked()方法下完成:

    [java] view plain copy
     
    1. @Override  
    2.        public DisplayDeviceInfo getDisplayDeviceInfoLocked() {  
    3.            if (mInfo == null) {  
    4.                SurfaceControl.PhysicalDisplayInfo phys = mDisplayInfos[mActivePhysIndex];  
    5.                mInfo = new DisplayDeviceInfo();  
    6.                mInfo.width = phys.width;  
    7.                mInfo.height = phys.height;  
    8.                mInfo.modeId = mActiveModeId;  
    9.                mInfo.defaultModeId = mDefaultModeId;  
    10.                mInfo.supportedModes = new Display.Mode[mSupportedModes.size()];  
    11.                for (int i = 0; i < mSupportedModes.size(); i++) {  
    12.                    DisplayModeRecord record = mSupportedModes.valueAt(i);  
    13.                    mInfo.supportedModes[i] = record.mMode;  
    14.                }  
    15.                mInfo.colorTransformId = mActiveColorTransformId;  
    16.                mInfo.defaultColorTransformId = mDefaultColorTransformId;  
    17.                mInfo.supportedColorTransforms =  
    18.                        new Display.ColorTransform[mSupportedColorTransforms.size()];  
    19.                for (int i = 0; i < mSupportedColorTransforms.size(); i++) {  
    20.                    mInfo.supportedColorTransforms[i] = mSupportedColorTransforms.valueAt(i);  
    21.                }  
    22.                mInfo.appVsyncOffsetNanos = phys.appVsyncOffsetNanos;  
    23.                mInfo.presentationDeadlineNanos = phys.presentationDeadlineNanos;  
    24.                mInfo.state = mState;  
    25.                mInfo.uniqueId = getUniqueId();  
    26.   
    27.                // Assume that all built-in displays that have secure output (eg. HDCP) also  
    28.                // support compositing from gralloc protected buffers.  
    29.                if (phys.secure) {  
    30.                    mInfo.flags = DisplayDeviceInfo.FLAG_SECURE  
    31.                            | DisplayDeviceInfo.FLAG_SUPPORTS_PROTECTED_BUFFERS;  
    32.                }  
    33.   
    34.                if (mBuiltInDisplayId == SurfaceControl.BUILT_IN_DISPLAY_ID_MAIN) {  
    35.                    final Resources res = getContext().getResources();  
    36.                    mInfo.name = res.getString(  
    37.                            com.android.internal.R.string.display_manager_built_in_display_name);  
    38.                    mInfo.flags |= DisplayDeviceInfo.FLAG_DEFAULT_DISPLAY  
    39.                            | DisplayDeviceInfo.FLAG_ROTATES_WITH_CONTENT;  
    40.                    if (res.getBoolean(com.android.internal.R.bool.config_mainBuiltInDisplayIsRound)  
    41.                            || (Build.HARDWARE.contains("goldfish")  
    42.                            && SystemProperties.getBoolean(PROPERTY_EMULATOR_CIRCULAR, false))) {  
    43.                        mInfo.flags |= DisplayDeviceInfo.FLAG_ROUND;  
    44.                    }  
    45.                    mInfo.type = Display.TYPE_BUILT_IN;  
    46.                    mInfo.densityDpi = (int)(phys.density * 160 + 0.5f);  
    47.                    mInfo.xDpi = phys.xDpi;  
    48.                    mInfo.yDpi = phys.yDpi;  
    49.                    mInfo.touch = DisplayDeviceInfo.TOUCH_INTERNAL;  
    50.                } else {  
    51.                    mInfo.type = Display.TYPE_HDMI;  
    52.                    mInfo.flags |= DisplayDeviceInfo.FLAG_PRESENTATION;  
    53.                    boolean noRotate = "0".equals(SystemProperties.get("ro.sf.hwrotation"));  
    54.                    if(noRotate && mBuiltInDisplayId == SurfaceControl.BUILT_IN_DISPLAY_ID_HDMI){  
    55.                        if (SystemProperties.getBoolean("ro.rotation.external", false)) {  
    56.                            mInfo.flags |= DisplayDeviceInfo.FLAG_ROTATES_WITH_CONTENT;  
    57.                        }  
    58.                        String value = SystemProperties.get("ro.orientation.einit");  
    59.                        if ("0".equals(value)) {  
    60.                            mInfo.rotation = Surface.ROTATION_0;  
    61.                        } else if ("90".equals(value)) {  
    62.                            mInfo.rotation = Surface.ROTATION_90;  
    63.                        } else if ("180".equals(value)) {  
    64.                            mInfo.rotation = Surface.ROTATION_180;  
    65.                        } else if ("270".equals(value)) {  
    66.                            mInfo.rotation = Surface.ROTATION_270;  
    67.                        }  
    68.                    }  
    69.                    mInfo.name = getContext().getResources().getString(  
    70.                            com.android.internal.R.string.display_manager_hdmi_display_name);  
    71.                    mInfo.touch = DisplayDeviceInfo.TOUCH_EXTERNAL;  
    72.                    mInfo.setAssumedDensityForExternalDisplay(phys.width, phys.height);  
    73.   
    74.                    // For demonstration purposes, allow rotation of the external display.  
    75.                    // In the future we might allow the user to configure this directly.  
    76.                    if ("portrait".equals(SystemProperties.get("persist.demo.hdmirotation"))) {  
    77.                        mInfo.rotation = Surface.ROTATION_270;  
    78.                    }  
    79.   
    80.                    // For demonstration purposes, allow rotation of the external display  
    81.                    // to follow the built-in display.  
    82.                    if (SystemProperties.getBoolean("persist.demo.hdmirotates", false)) {  
    83.                        mInfo.flags |= DisplayDeviceInfo.FLAG_ROTATES_WITH_CONTENT;  
    84.                    }  
    85.                }  
    86.            }  
    87.            return mInfo;  
    88.        }  



    最终显示的frame大小确定,在framework/native/service/surfaceflinger/DisplayDevice.cpp中

    [java] view plain copy
     
    1. bool isHdmiScreen = mType == DisplayDevice::DISPLAY_EXTERNAL;  
    2.     if (isHdmiScreen) {  
    3.         int eInitOrientation = 0;  
    4.         bool isSfHwrotated = false;  
    5.         bool isSupportRotation = false;  
    6.         bool isPrimaryExternalSameOrientation = false;  
    7.         Rect newFrame = Rect(0,0,getWidth(),getHeight());  
    8.         Rect newFrameRotated = Rect(0,0,getHeight(),getWidth());  
    9.         float frameRatio = (float)frame.getWidth() / frame.getHeight();  
    10.         char value[PROPERTY_VALUE_MAX];  
    11.         property_get("ro.sf.hwrotation", value, "0");  
    12.         isSfHwrotated = atoi(value) != 0;  
    13.         property_get("ro.same.orientation", value, "false");  
    14.         isPrimaryExternalSameOrientation = !strcmp(value,"true");  
    15.         if(!isSfHwrotated) {  
    16.             property_get("ro.orientation.einit", value, "0");  
    17.             eInitOrientation = atoi(value) / 90;  
    18.             property_get("ro.rotation.external", value, "false");  
    19.             isSupportRotation = !strcmp(value,"true");  
    20.         }  
    21.         if (isSupportRotation && !isPrimaryExternalSameOrientation) {  
    22.             mClientOrientation = orientation;  
    23.             if (eInitOrientation % 2 == 1) {  
    24.                 frame = frameRatio > 1.0 ? frame : newFrameRotated;  
    25.                 ALOGE("%d,[%d,%d]",__LINE__,frame.getWidth(),frame.getHeight());  
    26.             } else {  
    27.                 frame = frameRatio > 1.0 ? newFrame : frame;  
    28.                 ALOGE("%d,[%d,%d]",__LINE__,frame.getWidth(),frame.getHeight());  
    29.             }  
    30.         } else if (isSupportRotation) {  
    31.             mClientOrientation = orientation;  
    32.             if (eInitOrientation % 2 == 1) {  
    33.                 //frame = frameRatio > 1.0 ? frame : frame;  
    34.                 ALOGE("%d,[%d,%d]",__LINE__,frame.getWidth(),frame.getHeight());  
    35.             } else {  
    36.                 frame = frameRatio > 1.0 ? newFrame : newFrameRotated;  
    37.                 ALOGE("%d,[%d,%d]",__LINE__,frame.getWidth(),frame.getHeight());  
    38.             }  
    39.         } else if (eInitOrientation % 2 != 0) {  
    40.             if (isPrimaryExternalSameOrientation) {  
    41.                 //frame = frameRatio > 1.0 ? frame : frame;  
    42.                 ALOGE("%d,[%d,%d]",__LINE__,frame.getWidth(),frame.getHeight());  
    43.             } else {  
    44.                 //应该走的这里  
    45.                 frame = frameRatio > 1.0 ? frame : newFrameRotated;  
    46.                 ALOGE("%d,[%d,%d]",__LINE__,frame.getWidth(),frame.getHeight());  
    47.             }  
    48.         } else if (eInitOrientation % 2 == 0) {  
    49.             if (isPrimaryExternalSameOrientation) {  
    50.                 frame = frameRatio > 1.0 ? newFrame : frame;  
    51.                 ALOGE("%d,[%d,%d]",__LINE__,frame.getWidth(),frame.getHeight());  
    52.             } else {  
    53.                 frame = frameRatio > 1.0 ? newFrame : frame;  
    54.                 ALOGE("%d,[%d,%d]",__LINE__,frame.getWidth(),frame.getHeight());  
    55.             }  
    56.         } else {  
    57.             frame = frameRatio > 1.0 ? newFrame : frame;  
    58.             ALOGE("%d,[%d,%d]",__LINE__,frame.getWidth(),frame.getHeight());  
    59.         }  
    60.          
    61.         ALOGE("update frame [%d,%d]",frame.getWidth(),frame.getHeight());  
    62.     }  

    根据具体情况进行配置,即可实现 双屏异显,横屏+竖屏,竖屏存在黑边的效果。在上面的补丁中,可对frame进行强制定义为副屏大小,则可以实现拉伸效果,填充黑边。

    [java] view plain copy
     
    1. frame=Rect(0,0,getHeight(),getWidth());  

    但两块屏幕比例相差较大的情况下,拉伸显示的效果较差。

    注:在设置中将g-sensor的旋转功能关闭,旋转对上述实现存在一定影响。

    [java] view plain copy
     
    1.   





  • 相关阅读:
    (14)python函数与变量
    ①③python中的字符串与字符编码
    ①②python文件操作及文件增删改查
    rsa公钥私钥
    MySQL创建数据库和表
    Rsync + Innotify 部署实例
    LNMPT部署示例
    Nginx 调优
    Nginx 二进制方式安装
    wget & curl 命令
  • 原文地址:https://www.cnblogs.com/zzb-Dream-90Time/p/7780921.html
Copyright © 2020-2023  润新知