1. 程式人生 > >CircleList-使用UGUI實現的圓形列表

CircleList-使用UGUI實現的圓形列表

CircleList

CircleList是一個通過UGUI實現的圓形列表,通過縮放、平移和層級的改變模擬一個3D的圓形列表。

效果

新增與旋轉


間距調整

橢圓形的旋轉

引數

CenterX: 橢圓圓心的x座標偏移量
CenterY: 橢圓圓心的y座標偏移量
RadiusX: 橢圓的長軸
RadiusY: 橢圓的短軸
MinScale: 縮放的最小值,縮放值在[0,π]間逐漸增大,在[π,2π]間逐漸減小
MaxScale: 縮放的最大值
Speed: 滑動距離對旋轉速度的影響引數
AdjustArg: 調整間距的引數,值越小前方的item佈局越鬆散
OriginalRotatin:

橢圓的初始旋轉角度
IsAutoMove: 是否自動轉動

原理

  以橫向滑動的距離作為每個item旋轉角度的增量來實現列表的轉動,同時將角度控制在[0,2π],方便進行其他的計算。
  在將每次拖動的距離向item旋轉角做變化時做了一些處理,先算出點選點向量AB的的垂直向量BF(x2,y2),也就是半徑為AB的圓的切線。將BF標準化後得到向量B'F'(x2',y2'),讓後計算GB、B'F'的點積,用結果乘上速度引數作角度的增量,實現滑動的效果。

  根據item的個數,計算出每個item間的間隔,以此為依據進行佈局。(總旋轉角+item在佇列中的位置*item間的間隔)作為每個item的最終旋轉角。


  以角度的值為縮放的依據,讓item在[0,π]之間逐漸增大,在[π,2π]之間逐漸減小。模擬出近大遠小的感覺,同時以item的縮放來重新設定item的層級,解決item的遮擋關係(層級的排序通過一個輔助列表實現)。
  但是讓每個item之間相隔的角度相等的話,就會顯得前方的item比較擁擠,所以通過每個item的縮放值進行角度的二次調整,讓列表顯得不是那麼擁擠。


  在計算出每個item的位置後,將item的位置以圓心為原點,旋轉θ度,實現橢圓的旋轉。



程式碼連結:https://github.com/blueberryzzz/CircleListDemo