Skip to content

LayerSprite 調整單邊大小無法作用至 asWidget() 上 #22

@MontyPan

Description

@MontyPan

實際炸出這個問題的場景是「用 LayerSprite 作 CSS Flexbox 的基本效果」,程式碼大致如下:

VerticalLayoutContainer scroll = new VerticalLayoutContainer();
scroll.setScrollMode(ScrollMode.AUTOY);
scroll.add(new FlexboxLayerSprite(), new VerticalLayoutData(1, -1));

VerticalLayoutContainer base = new VerticalLayoutContainer();
//base 要改成 SimpleLayoutContainer 之類的都行,這裡這樣寫只是較貼近大多數的實作需求
base.add(foo, new VerticalLayoutData(1, 60)); 
base.add(scroll, new VerticalLayoutData(1, 1));

FlexboxLayerSprite.adjustMember() 必須依照 base 給予的 width,才能計算出所需要的 height。

base 改變 width 時,FlexboxLayerSprite 的 width 跟著改變,所以必須作兩個回合的 adjustMember()

	@Override
	protected void adjustMember() {
		double needHeight = computeHeight();

		//第一回合
		if (getHeight() != needHeight ) {
			resize(getWidth(), needHeight);
			//resize() 會再度觸發 adjustMember() 所以後面不繼續作
			return;
		}
		
		//實際調整 member 的邏輯
	}

看起來邏輯好像正確,但實際結果 scroll 的大小是正確的(廢話),可是 FlexboxLayerSprite.asWidget() 的大小卻是有問題的,目前原因不明.......

即使沒有出問題,可能也要提供一個機制來避免這繞來繞去的邏輯(謎之聲:designer 都搞不清楚了,誰會相信一般 caller 可以正確而快樂的寫出來...... 😱 )。至於這應該作在 LayerSprite.resize()?還是讓 LayerSprite.asWidget() 可以有不同的 return class?還是有其他種可能?就....... 還沒有一個定論(謎之聲:先生出 SSCCE 吧你 [指])

當然,最簡單的解法是 LayerSprite 直接提供 scroll 的功能,但是... 實作太硬,不考慮...... 🙈

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions