一 view与window
众所周知,Activity是四大组件中唯一能与我们直接交互的组件,因为每个Activity都有一个Window对象,因为我们的View只有与Activity相关联,这个view才能显示出来,查看我们setContentView()方法的源码,就可以看到在该方法中又调用了window的实现类phonewindow中的setContentView()方法,并且将我们的view传了过去。
二 view与viewGroup
view代表我们界面控件的一种抽象,想我们平常所接触的TextView,ImageView都是继承View,而ViewGroup则更像是一种View的容器,例如: FrameLayout,linearLayout,在它的内部我们可以按照一定的规则放置View。而且在Android系统中,viewGroup也是继承View的,也就是说view本身可以是一个控件,也可以是多个控件。
不同的是viewGroup实现了ViewParent和ViewManager两个接口,ViewManager供了三个抽象方法, removeView,updateView addView,用来移除,更新,添加布局。 ViewParent主要提供了一系列操作子View的方法
三 : View树的层级结构,
先说下View的层级结构,DecorView是我们所设置布局的一个顶级容器,它本身是一个FramLayout,而这个FrameLayout只是一个View,需要展示在window上面,而我们一般展示的就是phonewindow上面,我们一般调用setContentView()方法,就是调用的PhoneWindow里面的setContentView(),在调用这个方法的时候,我们会先创建DecorView对象,然后会获取我们的Application,Activity中指定的风格,或者代码requestWindowFeature()指定的Features. 并且设置,这也是为什么要在调用setContentView()之前调用 requestWindowFeature() 的原因,然后我们再根据这些指定的theme或者Features去指定我们的窗口布局文件,用来存放我们Activity的自定义布局文件,一般为FrameLayout, id为content,我们一般可以通过ViewGroup content = finviewById(ViewGroup)findViewById(android.R.id.content)来得到我们设置的view
四: 我们自定义View主要用到的方法?
onMeasure() 主要用来传递系统已经为我们测量好的该控件的大小,该方法主要被measure()调用,而measure()是在父控件中调用的,用于给子控件传MeasureSpec(子控件的),我们在这个方法中可以用 setMeasuredDimension()重新设定大小
onLayout() 主要用来传递系统已经为我们测量好的该控件的位置,该方法主要被layout()调用,而layout()是在父控件中调用的,用于给子控件传四个角的位置(子控件的)