1. 程式人生 > >11.View的基礎知識

11.View的基礎知識

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          觸控事件主要有如下幾種:
  • ACTION_DOWN
  • ACTION_MOVE
  • ACTION_UP
    正常情況下, 一次手指頭觸控式螢幕幕的行為會觸發一系列點選事件,考慮如下情況
  • 點選屏幕後離開鬆開,事件序列為DOWN->UP
  • 滑動為:DOWN->MOVE->MOVE ->……->MOVE->UP
          3.2 TouchSlop       TouchSlop是系統能識別出的被認為是滑動的最小距離,換句話說,當手指在螢幕上滑動的時候,如此兩次滑動具體太短,系統不會認為他是一個滑動。     可以通過如下獲取這個常量:     ViewConfiguration.get( getContext()).getScaledTouchSlop()     這個常量,5.0中在如下檔案被定義:
    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();
        }
    }