我是靠谱客的博主 生动蜗牛,最近开发中收集的这篇文章主要介绍android 自定义view流程,android自定义view之view的绘制流程,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

android中组件必须是view的直接子类或间接子类,其中view有一个名为viewGroup的子类,用于定义容器的组件(LinearLayout都是viewGroup的子类)。两者的区别是如果组件中还有子组件,就一定从viewGroup类继承,否则从view类继承。

要了解view的工作原理,先从activity的组成结构说起activity负责容器的生命周期及活动,窗口通过window来管理

window负责窗口管理(子类为phoneWindow),窗口的绘制和渲染交给decorView完成

decorView是view的根,layout.xml为decorView的子视图contentParent的子视图

layout.xml是我们定义的布局文件,最终inflate为decorView的子组件

phonewindow还关联了mWindowManager的windowmanager对象,windowManager会创建一个viewRootlmpl对象来和windowManagerService进行沟通,windowManagerService能获取触摸事件、键盘事件或轨迹球事件,并通过viewRootlmpl将事件分发给各个activity。另外viewRootlmpl还负责activity整个GUI的绘制。而绘制是从viewRootlmpl的performTraversals()开始的,performTraversals()包含三个重要的方法:1、performMeasure()

2、performLayout()

3、performDraw()

1、performMeasure()

performMeasure()方法负责组件自身尺寸的测量。只有当模式为wrap_content的时候才需要进行尺寸的测量。容器的尺寸依赖于子组件的大小,必须先测量子组件的大小,会调用子view的measure()方法。但组件的大小最终是由setFrame()方法决定的,该方法一般会参考measure出来的尺寸大小。

2、performLayout()

performLayout()方法用于确定子组件的位置。该方法只针对viewGroup容器类,为容器中的子view精确定义位置和大小。performLayout()调用layout(),在layout()方法中,在定位之前如果需要重新测量组件大小,则先调用onMeasure()方法,接下来执行setOpticalFrame()或setFrame()方法确定自身位置与大小此时保存了相关值,与具体绘制无关。随后onLayout()的方法被调用。

onLayout()方法在这里是当前组件为容器时,负责定义其子组件的位置。如果子组件也是一个容器,依然要负责其子组件位置的定位。依此类推,从最顶层的decorView开始,从上往下驱动,最后每个组件都放到了它应该出现的位置。

onLayout()方法和onMeasure()一样,是为开发人员预留的,自定义容器时必须重写。

3、performDraw()方法执行组件的绘制功能。每个组件只需负责自身的绘制。performDraw()调用draw(),draw()调用drawSoftware()。绘制组件是通过Canvas类完成的,paint类配置绘制参数。为了提高绘图效率,使用了surface技术,surface提供了双缓存,加快了绘图效率。

drawSoftware()方法中调用了mView的draw()方法,mView是activity中view的根decroview,也是容器,相当于FrameLayout。

下面以FrameLayout为例。FrameLayout的draw(),一是调用父类super.draw()方法绘制自己,二是将前景位图画在canvas上。FrameLayout继承自viewgroup。

先介绍一下view类的draw()方法background.draw() 绘制背景

onDraw() 绘制自己

dispatchDraw() 绘制子视图

onDrawScrollBars() 绘制滚动条

background是一个Drawable对象,直接绘制在canvas上,并与组件要绘制的内容不互相干扰。

onDraw()方法和onMeasure()与onLayout()一样,用于绘制组件本身。

dispatchDraw()也是一个空方法,用于容器组件。容器中的子组件必须通过dispatchDraw()方法进行绘制,viewgroup实现了该方法。在dispatchDraw()中,循环遍历每个子组件,并调用drawChild()方法绘制子组件,而子组件又调用view的draw()方法绘制自己。

组件的绘制也是一个递归过程,activity的根一定是容器,根容器绘制结束后开始绘制子组件,子组件如果是容器则继续往下绘制。

总结一下:UI界面绘制从开始到结束要经历以下几个过程

1、测量大小,执行onMeasure()方法

2、组件定位,执行onLayout()方法

3、组件绘制,执行onDraw()方法

最后

以上就是生动蜗牛为你收集整理的android 自定义view流程,android自定义view之view的绘制流程的全部内容,希望文章能够帮你解决android 自定义view流程,android自定义view之view的绘制流程所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(117)

评论列表共有 0 条评论

立即
投稿
返回
顶部