系统View继承关系

NeatReader-1661534020293.png

Android坐标相关

Android的坐标系

  1. Android坐标系NeatReader-1661534807639.png
  2. View(视图)坐标系NeatReader-1661534526515.png

View自身的坐标

通过如下方法可以获得View到其父控件(ViewGroup)的距离。

  • getTop():获取View自身顶边到其父布局顶边的距离。
  • getLeft():获取View自身左边到其父布局左边的距离。
  • getRight():获取View自身右边到其父布局左边的距离。
  • getBottom():获取View自身底边到其父布局顶边的距离。

MotionEvent获取焦点坐标

  • getX():获取点击事件距离控件左边的距离,即视图坐标。
  • getY():获取点击事件距离控件顶边的距离,即视图坐标。
  • getRawX():获取点击事件距离整个屏幕左边的距离,即绝对坐标。
  • getRawY():获取点击事件距离整个屏幕顶边的距离,即绝对坐标。

View的滑动方式:

当点击事件传到Vi e w时,系统记下触摸点的坐标,手指移动时系统记下移动后触摸的坐标并算出偏移量,并通过偏移量来修改View的坐标。实现方法如下:

  1. layout() 方法
  2. offsetLeftAndRight(),offsetTopAndBottom()
  3. 修改LayoutParams
  4. 使用动画:
    1. View动画
    2. 属性动画
  5. View的scrollTo(),scrollBy()方法
  6. Scroller类
  7. ViewDragHelper

scrollTo()、scrollBy()

  1. scrollTo(x,y)表示移动到一个具体的坐标点,而scrollBy(dx,dy)则表示移动的增量为dx、dy。其中,scollBy最终也是要调用scollTo的。
  2. 他们移动的是屏幕,不是View本身。
  3. scollTo/scollBy方法进行滑动时,这个过程是瞬间完成的。

Scroller

  1. scollTo/scollBy方法进行滑动时,这个过程是瞬间完成的,体验不好,使用 Scroller 来实现有过渡效果的滑动。
  2. Scroller本身是不能实现View的滑动的,它需要与View的computeScroll()方法配合才能实现弹性滑动的效果。

Scroller源码解析

动画

View的Motion事件分发机制

Android View-Motion事件分发机制

View的绘制流程

View的绘制流程

自定义View

自定义View