View事件體系學習 一 滑動

2021-08-11 02:59:24 字數 2517 閱讀 9590

(一) scrollto / scroll by

叢原始碼來看,scrollby 呼叫了 scrollto, 而最終 scrollto 呼叫了 onscrollchanger() 方法。

在滑動過程中:

(二)使用動畫

使用動畫來移動 view,主要是操作 view 的 translationx 和 translationy 屬性,既可以採用傳統的 view 動畫,也可以採用屬性動畫,如果採用屬性動畫的話,需要注意相容 3.0 以下的版本。

(三)改變布局引數

通過 view.getlayoutparams() 方法獲得layoutparams 物件,在該物件中,通過修改margin、width等屬性來實現 view 的滑動效果。

總結:(一)使用scroller

先看**:

private scroller scroller = new scroller(getcontext());

public

void

smoothscroollto(int destx,int dexty,int duration)

@override

public

void

computescroll()

}

有幾個注意的地方:

1,必須重寫 view 的 computescroll() 方法。

2,scroller.startscroll()其實並沒有使 view 進行滑動,而是儲存了我們傳遞的幾個引數:

public

void

startscroll(int startx, int starty, int dx, int dy, int duration)

在儲存好引數之後,我們需要呼叫 invalidate() 方法讓 view 重繪,而在 view 重繪的 draw() 方法又會去呼叫 computescroll 方法。

3,computescrolloffset:

public

boolean

computescrolloffset()

int timepassed = (int)(animationutils.currentanimationtimemillis() - mstarttime);

if (timepassed < mduration)

mcurrvelocity = velocitycoef * mdistance / mduration * 1000.0f;

mcurrx = mstartx + math.round(distancecoef * (mfinalx - mstartx));

// pin to mminx <= mcurrx <= mmaxx

mcurrx = math.min(mcurrx, mmaxx);

mcurrx = math.max(mcurrx, mminx);

mcurry = mstarty + math.round(distancecoef * (mfinaly - mstarty));

// pin to mminy <= mcurry <= mmaxy

mcurry = math.min(mcurry, mmaxy);

mcurry = math.max(mcurry, mminy);

if (mcurrx == mfinalx && mcurry == mfinaly)

break;}}

else

return

true;

}

該方法根據時間的流逝來計算出當前的 scrollx 和 scrolly 的值,返回 true 表示滑動未結束。

4, 使用 scroller 只能使內容進行滑動。

(二)通過動畫

屬性動畫可以設定duration以及插值器來實現。

objectanimator animator = objectanimator.offloat(myscrollview, "translationx", 0f, 360f);

animator.setduration(3000);

animator.setinterpolator(new acceleratedecelerateinterpolator());

animator.start();

具體的動畫學習放在以後=。=

(三)使用延時策略

使用延時策略的核心思想是,通過傳送一系列延時訊息從而達到一種漸進式的效果,具體來說可以使用 handler 或 view 的 postdelayed 方法,也可以使用執行緒的 sleep 方法。

view 事件體系

view是android中所有控制項的基類,viewgroup內部包含了許多個控制項,即一組view。在android的設計中,viewgroup也繼承了view,這就意味著view本身就可以是單個控制項也可以是由多個控制項組成的一組控制項,通過這種關係就形成了view樹的結構 我們給出乙個簡略圖,...

View的事件體系三 滑動衝突處理

內外滑動方向一致。內外兩層同時能上下滑動,或同時能左右滑動。前面兩種情況的巢狀。如果abs x abs y 認定為上下滑動 x 或 y為正,則滑動方向為右或下 x 或 y為負,則滑動方向為左或上 針對場景2的情況,無法根據滑動向量或速度向量來做判斷。此時只能通過介面內容所呈現的業務來做判斷 比場景2...

View的事件體系

onintercepttouchevent 用於處理事件並改變事件的傳遞方向。處理事件這個不用說了,你在函式內部編寫 處理就可以了。而決定傳遞方向的是返回值,返回為false時事件會傳遞給子控制項的onintercepttouchevent 返回值為true時事件會傳遞給當前控制項的ontouche...