自定义View

2020-03-11  本文已影响0人  zhujunhua
  1. 无论是measure过程、layout过程还是draw过程,永远都是从View树的根节点开始测量或计算(即从树的顶端开始),一层一层、一个分支一个分支地进行(即树形递归),最终计算整个View树中各个View,最终确定整个View树的相关属性。
  2. View的位置(left/top/rigth/bottom)是相对于父控件而言的;
  3. View的位置是通过view.getxxx()函数进行获取:
    // 获取view与父控件之间的距离
    getTop();
    getBottom();
    getLeft();
    getRigth();

与MotionEvent中 get()和getRaw()的区别:

    //get() :触摸点相对于其所在组件坐标系的坐标
     event.getX();       
     event.getY();

    //getRaw() :触摸点相对于屏幕默认坐标系的坐标
     event.getRawX();    
     event.getRawY();
MotionEvent.png
  1. 在默认的屏幕坐标系中角度增大方向为顺时针。(注:在常见的数学坐标系中角度增大方向为逆时针)
  2. View的测量

在某些情况下,需要多次测量(measure)才能确定View最终的宽/高;
该情况下,measure过程后得到的宽 / 高可能不准确;
此处建议:在layout过程中onLayout()去获取最终的宽 / 高

测量规格(MeasureSpec) = 测量模式(mode) + 测量大小(size

子View的MeasureSpec值根据子View的布局参数(LayoutParams)父容器的MeasureSpec值计算得来的,具体计算逻辑封装在getChildMeasureSpec()里。

MeasureSpec

getWidth() ( getHeight())与 getMeasuredWidth() (getMeasuredHeight())获取的宽 (高)有什么区别?

getWidth() / getHeight():获得View最终的宽 / 高
getMeasuredWidth() / getMeasuredHeight():获得 View测量的宽 / 高

参考:
自定义View系列

上一篇 下一篇

猜你喜欢

热点阅读