测量方法&属性

获取view的宽高属性

View.getMeasuredWidth()         //获取测量的宽高
View.getLayoutParams().width    //通过xml布局文件layout属性,来获取宽高属性
View.getWidth()                 //获取测量好的宽高

使用时机

View.getMeasuredWidth()         //onMeasure()方法之后(包含此方法)
View.getLayoutParams().width    //onMeasure()方法之后(包含此方法)
View.getWidth()                 //onSizeChanged()方法之后(包含此方法)

些许bug

View.getMeasuredWidth()         //一般情况下测量很准确,但是如果view最外层的xml有background背景图片,系统测量时会参考background图片的大小,可能会造成测量不准确
View.getLayoutParams().width    //xml没有明确的dp值,根据属性可能有值: -1(LayoutParams.MATCH_PARENT=-1),-2(LayoutParams.WRAP_CONTENT=-2)
View.getWidth()                 //一般没有坑

View.getLayoutParams()

onFinishInflate()执行时,还未载入xml布局文件,此时调用View.getLayoutParams()会造成空指针异常

View.getLeft()

View.getLeft()参照最近一次layout()布局,如果布局不变,使用scrollTo()方法移动view,系统也判定view的布局未改,View.getLeft()值也不变

scrollTo()

此方法并不真正改变view的layout(left,top,right,buttom)布局,只是让我们看到view能够移动,在系统中view的布局不变

onLayout()

此方法一般被调用2次

recyclerView条目要使用一下方式解析xml布局,否则最外层的控件宽度高度不生效

View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item, parent,false);

事件传递至少应当有 ACTION_DOWN

  • dispatchTouchEvent()
MotionEvent传递 ACTION_DOWN ACTION_MOVE
  • onInterceptTouchEvent()
MotionEvent传递 ACTION_DOWN 
  • onTouchEvent()
MotionEvent传递 ACTION_DOWN ACTION_MOVE

你可能感兴趣的:(测量方法&属性)