首先在activity的onCreate(),方法中直接调用getWidth(),或者是调用getMeasureWidth(),此时获取的宽度都是为0,
因为view还没有进行测量绘制,那么必须要在onCreate(),方法获取的话,可以通过监听视图树,代码如下:
tv.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
int measuredHeight = tv.getMeasuredHeight();
int height= tv.getHeight();
System.out.println("measuredHeight " + measuredHeight);
System.out.println("height" + height);
tv.getViewTreeObserver().removeOnGlobalLayoutListener(this);
}
});
getMeasureHeight和getHeight 这两个方法的区别
//getMeasuredHeight 获取的是view原始的大小,也就是view在xml文件中配置的大小或者是view在代码中设置的大小,
//getHeight()获取的是view最终显示在屏幕的大小,这两个大小有可能是相等的
也可以通过手动测量获取View的大小,
tv.measure(0,0);
int measuredHeight = tv.getMeasuredHeight();
int height = tv.getHeight();
System.out.println("measuredHeight :" + measuredHeight);
System.out.println("height :" + height);
打印结果:
2019-07-04 09:47:56.357 24488-24488/com.bisien.measure I/System.out: measuredHeight :59
2019-07-04 09:47:56.357 24488-24488/com.bisien.measure I/System.out: height :0
tv.measure(0,0); 传递参数0和0表示测量交给系统去做,我们不参与任何的限制条件,但是这种方式大部分情况下都是正确的,一小部分是错误的,假设tv的text属性文字特别多,而且超过一行,这时测量的值就不正确。
widthMeasureSpec 包括两部分值,一个是size ,另一个是mode
size 这就不用多说就是控件的大小
mode 是包含三种模式:
1.AT_MOST 至多模式,在布局文件中匹配的是Worp_Content
2.EXACTLY 确定模式,在布局文件中写死的比如20dp,或者是Match_Parent
3.UNSPECIFIED 不确定的模式,在布局文件比如ListView、RecyclerView等控件
通过以下方式可以测量得到准确的值,
Display defaultDisplay = getWindowManager().getDefaultDisplay();
int width = defaultDisplay.getWidth();
int height1 = defaultDisplay.getHeight();
//给宽度加上设置条件,最多只有屏幕宽
int widthMeasureSpec = View.MeasureSpec.makeMeasureSpec(width, View.MeasureSpec.AT_MOST);
tv.measure(widthMeasureSpec,0);
int measuredHeight = tv.getMeasuredHeight();
此时获取高度的话就是准确的值
---------------------------------------------------------上面是之前对measure的理解------------------------------------------------
下面是对measure进一步的理解,首先每个view想要显示出来,都必须经过实际的测量,
自定义侧滑删除,的心路历程
super.onMeasure(widthMeasureSpec, heightMeasureSpec) 这个方法最终调用的是下面这个方法
setMeasuredDimension(widthMeasureSpec,heightMeasureSpec) 作用是确定当前View的宽度和高度
假设 你定义的View 继承HorizontalScrollView,如果设置宽度为超过屏幕宽度,那么你的view将不会滑动
注意:如果自定义view为,recyclerView 条目的Item,那么记得在OnBindViewHolder中设置主布局的width 为屏幕的宽度,此时才可以实现侧滑删除,否则主布局和侧滑删除布局都显示出来,入下图所示:
holder.layout_content.getLayoutParams().width = 1080;
加载布局使用以下方式进行加载
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.activity_main_hehe, parent, false);