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();
        }
    }


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