Android的View中比較有用的幾個方法

  1. getParent().requestDisallowInterceptTouchEvent(true);
    //屏蔽父控件攔截onTouch事件

  2. 動態(tài)創(chuàng)建View的時候,獲取View的大小

TextView mTextView = new TextView(this);
mTextView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 14);
mTextView.setText("hhhhhhhhh");
int spec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
mTextView.measure(spec, spec);
// getMeasuredWidthint
measuredWidth = mTextView.getMeasuredWidth();
```

  1. getWidth()和getMeasuredWidth()

    getWidth(): **
    得到的是view在父Layout中布局好后的寬度值,如果沒有父布局,那么默認(rèn)的父布局就是整個屏幕。
    注意這個沒有set方法**。

    ** getMeasuredWidth():**
    得到的是最近一次調(diào)用measure(int,int)方法測量后得到的是View的寬度,它僅僅用在測量和Layout的計算中。所以此方法得到的是View的內(nèi)容占據(jù)的實(shí)際寬度

  2. getX() getLeft() 和 getTranslationX()

盜圖一張
  • getLeft(): 是子View距離父View左邊的距離, 這個值不會隨著View的屬性(transitionX和X)的改變而改變。View在layout的時候,會調(diào)用setFrame()函數(shù)來改變left的值。也可以直接調(diào)用setLeft()來改變left值,但是調(diào)用setLeft方法之后,View的寬度也會改變。因?yàn)閂iew的大小是right - left之間的塊。(好像api并不提倡直接改變調(diào)用set方法),同時調(diào)用setLeft()和setRight()方法會改變View的大小。
  • getTranslationX():TranslationX 是view 相對于第一初始化時候(View 相對于left的位移),自己的位置的偏移量,向右為正,向左為負(fù),第一次初始化時候?yàn)???梢杂胹etTranslationX()方法,或者動畫來改變這個偏移量,而TranslationX的值得改變,不會導(dǎo)致getLeft()的值得改變。屬性動畫改變的是x和translationX的值,沒有改變left的值。
  • **getX() **= getLeft() + getTranslationX(), 注意setX其實(shí)是設(shè)置setTranslationX(),系統(tǒng)源碼
public void setX(float x) {
        setTranslationX(x - mLeft);
    }
  1. View 的幾個重要方法

    requestLayout:View重新調(diào)用一次layout過程

    invalidate:View重新調(diào)用一次draw過程

    forceLayout:標(biāo)識View在下一次重繪,需要重新調(diào)用layout過程。

    postInvalidate:這個方法與invalidate方法的作用是一樣的,都是使View樹重繪,但兩者的使用條件不同,postInvalidate是在非UI線程中調(diào)用,invalidate則是在UI線程中調(diào)用。

  2. 理解MeasureSpec三種模式

View的大小不僅由自身所決定,同時也會受到父控件的影響,為了我們的控件能更好的適應(yīng)各種情況,一般會自己進(jìn)行測量。他們是由 mode+size兩部分組成的。widthMeasureSpec和heightMeasureSpec轉(zhuǎn)化成二進(jìn)制數(shù)字表示,他們都是30位的。前兩位代表mode(測量模 式),后面28位才是他們的實(shí)際數(shù)值(size);MeasureSpec.getMode()獲取模式,MeasureSpec.getSize()獲取尺寸
測量View大小使用的是onMeasure函數(shù),所以我們需要了解三種測量模式:

  • EXACTLY:一般是設(shè)置了明確的值(10dp)或者是MATCH_PARENT
  • AT_MOST:表示子布局限制在一個最大值內(nèi),一般為WARP_CONTENT
  • UNSPECIFIED:表示子布局想要多大就多大,很少使用
  1. measure(int widthMeasureSpec, int heightMeasureSpec)方法會調(diào)用onMeasure(widthMeasureSpec, heightMeasureSpec);方法

  2. view.anim
    Android3.0 之后,Google給View增加了animate方法來直接驅(qū)動 屬性動畫,它可以被認(rèn)為是屬性動畫的一種簡寫方式。
    實(shí)例代碼:view.animate().x(500).y(500).setDuration(5000);
    注釋:操作的是View中的一個成員變量

   /**
     * Object that handles automatic animation of view properties.
     */
    private ViewPropertyAnimator mAnimator = null;
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容