1.onFinishInflate()
当View中所有的子控件均被映射成xml后触发,从这里getChildAt才能得到子View
2.onSizeChanged()
在控件大小发生改变时调用。所以这里初始化会被调用一次
作用:获取控件的宽和高度
3.requestDisallowInterceptTouchEvent
阻止View的拦截事件
4.ViewConfigurationCompat.getScaledPagingTouchSlop(configuration)
触发移动事件的最小距离
5.getScrollX/getScrollY
返回当前滑动View左边界的位置,其实获取的值就是这块幕布在窗口左边界时的x/y坐标,即内容滑动的大小
6.scrollTo(int x,int y)
让View相对于初始的位置滚动某段距离
7.scrollBy(int x,int y)
让View相对于当前的位置滚动某段距离
8.Scroller构造方法
mScroller = new Scroller(context);
mScroller = new Scroller(context, interpolator, true);
9.Scroller:startScroll(x1, y1, offset_x, offset_y);
初始化滚动数据
滚动开始时X的坐标,第二个参数是滚动开始时Y的坐标,第三个参数是横向滚动的距离,正值表示向左滚动,第四个参数是纵向滚动的距离,正值表示向上滚动
10.Scroller:computeScrollOffset()
判断滑动动画是否结束
11.computeScroll
其内部完成平滑滚动的逻辑 。在整个后续的平滑滚动过程中,computeScroll()方法是会一直被调用的,因此我们需要不断调用Scroller的computeScrollOffset()方法来进行判断滚动操作是否已经完成了,如果还没完成的话,那就继续调用scrollTo()方法,并把Scroller的curX和curY坐标传入,然后刷新界面从而完成平滑滚动的操作
提前停止动画:
scroller.abortAnimation();
12.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
关闭View绘制硬件加速,硬件加速在开启的情况下很容易与Canvas和paint的一些配置不兼容,最常见的就是抛出不支持异常,如果有人在开启硬件加速的页面使用一下的接口,注意要加上try..catch代码防止出现问题。
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坐标系为准,大于0往正方向移动,小于0往负方向移动
15.ViewGroup中测量思路
1.根据MeasureSpec宽高mode和size
int specMode = MeasureSpec.getMode(spec);
int specSize = MeasureSpec.getSize(spec);
2.遍历子View并且测量,得到子view的宽高
测量子View的方法包括两个,一种考虑margin,一种不考虑margin,在getChildMeasureSpec方法中,会根据当前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.根据子View的宽高结合自身需求,设置自己的宽高
16.VelocityTracker
测试滑动速度。
初始化:
VelocityTracker tracker=VelocityTracker.obtain();
计算1000ms内滑动的平均速度:
tracker.computeCurrentVelocity(1000);
获取到水平方向上的速度:
float xV = tracker.getXVelocity();
重置速度计算器:
tracker.clear();