4.4.3 Layout模块

从图4-5的Layout模块的文件夹结构可以看出,Layout的主要功能都是布局方面的,包括横向布局、纵向布局和方格布局等。总共12个文件,有9个带有Layout字样,它们都是用于处理布局的。

图4-5 Layout模块的文件夹结构图

除处理布局内容外,其余3个文件CanvasScaler、AspectRatioFitter、ContentSizeFitter则是用于调整屏幕自适应功能的。

从ContentSizeFitter类、AspectRatioFitter类都带有Fitter字样可以了解到,它们的功能都是处理屏幕自适应。其中ContentSizeFitter类处理的是内容的自适应问题,而AspectRatioFitter类处理的是朝向的自适应问题,包括以长度为基准、以宽度为基准、以父节点为基准、以外层父节点为基准这四种类型的自适应方式。

另外,CanvasScaler类提供的功能非常重要,它操作的是Canvas整个画布针对不同屏幕进行的自适应调整。

由于代码量比较多,这里着重看看CanvasScaler类里的代码,其CanvasScaler类的核心函数源码如下:


protected virtual void HandleScaleWithScreenSize()
{
    Vector2 screenSize = new Vector2(Screen.width, Screen.height);
    float scaleFactor = 0;
    switch (m_ScreenMatchMode)
    {
        case ScreenMatchMode.MatchWidthOrHeight:
        {
            // 在取平均值之前,我们先取相对宽度和高度的对数,
            // 然后将其转换到原始空间
            // 进出对数空间的原因是具有更好的行为
            // 如果一个轴的分辨率为两倍,而另一个轴的分辨率为一半,则widthOrHeight值为
0.5时,它应该平整
            // 在正常空间中,平均值为(0.5 + 2)/ 2 = 1.25
            // 在对数空间中,平均值为(-1 + 1)/ 2 = 0
            float logWidth = Mathf.Log(screenSize.x / m_ReferenceResolution.
                x, kLogBase);
            float logHeight = Mathf.Log(screenSize.y / m_ReferenceResolution.
                y, kLogBase);
            float logWeightedAverage = Mathf.Lerp(logWidth, logHeight, m_
                MatchWidthOrHeight);
            scaleFactor = Mathf.Pow(kLogBase, logWeightedAverage);
            break;
        }
        case ScreenMatchMode.Expand:
        {
            scaleFactor = Mathf.Min(screenSize.x / m_ReferenceResolution.x, 
                screenSize.y / m_ReferenceResolution.y);
            break;
        }
        case ScreenMatchMode.Shrink:
        {
            scaleFactor = Mathf.Max(screenSize.x / m_ReferenceResolution.x, 
                screenSize.y / m_ReferenceResolution.y);
            break;
        }
    }
    SetScaleFactor(scaleFactor);
    SetReferencePixelsPerUnit(m_ReferencePixelsPerUnit);
}

在不同的ScreenMathMode模式下,CanvasScaler类对屏幕的适应算法包括优先匹配长或宽的、最小化固定拉伸及最大化固定拉伸这三种数学计算方式。其中在优先匹配长或宽算法中介绍了如何使用Log和Pow来计算缩放比例。