UIScrollView原始碼分析(一)

2021-07-09 02:11:52 字數 1774 閱讀 7751

這裡我主要分析一下uiscrollview滑動的實現。

首先來看下uiscrolview裡的void press(bool pressed)函式;

if (pressed)

以上是press函式中的部分**,它主要做把滑動後緩衝的動力歸零、關閉滑動後的緩衝運動(本文所謂的滑動後是指手指離開螢幕)、記錄按下點的世界座標、建立乙個平面;其實就是為滑動做準備;

好了,再來看看public void drag ()函式:

ray ray = smoothdragstart ?

uicamera.currentcamera.screenpointtoray(uicamera.currenttouch.pos - mdragstartoffset) :

uicamera.currentcamera.screenpointtoray(uicamera.currenttouch.pos);

float dist = 0f;

if (mplane.raycast(ray, out dist))

else if (movement == movement.vertical)

else if (movement == movement.unrestricted)

else

offset = mtrans.transformdirection(offset);

}// adjust the momentum

if (drageffect == drageffect.none) mmomentum = vector3.zero;

else mmomentum = vector3.lerp(mmomentum, mmomentum + offset * (0.01f * momentumamount), 0.67f);

// move the scroll view

if (!iosdragemulation || drageffect != drageffect.momentumandspring)

else

else

}

這是該函式的主要部分了其實它主要做了三件事:1、計算滑動偏移;2、計算緩衝動力;3、移動;

滑動偏移沒什麼好說的,就是這一幀和上一幀比較手指移動的距離;重點來看看下面一段**

mmomentum = vector3.lerp(mmomentum, mmomentum + offset * (0.01f * momentumamount), 0.67f);
這段**就是記錄緩衝動力的,可以看到這個值一直是在疊加的,從press()函式可以知道只有按下時這mmomentum才會歸零,那麼如果我手指按下慢慢的滑mmomentum的值會很大,當我放手時scrollview將會繼續滑動很大的距離,然而實際上是不會的,這是為什麼呢?原因就在lataupdate()函式裡;
nguimath.springdampen(ref mmomentum, 9f, delta);

對,沒錯就是這個傢伙;這個函式是用來抑制緩衝動力的,它在手指按下的時候執行,手指按下的時間越長mmomentum值就會越小;這樣就算滑再慢mmomentum值疊加的再大,這段**都會讓它越來越小;這樣就實現了快速滑動後會有一段緩衝距離,而慢滑的緩衝小或是沒有; 

好了就寫這麼多,第一次寫部落格,寫的不好請見諒,有哪說的不對的請大神指教。

《原始碼閱讀》原始碼閱讀技巧,原始碼閱讀工具

檢視某個類的完整繼承關係 選中類的名稱,然後按f4 quick type hierarchy quick type hierarchy可以顯示出類的繼承結構,包括它的父類和子類 supertype hierarchy supertype hierarchy可以顯示出類的繼承和實現結構,包括它的父類和...

Cartographer原始碼篇 原始碼分析 1

在安裝編譯cartographer 1.0.0的時候,我們可以看到 主要包括cartorgarpher ros cartographer ceres sover三個部分。其中,ceres solver用於非線性優化,求解最小二乘問題 cartographer ros為ros平台的封裝,獲取感測器資料...

python原始碼剖析 Python原始碼剖析

第頁共 頁python 原始碼剖析 物件機制 1.物件 在python 的世界中,一切都是物件,乙個整數是乙個物件,乙個字串也是 乙個物件,更為奇妙的是,型別也是乙個物件,整數型別是乙個物件,字串類 型也是乙個物件。從 年guido 在那個聖誕節揭開 python 世界的大幕開始,一直到現在,pyt...