安卓手勢處理(四)之Fling

2021-10-01 10:41:03 字數 1839 閱讀 3943

系列文章:

安卓手勢處理(一)view的位置資訊

安卓手勢處理(二) motionevent

安卓手勢處理(三)之實現的放大和縮小

安卓手勢處理(四)之fling

安卓手勢處理(五)案例

首先我們想到的fling肯定是使用動畫來實現,其實還有更簡單的實現方式,就是使用scroller,scroller內部也相當於使用了動畫,就是和一般的動畫實現形式有點不一樣,下面我們分別用兩種方式分別實現乙個linearlayout的滑動。

其實這個版本完全是copy了overscroller內部的動畫方式,因為如果要我們自己實現動畫的話,會有幾個問題:

上面的問題其實都在overscroller內部解決掉了,有兩個方法可以根據初始速度分別獲取最終的滑動時間和距離:

private double getsplineflingdistance(int velocity) 

private int getsplineflingduration(int velocity)

使用overscroller實現就簡單多了,只需要兩步,第一獲取手指離開的速度呼叫overscroller.fling方法:

public void startscrollerfling(int velocityy)
fling引數解讀:

public void fling(int startx, int starty, int velocityx, int velocityy,

int minx, int maxx, int miny, int maxy)

startx:x方向fling的起始位置

starty:y方向fling的起始位置,一般設定成當前已經滑動的距離getscrolly()

velocityx: x 的速度

velocityy: y 的速度

剩下引數就是最小、最大距離

使用fling最重要的是設定最大最小值,因為如果根據start值,計算途中如果超過了[min,max]區間,那麼就認為當前動畫結束了,不再執行,因此一定要注意。

第二步:重寫view的computescroll方法,在這裡面進行真正的滑動操作:

@override

public void computescroll()

}

需要**可以從上面的demo位址中找到,這裡簡單說一下overscroller的滑動原理,overscroller其實是起到計算的作用,真正滑動其實是在view的computescroll方法中進行的,方法的呼叫流程是這樣的,首先我們呼叫overscroller.fling方法,傳入引數,overscroller內部會根據初始速度計算出滑動距離和滑動時間,接下來invalidate方法使得view呼叫ondraw方法,ondraw內部會呼叫view的computescroll方法,在這裡面就是我們加的**,overscroller根據當前時間判斷是否滑倒了最終地點,如果沒有,computescrolloffset返回true,那麼我們就呼叫view滑動到相應的距離,然後再呼叫invalidate方法,這一點是必須的。這個invalidate又會觸發view的ondraw了,就和上面步驟一樣,最終滑到終點。

如上面所說,overscroller的實現方式確實和animation不完全一樣,而且經過試驗,overscroller的滑行要更順暢一點,根據這一系列的文章我們就可以封裝乙個zoomimageview,支援放大、移動、fling操作。下章再見

安卓例項 手勢操作

一.實現效果 當我們在螢幕上滑動時就能改變 我用的軟體滑鼠錄不進去 二.涉及知識點 1 線性布局 linearlayout 2 影象檢視 imageview 3 單點觸控事件 motionevent 三.實現步驟 1.布局檔案 因為我們只是做滑動切換,所以只需要乙個簡單的布局 2.主介面類 publ...

351 安卓系統手勢解鎖

我們都知道安卓有個手勢解鎖的介面,是乙個 3 x 3 的點所繪製出來的網格。給你兩個整數,分別為 m 和 n,其中 1 m n 9,那麼請你統計一下有多少種解鎖手勢,是至少需要經過 m 個點,但是最多經過不超過 n 個點的。先來了解下什麼是乙個有效的安卓解鎖手勢 每乙個解鎖手勢必須至少經過 m 個點...

安卓時間處理

字母 日期或時間元素 表示示例 gera 標誌符 text ad y年 year 1996 96 m年中的月份 month july jul 07 w年中的週數 number 27 w月份中的週數 number 2 d年中的天數 number 189 d月份中的天數 number 10 f月份中的星...