activity界面学习

来源:互联网 发布:淘宝6.5.0版本下载 编辑:程序博客网 时间:2024/06/05 09:47

控件的大致分类 : ViewGroup控件 View控件

Activity 界面架构图 : Activity ->PhoneWindow->DecorView->TitleView ContentVie
每个Activity都包含一个Window对象 ,Window对象通常由 PhoneWindow实现
PhoneWindow对象把一个DecorView设置为整个应用窗口的根View,作为窗口界面的顶层视图,DecorView装载了一个LinearLayout,会根据相应了参数设置不同的布局,如果设置requestWindowFeature(Window.FEATURE_NO_TITLE)来设置全屏显示,视图树中就只剩Content了,requestWindowFeature()方法要在setContentView()方法之前
ContentView 是一个id为content的FrameLayout
程序在onCreate方法()中调用setContentView方法后ActivityMangerService会回调onMeasure()方法,此时系统才会把整个DecorView添加进PhoneWindow中,并让其显示出来,完成绘制

在onMeasure()方法中进行View的测量.
MeasureSpec类:是一个32位的int值,其中高2位为测量的模式,低30位为测量的大小,使用位运算符是为了提高并优化效率.
测量方式:
EXACTLY:精确值模式,设置width为具体的值的时候,系统使用的是EXACTLY模式
AT_MOST:最大值模式,当控件的width属性或height属性指定为wrap时,控件大小一般随着控件的子控件或内容的变化变化,此时控件的尺寸只要不超过父类的尺寸即可
UNSPECIFIED:不指定其大小测量模式,view想多大就多大,在绘制自定义View的时候使用

onMeasure()方法 最终会调用setMeasuredDimension(int measuredWidth,int measuredHeight)方法把测量后的宽高设置进去. 最后在onMeasure中用setMeasuredDimension(width,height)重新定义宽高 //super.onMeasure(width,height)也是调用的这个方法
自定义测量值例子:

int specMode=MeasureSpec.getMode(measureSpec);//int specSize=MeasureSpec.getSize(measureSpec);int result=0;if(specMode==MeasureSpec.EXACTLY){    result=specSize;//如果是指定的,直接指定测量值}else{    result=200;//需要指定一个默认值    if(specMode==MeasureSpec.AT_MOST){//如果是warpcontent        result=Math.min(result,specSize);//需要从默认值和测量值中取出最小的    }}return result;

View的绘制,重写onDraw方法,在canvas上来绘制所需要的图形
创建一个canvas时,最好传一个bitmap进去,传进去的bitmap与通过这个bitmap创建的canvas画布联系一起,这个过程被称之为装载画布,这个bitmap用来存储所有绘制在canvas上的像素信息

0 0