自定义View常用方法

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

你可能感兴趣的:(自定义View常用方法)