Android UI 學習 自定義的布局 平滑移動 VelocityTracker()


/**
 * Helper for tracking the velocity of touch events, for implementing
 * flinging and other such gestures.  Use {@link #obtain} to retrieve a
 * new instance of the class when you are going to begin tracking, put
 * the motion events you receive into it with {@link #addMovement(MotionEvent)},
 * and when you want to determine the velocity call
 * {@link #computeCurrentVelocity(int)} and then {@link #getXVelocity()}
 * and {@link #getXVelocity()}.
 */

 

這是注釋,在android 應用程序的開發過程中,可以實現比較絢麗,比如讓界面切換平滑的滾動,系統提供的應用在特效這方面提供簡單的動畫接口,

  自定義控件開發做一些簡單的介紹,

   自定義布局控件自然是要繼承某個View 或 ViewGroup

   開發自定義的ViewGroup 自然是要繼承ViewGroup 類,

  在繼承這個類之后,必須重寫的方法就是

  OnLayout(boolean changed ,int i int t int r ,int b);

  想要對布局控件以及其子控件的尺寸進行精確控制,重寫

  onMeasure(int widthMeasure,int heightMeasureSpec);

 

   介紹關於自定義控件進行平滑的移動,並能夠根據手勢的情況禪城慣性滑動的效果

  滑動效果需要的各種工具

 

  android.view.VelocityTracer;

  android.view.Scroller;

  android.view.ViewConfiguration

 

VelocityTracker從字面意思理解那就是速度追蹤器了,在滑動效果的開發中通常都是要使用該類計算出當前手勢的初始速度(不知道我這么理解是否正確,對應的方法是velocityTracker.computeCurrentVelocity(1000, mMaximumVelocity))並通過getXVelocity或getYVelocity方法得到對應的速度值initialVelocity,並將獲得的速度值傳遞給Scroller類的fling(int startX, int startY, int velocityX, int velocityY, int minX, int maxX, int minY, int maxY)方法進行控件滾動時各種位置坐標數值的計算,API中對fling方法的解釋是基於一個fling手勢開始滑動動作,滑動的距離將由所獲得的初始速度initialVelocity來決定。關於ViewConfiguration的使用主要使用了該類的下面三個方法:

 

configuration.getScaledTouchSlop()//獲得能夠進行手勢滑動的距離
configuration.getScaledMinimumFlingVelocity()//獲得允許執行一個fling手勢動作的最小速度值
configuration.getScaledMaximumFlingVelocity()//獲得允許執行一個fling手勢動作的最大速度值

 

需要重寫的方法至少要包含下面幾個方法:

onTouchEvent(MotionEvent event)//有手勢操作必然少不了這個方法了

computeScroll()//必要時由父控件調用請求或通知其一個子節點需要更新它的mScrollX和mScrollY的值。典型的例子就是在一個子節點正在使用Scroller進行滑動動畫時將會被執行。所以,從該方法的注釋來看,繼承這個方法的話一般都會有Scroller對象出現。

首先我們通過 VelocityTrackerViewConfiguration類得到一些慣性滑動所必須的變量,比如手勢離開屏幕時的初始速度,允許進行手勢操作的最小距離以及允許手勢操作的速度邊界值;
第二,創建Scroller的對象,使用它的fling方法供我們控制界面滑動使用;
第三,重寫onTouchEvent方法,當我們用手指在屏幕上來回滑動時此時執行的是scrollBy方法來刷新界面,當手指離開屏幕,此時就要開始執行ACTION_UP后面的操作了;
通過對手指離開屏幕時的速度進行判斷是否能夠進行慣性滑動操作,
如果能夠執行那么就使用Scroller類的fling方法啟動滑動動畫,
這時需要調用一下invalidate()方法來間接的調用computeScroll方法,
在computeScroll方法中對Scroller的動畫是否執行完成做了判斷,
如果動畫沒有完成( mScroller.computeScrollOffset() == true)那么就使用scrollTo方法對mScrollX、mScrollY的值進行重新計算刷新界面,
調用postInvalidate()方法重新繪制界面,
postInvalidate()方法會調用invalidate()方法,
invalidate()方法又會調用computeScroll方法,
就這樣周而復始的相互調用,直到 mScroller.computeScrollOffset()返回false才會停止界面的重繪動作


總結,滑動效果來看,它依然是在不停的計算控件的位置刷新屏幕,不停的繪制新的圖片替換舊的圖片,當然每次刷新的速度很快,從而給人一種是在快速滑動的感覺,寫到這里我發現,現在所謂的動畫總是逃脫不了電影的那種模式,每秒播放多少幀的圖片來達到連續播放的效果欺騙人的眼睛。
而且,關於android一些酷炫效果的開發,還是要自己多動手,熟悉View、ViewGroup中每個繪制方法、位置計算方法的調用方式以及順序,那么至少是在2D動畫開發中,也就是一種方式,逃脫不了不停重新繪制的這個圈。
關於熟悉View、ViewGroup中每個繪制方法、位置計算方法的調用方式以及順序的問題,我建議最好自己寫一個簡單的自定義View或ViewGroup的擴展類,重載那些繪制、位置計算的方法打個日志出來一看自然就明白了,雖然這個方法很笨,但是很容易出效果的

 

http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2012/1114/558.html

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM