首页 > 系统 > Android > 正文

android view绘制流程解析

2019-11-09 18:05:00
字体:
来源:转载
供稿:网友

首先需要了解几个概念:

Activity:基本页面单元 Activity包含一个Window 上面可以绘制各种view

view:最基本ui组件 表示屏幕上的一个矩形区域

Window:表示顶层窗口 管理界面的显示和事件的响应 每一个activity都会创建一个

PhoneWindow对象:是activity和整个view系统交互的接口

phonewindow类继承于window类 同事phonewindow类内部包含了一个DecorVie对象 

相当于phoneWindow是把一个FrameLayout进行了一定的包装 并提供了一组通用的窗口操作接口

DecorView:是window中view的rootview设置窗口属性 是FrameLayout的子类

并且是PhoneWindow的一个内部类 DecorView(修饰类)就是对普通的FrameLayout进行了一定的修饰

比如添加一个通用的titlebar并且响应特定的按键消息

ViewRoot:并不是一个view类型 而是一个Handler

主要作用: 

向DecorView分发收到的用户发起的event事件 按键 触屏等事件

与windowmanagerservice交互 完成整个Activity 的gui绘制

整个view的绘制流程是在viewroot类的performTraversals()函数展开的 执行过程:

根据之前设置的转台 判断是否需要重新计算视图大小 measure 是否需要重新安置视图的位置layout

以及是否需要重新绘制draw

自定义ViewGroup

public class MyViewGroup extends ViewGroup{

public MyViewGroup(Context context){}

public MyViewGroup(Context context,AttributeSet attr){}

onMeasure(int widthMeasureSpec, int heightMeasureSpe){

int childCount = getchildCount();

//获取ViewGroup实际的宽度和长度 涉及到MeasureSpec类的使用

int specWidth = MeasureSpec.getSize(widthMeasureSpec);

int specHeight = MeasureSpec.getSize(heigthMeasureSpe);

//设置本ViewGroup宽高、

setMeasureDimension(specWidth,specHeigth);

//设置每一个子view

for(int i=0;i<childCount;i++){

View child = getChildAt(i);

child.measure(80,80);//设置宽高

}

onLayout(boolean changed,int l,int t,int r,int b){

int childCount = getChildCount();

int startLeft= 0;

int startTop =10;

for(int i=0;iKchildCount;i++){

View child = getChildAt(i);//获得每一个对象引用

child.layout(l,t,r,b);

startLeft =startLeft+child.getMeasuredWidth() + 10;  //校准startLeft值,View之间的间距设为10px ;              

}

}

dispatchDraw(Canvas canvas){}

drawChild(Canvas can,View child,long drawtime);

}

}

自定义View类型 MyView 重写onDraw()方法

public class MyView extends View{

PRivate Paint paint = new Paint();

MyView(Context context){}

protected void onMeasure(int width,int height){

//设置view大小

setMeasureDimension(80,80);

}

//存在canvas对象 存在默然显示区域

onDraw(Canvas canvas){

paint.setColor(Color.RED);

canvas.drawColor(Color.BLUE);//view的背景色

canvas.drawRect(0.0,30,30,paint);//绘制矩形

canvas.drawText("MyView",10,40,paint);

}

}

详情请参照:点击打开链接


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表