@Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int measureWidth = MeasureSpec.getSize(widthMeasureSpec); setMeasuredDimension(measureWidth, (int) (measureWidth * 6F / 7F) / count);}
这个是比较常见的onmeasure方法下确定view宽和高的方法,它的参数是由父布局传递给子布局的,
一个MeasureSpec封装了父布局传递给子布局的布局要求,每个MeasureSpec代表了一组宽度和高度的要求。
一个MeasureSpec由大小和模式组成。它有三种模式:UNSPECIFIED(未指定),父元素部队自元素施加任何束缚,
子元素可以得到任意想要的大小;EXACTLY(完全),父元素决定自元素的确切大小,
子元素将被限定在给定的边界里而忽略它本身大小;AT_MOST(至多),子元素至多达到指定大小的值。
通过getsize()方法拿到尺寸,通过setMeasuredDimension方法进行设置。
注:在我们自定义view时,常常会拿到父布局view的尺寸,而在运行时,布局需要经过onmeasure,onlayout,ondraw方法后才会显示,在onmeasure方法执行
后才能使用width和height,不然会出现运行错误。通常这种情况有两种解决方法:
1⃣️view.getViewTreeObserver().addOnGlobalLayoutListener(new OnOnGlobalLayoutListener(){
@override
public void onGlobalLayout(){
view.getViewTreeObserver().removeGlobalLayoutListener(this);
view.getChildAt(1).getLeft() - view.getChildAt(0).getLeft();
}
});
2⃣️view.measure(0,0);
view.getMeasuredHeight();这样也能拿到测量之后的高度
onmeasure方法里的参数说明以及用width和height中所需要注意的事项
最新推荐文章于 2024-05-01 05:16:48 发布