11.View的基礎知識
阿新 • • 發佈:2018-11-15
1.View簡介
View是Android中所有控制元件的基類,不管是簡單的Button、TextView還是複雜的ListView、GridView什麼的,都是直接或者間接繼承View。因此,View是介面層的控制元件的一種抽象。除了View以外,還有ViewGroup,ViewGoup代表著一組控制元件,並且ViewGroup也繼承於View。這表示,View本身可以是單個,也可以是多個控制元件,這樣子就形成了View樹的結構,因此,View在xml中的表示就很直觀。
View這個體系,用的設計模式,就是我們常說的:組合(COMPOSITE) 設計模式。Composite使得使用者對單個物件和組合物件的使用具有一致性。
2.View的位置引數
View的位置主要由它的四個頂點決定,分別對應View的四大屬性:top、left、right、bottom,其中top是左上角的橫座標,left是左上角的橫座標,right是右上角的橫座標,bottm是右下角的縱座標。這些座標是相對於View的父容器來說的。
由此可以知道View的寬高和座標的關係:
width = right - left;
height = bottom - top;
從Android 3.0開始,View增加了額外的幾個引數,x、y、translationX和translationY,其中x 和 y 是View左上角的座標,而translationX和TranslationY是View左上角相對的偏移量,這幾個引數也是相對於父容器的座標,並且translationX和translationY的初始值是0.
x = left + translatioX
當我們設定通過setTranslationX和setTranslationY來設定View的偏移量時候,我們可以讓View進行平移。在平移過程中,top 、left表示的是原始左上角的資訊,它不會因為平移而改變,這時候,改變的是x和translationX,以及y和translationY.
3.MotionEvent和TouchSlop
3.1 MotionEvent
觸控事件主要有如下幾種:
5.0以下,就是在ViewConfiguration中固定的值:
4.VelocityTracker和Scroller 4.1 VelocityTracker 速度追蹤,用於追蹤手指在滑動過程中的速度,包括水平和豎直方向的速度,它的使用過程很簡單,首先在View的onTouchEvent方法中追蹤當前單擊事件的速度。 //從SynchronizedPoll中去取出一個速度追蹤器
接著,當我們想知道當前的滑動速度的時候,這個可以採用如下方式來獲得當前的速度:
注意:值可能為負的。 速度 = ( 終點位置 - 起點位置 ) /時間段; 當我們不再使用它的時候,需要用clear()來重置並且回收記憶體。 4.2 Scroller 在View中,有scrollTo和scrollBy方法,可以染給我們對 控制元件的內容進行滑動。但是,這個滑動缺少了過渡效果。而我們是用scroller的話,就可以實現有過渡效果的滑動了。因為scroller可以把我們的滑動,分為許多次滑動,從而實現這種過渡效果。 示例程式碼如下:
3.MotionEvent和TouchSlop
- ACTION_DOWN
- ACTION_MOVE
- ACTION_UP
- 點選屏幕後離開鬆開,事件序列為DOWN->UP
- 滑動為:DOWN->MOVE->MOVE ->……->MOVE->UP
frameworks/base/core/res/res/values/config.xml
<!-- Base "touch slop" value used by ViewConfiguration as a
movement threshold where scrolling should begin. -->
<dimen name="config_viewConfigurationTouchSlop">8dp</dimen>
5.0以下,就是在ViewConfiguration中固定的值:
/**
* Distance a touch can wander before we think the user is scrolling in pixels
*/
private static final int TOUCH_SLOP = 16;
4.VelocityTracker和Scroller 4.1 VelocityTracker 速度追蹤,用於追蹤手指在滑動過程中的速度,包括水平和豎直方向的速度,它的使用過程很簡單,首先在View的onTouchEvent方法中追蹤當前單擊事件的速度。 //從SynchronizedPoll中去取出一個速度追蹤器
<span style="white-space:pre"> </span>VelocityTracker velocityTracker = VelocityTracker.obtain();
velocityTracker.addMovement( event );
接著,當我們想知道當前的滑動速度的時候,這個可以採用如下方式來獲得當前的速度:
velocityTracker.compuCurrentVelocity( 1000);
int xVelocity = (int)velocityTracker.getXVelocity();
int yVelocity = (int)velocityTracker.getYVelocity();
注意:值可能為負的。 速度 = ( 終點位置 - 起點位置 ) /時間段; 當我們不再使用它的時候,需要用clear()來重置並且回收記憶體。 4.2 Scroller 在View中,有scrollTo和scrollBy方法,可以染給我們對 控制元件的內容進行滑動。但是,這個滑動缺少了過渡效果。而我們是用scroller的話,就可以實現有過渡效果的滑動了。因為scroller可以把我們的滑動,分為許多次滑動,從而實現這種過渡效果。 示例程式碼如下:
Scroller scroller = new Scroller( mContext );
//這個方法是自己定義的 不是複寫的
private void smoothScrollTo( int destX, int destY)
{
int scrollX = getScrollX();
int delta = destX - scrollX;
mScroller.startScroll( scrollX, 0 , delta 0 , 1000);
//在UI執行緒中執行
invalidate();
}
@override
public void compueScroll()
{
if( mScroller.computeScrollOffset())
{
scrolTo( mScroller , getCurrX(), mScorller.getCurrY());
//computeScroll可能在子執行緒執行,所以用這個postInvalidate方法。
postInvalidate();
}
}