cocos2d-x的LayoutParameter佈局深入理解
之前理解的不深,今天遇到一個坑,收穫了一些更深的理解。
需求是這樣:一個相對佈局的Panel,裡面有個ImageView,介面其他地方有幾個按鈕,按下去後需要動態地改變這個ImageView的位置。
按照往常的理解,按鈕事件得到觸發後,無非這樣操作就可以了嘛:
node:getLayoutParameter():setMargin({ left = 10, right = 0, top = 0, bottom = 0 })
可是,這句話居然不起作用!把這句話移到UI建立時的那一堆程式碼裡,卻又起作用了!好奇怪,於是我就掉進這個坑裡了。
後來也不知道怎麼的腦門靈感一閃,在Layout類裡看到了一個 requestDoLayout()
方法,於是將程式碼改成這樣,終於生效了:
node:getLayoutParameter():setMargin({ left = 10, right = 0, top = 0, bottom = 0 })
node:getParent():requestDoLayout()
我的理解是,在一個相對定位的Panel裡,如果是在UI建立期間(也即第一幀的時候),無論怎麼搞這個Panel裡面的子節點,它們都會生效,完全不需要手動執行 requestDoLayout()
方法去請求Panel重新定位,因為這個時候Panel是在OnEnter狀態,內部是dirty狀態。而當UI已經建立好了之後(也即第一幀完成了),這個時候要再去更改Panel裡的子節點位置,Panel感知不到變化
,內部不是dirty狀態,不會重新對子節點定位,所以需要手工地請求一次 requestDoLayout()
,讓Panel對子節點新的設定生效。
一個有趣的實驗是這樣:建立一個Panel,相對定位,建立一個ImageView子節點node,左對齊、上對齊(只要不是居中就行,因為設定為居中後就固定死不能動了),建立好之後,隨便找一個按鈕A做個事件,這麼寫:
node:setPositionX(100)
點選按鈕觸發事件,你會發現node的位置發生變化了。然後把再加一個按鈕B,觸發事件裡這麼寫:
node:getParent():requestDoLayout()
先點按鈕A,node位置變了,再點按鈕B,會發現node又跑回原位置了,哈哈。
總結:要在相對定位的Panel裡用程式動態改變位置,避免使用 setPosition()
,而依然要使用LayoutParameter的setMargin()方法,只不過,還要再對Panel做一下 requestDoLayout()
呼叫,通知Panel去重新梳理一遍子節點
相關文章
- 深入理解行內元素的佈局
- 深入理解聖盃佈局和雙飛翼佈局
- 【譯】Flutter | 深入理解佈局約束Flutter
- 深入理解 Flex 佈局以及計算Flex
- [佈局概念] 關於CSS-BFC深入理解CSS
- 深入理解 Python 的物件複製和記憶體佈局Python物件記憶體
- android中onMeasure初看,深入理解佈局之一!Android
- 簡單理解flex佈局Flex
- 理解 CSS 佈局和 BFCCSS
- 深入解析Android的自定義佈局Android
- 深入淺出grid佈局
- Flex 佈局:個人的學習與理解Flex
- 你真的理解 flex 佈局嗎?Flex
- 【譯】理解 CSS 佈局和 BFCCSS
- 深入理解Java虛擬機器之JVM記憶體佈局篇Java虛擬機JVM記憶體
- [深入淺出Windows 10]佈局原理Windows
- 深入理解Java虛擬機器之物件的記憶體佈局、訪問定位Java虛擬機物件記憶體
- 深入理解JVM(2) : Java堆中物件建立、佈局、訪問全過程JVMJava物件
- CSS佈局 --- 居中佈局CSS
- css佈局-float佈局CSS
- dispaly的Grid佈局與Flex佈局Flex
- [譯] 從原型圖到成品:步步深入 CSS 佈局原型CSS
- 居中佈局、三欄佈局
- qt 佈局---表單佈局QT
- java:佈局方法(流佈局)Java
- flex佈局(彈性佈局)Flex
- 佈局技巧:合併佈局
- 佈局總結-水平居中佈局的實現
- html的佈局HTML
- Web 開發者如何理解 Flutter 佈局之 —— 1. TextWebFlutter
- Web 開發者如何理解 Flutter 佈局之 —— 3. ImageWebFlutter
- 移動端佈局方案彙總&&原理解析
- CSS 佈局之水平居中佈局CSS
- CSS佈局之三欄佈局CSS
- 浮動佈局 和 flex佈局Flex
- CSS佈局 --- 自適應佈局CSS
- CSS佈局 --- 等寬&等高佈局CSS
- 彈性佈局(伸縮佈局)