getParent().requestDisallowInterceptTouchEvent(true);
//屏蔽父控件攔截onTouch事件-
動態(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();
```
-
getWidth()和getMeasuredWidth()
getWidth(): **
得到的是view在父Layout中布局好后的寬度值,如果沒有父布局,那么默認(rèn)的父布局就是整個屏幕。注意這個沒有set方法**。** getMeasuredWidth():**
得到的是最近一次調(diào)用measure(int,int)方法測量后得到的是View的寬度,它僅僅用在測量和Layout的計算中。所以此方法得到的是View的內(nèi)容占據(jù)的實(shí)際寬度 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);
}
-
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)用。
理解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:表示子布局想要多大就多大,很少使用
measure(int widthMeasureSpec, int heightMeasureSpec)方法會調(diào)用onMeasure(widthMeasureSpec, heightMeasureSpec);方法
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;