自定義view---抽屜控件的製作

 前兩天有人留言問購物車模塊有個需求是側滑刪除應該這麼做,類似QQ消息側滑刪除,藉此總結一下實現邏輯,事實上諸如動畫平移的這種view位置移動效果有兩種解決方案:

  1. view控件自身的移動
  2. ViewGroup移動內容,注意是移動ViewGroup的內容,而不是自身的移動
對於view控件自身的移動這很好理解,View動畫、屬性動畫就好,而ViewGroup去移動其內容,實質上是就像ScrollView控件一樣,比如說上述購物車模塊適配器item的線性佈局,是由兩部分組成:

 ①前半部分是正常顯示的item,寬度爲match_parent,所以默認顯示的時候item會佔滿width
 ②後半部分是刪除的view,默認狀態是看不到它的,
首先簡要說一下側滑功能是怎麼實現的,在購物車模塊的adapter中,將item的view傳遞給slidView類(自定義繼承線性佈局),slidView將這個viewaddView給前半部分的item控件上,這樣這個slidView就有了側滑刪除按鈕,再將slidView賦值給adapter的viewHolder,其餘adapter中設置就跟普通適配器沒有區別了,接下來說說slidView是如何將側滑刪除功能完成?
 slidView中重寫onTouchEvent事件,利用move獲取到的point(x,y)座標點計算出一系列的move值,讓ViewGroup調用scrollTo移動其內容(child_view),但是scrollTo函數是瞬時完成的移動,沒有連續的動畫,所以看上去不連貫用戶體驗不好,比如這樣的一個場景,用戶滑動了1/2的位置或者稍微再多點,這時候我們應該將刪除按鈕完整顯示出來,這時候直接強制顯示出來不太好,有一個過場動畫就完美了,這時候我們需要使用Scroller類來輔助完成,首先介紹Scroller的使用,然後提出Scroller類的一些疑惑:
 使用步驟:首先當然是實例化一個Scroller對象,然後在onTouchEvent中調用Scroller.startScroll去滑動(之後要用invalidate去刷新UI),然後重寫computerScroll,在這個函數裏用Scroller.computeScrollOffset()判斷滑動是否完成,未完成則在這裏繼續使用scrollTo(還要用invalidate刷新UI),大體上就是這樣的流程,至於說demo百度一搜一大把,這裏就不說了,下面來說說疑問
 ①:什麼是Scroller?Scroller是輔助view滑動的一個封裝計算類,它本身是不操作view的,也就是說它沒有滑動view的能力,最終的滑動view操作都是在view類中,它來計算規劃一個view應該以什麼樣的方式等等去滑動,而且computerScroll()函數也是view類中的
 ②:那麼computerScroll()函數是滑動view的操作嗎,它與Scroller類是什麼關係,實際上computerScroll函數也沒有操作滑動,本質上滑動都是ScrollTo和ScrollBy來完成的,它與Scroller類的邏輯關係應當是:Scroller類計算出一系列基礎數據交給computerScroll()函數去調用,然後computerScroll()函數加工一下這些參數,這個時候這些參數全部保存在view類中,調用invalidate去刷新(重繪draw函數),在draw函數重繪的過程中自然就會取到這些參數,這樣UI界面就被完美的呈現出來,而每次draw函數運行過程中,他會調用computerScroll函數,computerScroll()函數又會去調用Scroller類去計算滑動的數據,這樣一整套流程就同步起來了,各項數據源源不斷傳送給view的draw去繪製,其實這也是view動畫的實現原理(補間動畫),這就是我爲什麼將這個view滑動放到動畫的博客分類中原因,下篇文章來講講view動畫的實現流程

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章