View的原理及简介
- view是屏幕上的某一块矩形的区域,所有的view都是矩形的
- activity是加载并且控制view的,所有的图形化界面都是由view显示的,service之所以称之为没有界面的activity是因为他不能够加载view
- view是不能够添加子view的 viewGroup是可以添加子view的
- viewGroup之所以可以添加子view是因为他实现了两个接口1.viewParent 2.viewManager
- 一个view有且只能够有一个父view
- 顶层的FrameLayout的实现类是Decorview,它是在phoneWindow里面创建的
- 顶层的FrameLayout的父view是handler,handler的作用除了线程之间的通讯以外,还可以跟windowManagerService进行通讯
- windowManagerService是后台的一个服务,它控制并且管理者屏幕
- 一个应用可以有很多个window,其由windowManager来管理,而windowManager又由windowManagerService来管理
- 如果想要显示一个view那么他所要经历三个方法,1测量measure 2布局layout 3绘制draw
View的测量
- measure方法它是不能够被复写的,只能够被调用,因为view中的measure方法前面加了final.
- 如果想要在外部去获取控件的测量完成以后的宽跟高,那么getMeasuredWidth(),getMeasuredHeight().
- 如果想在activity中的onCreat()方法中获取控件测量以后的宽跟高,那么可以用一下方法:
final TextView tv_1 = (TextView) findViewById(R.id.tv_1);
tv_1.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
int measuredWidth = tv_1.getMeasuredWidth();
int measuredHeight = tv_1.getMeasuredHeight();
Log.i("====","width="+measuredWidth+",height="+measuredHeight);
}
});
关于widthMeasureSpec,heightMeasureSpec
int widthMode = MeasureSpec.getMode(widthMeasureSpec);
int widthSize = MeasureSpec.getSize(widthMeasureSpec);
int heightMode = MeasureSpec.getMode(heightMeasureSpec);
int heightSize = MeasureSpec.getSize(heightMeasureSpec);
- 合成
MeasureSpec.makeMeasureSpec(1080,MeasureSpec.AT_MOST);
- 两个参数的合成不仅跟父view的 测量模式有关系,还跟子view的layoutParams有关系
- 测量模式有三种
MeasureSpec.EXACTLY; //精确的 matchParent 固定dip
MeasureSpec.AT_MOST; //最多 wrapContent
MeasureSpec.UNSPECIFIED;//自定义,未知的
View的布局
- layout方法虽然可以被复写,但是不建议去复写,我们可以直接调用layout方法去确定自身的位置,而且可以去复写onLayout方法去确定子view的位置
- layout方法非常的直白,就是通过传进来的四个参数来判断当前控件的位置跟大小有没有发生变化