1.onFinishInflate()
當(dāng)View中所有的子控件均被映射成xml后觸發(fā),從這里getChildAt才能得到子View
2.onSizeChanged()
在控件大小發(fā)生改變時調(diào)用观挎。所以這里初始化會被調(diào)用一次
作用:獲取控件的寬和高度
3.requestDisallowInterceptTouchEvent
阻止View的攔截事件
4.ViewConfigurationCompat.getScaledPagingTouchSlop(configuration)
觸發(fā)移動事件的最小距離
5.getScrollX/getScrollY
返回當(dāng)前滑動View左邊界的位置,其實獲取的值就是這塊幕布在窗口左邊界時的x/y坐標(biāo)孕索,即內(nèi)容滑動的大小
6.scrollTo(int x,int y)
讓View相對于初始的位置滾動某段距離
7.scrollBy(int x,int y)
讓View相對于當(dāng)前的位置滾動某段距離
8.Scroller構(gòu)造方法
mScroller = new Scroller(context);
mScroller = new Scroller(context, interpolator, true);
9.Scroller:startScroll(x1, y1, offset_x, offset_y);
初始化滾動數(shù)據(jù)
滾動開始時X的坐標(biāo),第二個參數(shù)是滾動開始時Y的坐標(biāo)躏碳,第三個參數(shù)是橫向滾動的距離搞旭,正值表示向左滾動,第四個參數(shù)是縱向滾動的距離唐断,正值表示向上滾動
10.Scroller:computeScrollOffset()
判斷滑動動畫是否結(jié)束
11.computeScroll
其內(nèi)部完成平滑滾動的邏輯 选脊。在整個后續(xù)的平滑滾動過程中,computeScroll()方法是會一直被調(diào)用的脸甘,因此我們需要不斷調(diào)用Scroller的computeScrollOffset()方法來進(jìn)行判斷滾動操作是否已經(jīng)完成了恳啥,如果還沒完成的話,那就繼續(xù)調(diào)用scrollTo()方法丹诀,并把Scroller的curX和curY坐標(biāo)傳入钝的,然后刷新界面從而完成平滑滾動的操作
提前停止動畫:
scroller.abortAnimation();
12.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
關(guān)閉View繪制硬件加速,硬件加速在開啟的情況下很容易與Canvas和paint的一些配置不兼容铆遭,最常見的就是拋出不支持異常硝桩,如果有人在開啟硬件加速的頁面使用一下的接口,注意要加上try..catch代碼防止出現(xiàn)問題枚荣。
Canvas不支持硬件加速的二維繪圖接口:
- clipPath()
- clipRegion()
- drawPicture()
- drawPosText()
- drawTextOnPath()
- drawVertices()
Paint不支持硬件加速的接口:
- setLinearText()
- setMaskFilter()
- setRasterizer()
13.isHardwareAccelerated
判斷View是否被硬件加速
14.layout(int l, int t, int r, int b)
讓父布局重新擺放自己
15.offsetLeftAndRight()與offsetTopAndBottom()
使view左右/上下移動碗脊,以android坐標(biāo)系為準(zhǔn),大于0往正方向移動橄妆,小于0往負(fù)方向移動
15.ViewGroup中測量思路
1.根據(jù)MeasureSpec寬高mode和size
int specMode = MeasureSpec.getMode(spec);
int specSize = MeasureSpec.getSize(spec);
2.遍歷子View并且測量衙伶,得到子view的寬高
測量子View的方法包括兩個,一種考慮margin害碾,一種不考慮margin,在getChildMeasureSpec方法中矢劲,會根據(jù)當(dāng)前viewgroup的MeasureSpec和子View期望的寬高生成新的MeasureSpec
protected void measureChildWithMargins(View child,
int parentWidthMeasureSpec, int widthUsed,
int parentHeightMeasureSpec, int heightUsed) {
final MarginLayoutParams lp = (MarginLayoutParams) child.getLayoutParams();
final int childWidthMeasureSpec = getChildMeasureSpec(parentWidthMeasureSpec,
mPaddingLeft + mPaddingRight + lp.leftMargin + lp.rightMargin
+ widthUsed, lp.width);
final int childHeightMeasureSpec = getChildMeasureSpec(parentHeightMeasureSpec,
mPaddingTop + mPaddingBottom + lp.topMargin + lp.bottomMargin
+ heightUsed, lp.height);
child.measure(childWidthMeasureSpec, childHeightMeasureSpec);
}
protected void measureChild(View child, int parentWidthMeasureSpec,
int parentHeightMeasureSpec) {
final LayoutParams lp = child.getLayoutParams();
final int childWidthMeasureSpec = getChildMeasureSpec(parentWidthMeasureSpec,
mPaddingLeft + mPaddingRight, lp.width);
final int childHeightMeasureSpec = getChildMeasureSpec(parentHeightMeasureSpec,
mPaddingTop + mPaddingBottom, lp.height);
child.measure(childWidthMeasureSpec, childHeightMeasureSpec);
}
3.根據(jù)子View的寬高結(jié)合自身需求,設(shè)置自己的寬高
16.VelocityTracker
測試滑動速度慌随。
初始化:
VelocityTracker tracker=VelocityTracker.obtain();
計算1000ms內(nèi)滑動的平均速度:
tracker.computeCurrentVelocity(1000);
獲取到水平方向上的速度:
float xV = tracker.getXVelocity();
重置速度計算器:
tracker.clear();