Exemple #1
0
    /*
     *  layout後、LayouTaroから呼ばれる
     */
    public void AfterLayout(Vector2 viewSize, float originX, float originY, GameObject rootObject, LTAsyncRootElement rootElement, LTAsyncElement[] elements, ref float currentLineMaxHeight, ref List <RectTransform> lastLineContents, Vector2 wrappedSize)
    {
        // 最終行の整列を行う
        BasicAsyncLayoutFunctions.LayoutLastLine <LTAsyncRootElement>(ref originY, currentLineMaxHeight, ref lastLineContents);

        var outsideSpacing = 10f;

        var rootTrans = rootObject.GetComponent <RectTransform>();

        // boxのサイズを調整する
        rootTrans.sizeDelta = new Vector2(wrappedSize.x + outsideSpacing * 2, wrappedSize.y + outsideSpacing * 2);// オリジナル幅で、幅と高さに対して2倍分の余白を足す。

        // 子要素の余白分の移動
        foreach (var e in elements)
        {
            var rectTrans = e.GetComponent <RectTransform>();
            rectTrans.anchoredPosition = new Vector2(rectTrans.anchoredPosition.x + outsideSpacing, rectTrans.anchoredPosition.y - outsideSpacing);// ルートの下のエレメントの要素をスペース分移動する。yは-なので-する。
        }
    }
Exemple #2
0
    /*
     *  子要素をレイアウトし、親要素が余白ありでそれを包む。
     *  outを使いたいから、非同期な計算を行う実行体をここから返すようにする。
     */
    public List <AsyncLayoutOperation> LayoutAsync <T>(ref Vector2 viewSize, out float originX, out float originY, GameObject rootObject, LTAsyncRootElement rootElement, LTAsyncElement[] elements, ref float currentLineMaxHeight, ref List <RectTransform> lineContents) where T : IMissingSpriteCache, new()
    {
        var outsideSpacing = 10f;

        originX = 0f;
        originY = 0f;

        var originalViewWidth = viewSize.x;

        viewSize.x = viewSize.x - outsideSpacing * 2;// 左右の余白分を引く
        var viewWidth = viewSize.x;

        // MyLayoutはrootとしてboxがくる前提で作られている、という想定のサンプル
        var root      = rootObject.GetComponent <AsyncBoxElement>();
        var rootTrans = root.GetComponent <RectTransform>();

        var layoutOps = new List <AsyncLayoutOperation>();

        for (var i = 0; i < elements.Length; i++)
        {
            var element = elements[i];

            var currentElementRectTrans = element.GetComponent <RectTransform>();
            var restWidth = viewSize.x - originX;

            var type = element.GetLTElementType();
            switch (type)
            {
            case LTElementType.AsyncImage:
                var imageElement = (AsyncImageElement)element;

                // 概念的に、後でレイアウトする対象をレイアウト処理順にAddしている。
                layoutOps.Add(
                    BasicAsyncLayoutFunctions.RectLayoutAsync <T>(
                        imageElement,
                        currentElementRectTrans,
                        imageElement.RectSize(),
                        viewWidth,
                        ref originX,
                        ref originY,
                        ref restWidth,
                        ref currentLineMaxHeight,
                        ref lineContents
                        )
                    );
                break;

            case LTElementType.AsyncText:
                var newTailTextElement = (AsyncTextElement)element;
                var contentText        = newTailTextElement.Text();

                layoutOps.Add(
                    BasicAsyncLayoutFunctions.TextLayoutAsync <AsyncTextElement, T>(
                        newTailTextElement,
                        contentText,
                        currentElementRectTrans,
                        viewWidth,
                        ref originX,
                        ref originY,
                        ref restWidth,
                        ref currentLineMaxHeight,
                        ref lineContents
                        )
                    );
                break;

            case LTElementType.AsyncText2:
                var newTailTextElement2 = (AsyncTextElement2)element;
                var contentText2        = newTailTextElement2.Text();

                layoutOps.Add(
                    BasicAsyncLayoutFunctions.TextLayoutAsync <AsyncTextElement2, T>(
                        newTailTextElement2,
                        contentText2,
                        currentElementRectTrans,
                        viewWidth,
                        ref originX,
                        ref originY,
                        ref restWidth,
                        ref currentLineMaxHeight,
                        ref lineContents
                        )
                    );
                break;

            case LTElementType.AsyncText3:
                var newTailTextElement3 = (AsyncTextElement3)element;
                var contentText3        = newTailTextElement3.Text();

                layoutOps.Add(
                    BasicAsyncLayoutFunctions.TextLayoutAsync <AsyncTextElement3, T>(
                        newTailTextElement3,
                        contentText3,
                        currentElementRectTrans,
                        viewWidth,
                        ref originX,
                        ref originY,
                        ref restWidth,
                        ref currentLineMaxHeight,
                        ref lineContents
                        )
                    );
                break;

            case LTElementType.AsyncButton:
                var buttonElement = (AsyncButtonElement)element;

                layoutOps.Add(
                    BasicAsyncLayoutFunctions.RectLayoutAsync <T>(
                        buttonElement,
                        currentElementRectTrans,
                        buttonElement.RectSize(),
                        viewWidth,
                        ref originX,
                        ref originY,
                        ref restWidth,
                        ref currentLineMaxHeight,
                        ref lineContents
                        )
                    );

                break;

            case LTElementType.AsyncBox:
                throw new Exception("unsupported layout:" + type);    // 子のレイヤーにBoxが来るのを許可しない。

            default:
                Debug.LogError("unsupported element type:" + type);
                break;
            }
        }

        return(layoutOps);
    }