绘图机制

  1. Android中每一个组件的绘制过程,都要经过三个阶段:测量、布局、绘制,分别对应着方法onMeasure、onLayout、onDraw(这三个方法定义于View类中)。当然,这三个方法都是允许组件自己重定义的方法,来实现组件对自己的尺寸进行测量(①有child views时,要分别对子组件调用相关测量方法,比如measureChild、measureChildWithMargins等,并根据子组件的dimension来确定自己的尺寸;②最后要调用setMeasuredDimension(measuredWidth, measuredHeight)方法来保存自己的尺寸信息。)、对自己进行布局(调用onLayout,如果是container,同样需要对子组件进行布局,调用子组件的layout(int l, int t, int r, int b)方法,最终同样会执行子组件的onLayout方法来实现对子组件的布局(布局说白了就是确定自己的绘制位置,即左上右下四个坐标),对于容器来说,将其中的具体组件布局好了,也就将其布局好了)以及绘制自己的内容(调用onDraw方法,使用该方法的参数Canvas进行内容绘制);
  2. 从代码中看,Android的绘图是从ViewRootImpl类的performTraversals方法开始的,可以把这个方法视为一个顶层的控制方法,在其中控制整个绘图的流程。具体情况如下所述:

    Ⅰ首先,在其中会调用performMeasure方法,在performMeasure方法中调用View的measure方法(View的measure是final方法,方法原型为:

    public final void measure(int widthMeasureSpec, int heightMeasureSpec),

    也就是说不允许子类修改测量的框架,只能够修改真正进行测量工作的onMeasure方法),进而调用具体组件所实现的onMeasure方法。

    Ⅱ然后,测量结束后会调用performLayout方法,在performLayout方法中调用View的layout方法,该方法原型为:

    public void layout(int l, int t, int r, int b),

    在该方法中会调用View的onLayout方法,对组件进行布局。

    在拓展ViewGroup类的时候,对于所重写的onLayout方法,一般最后一步就是分别调用组件各自的layout方法来“Place the child.”。

    Ⅲ之后,会调用performDraw方法,通过performDraw -> draw -> drawSoftware最终会调用View的draw(Canvas)方法。在draw方法中会有六步操作,在第三步“draw the content”时会调用onDraw(Canvas)方法,进行内容的绘制。

  3. 总结:

    如果我们要拓展ViewGroup类实现一个布局,就要在其中重写onMeasure方法来对布局中的组件进行测量,并在获得其中所有组件的尺寸后计算得到布局的尺寸,然后调用setMeasuredDimension方法进行设置;之后还需要重写onLayout方法,在其中调用各个组件的layout方法,传入计算出的组件坐标位置,实现对组件的布局。

    至于绘制,则由具体的组件自己重写onDraw方法进行实现,在ViewRootImpl类的performTraversals逻辑中进行控制。

  4. 附加:

    ①在测量结束后(调用方法setMeasuredDimension后),就可以调用getMeasuredWidth和getMeasuredHeight来获取视图测量出的宽和高了,在这之前这两个方法返回值均为0;

    在布局结束后,就可以调用方法getWidth和getHeight来获取视图的宽高了。

    以上就是getMeasuredXXX与getXXX的区别,由于一般情况下,会根据测量的情况去布局组件,所以这两个方法的返回值是一样的。

    ②关于MeasureSpec

    MeasureSpec由specSize与specMode两部分组成,前者是大小信息,后者是模式信息。包括的模式有:

    EXACTLY

    表示父视图希望子视图的大小应该是由specSize的值来决定的,系统默认会按照这个规则来设置子视图的大小,开发人员当然也可以按照自己的意愿设置成任意的大小。

    AT_MOST

    表示子视图最多只能是specSize中指定的大小,开发人员应该尽可能小得去设置这个视图,并且保证不会超过specSize。系统默认会按照这个规则来设置子视图的大小,开发人员当然也可以按照自己的意愿设置成任意的大小。

    UNSPECIFIED

    表示开发人员可以将视图按照自己的意愿设置成任意的大小,没有任何限制。这种情况比较少见,不太会用到。

    MeasureSpec是一个32位的int数,其中的2位用来表示模式,余下30位用来表示size。

时间: 2024-10-30 09:39:38

绘图机制的相关文章

iOS的绘图机制

iOS的视图机制,提到了iOS的视图框框可以通过drawRect自己绘图,每个view的layer(CALayer)就像一个视图的投影,其实我们也可以来操作它定制一个视图,例如半透明圆角背景的视图. 要完成自己在视图上绘图,大家一定要了解一下iOS的绘图机制了.今天我试图也通俗地说一下iOS的绘图. 在iOS中绘图可以有两种方式: 1,采用iOS的核心图形库. 2,采用OpenGL ES. 这两个库的不同我简单介绍一下: 前者主要是通过核心图形库和UIKit进行封装,其更加贴近我们经常操作的视图

Swing绘图机制

------------------siwuxie095 工程名:TestSwingPaintMethod 包名:com.siwuxie095.swingpaint 类名:SwingPaintMethod.java(主类).MyPanel.java 工程结构目录如下: SwingPaintMethod.java(主类): package com.siwuxie095.swingpaint; import java.awt.BorderLayout; import java.awt.Color;

Android绘图机制(一) View类

对android绘图机制的理解,在Android学习中可谓至关重要,包括自定义控件也是使用非常频繁的内容.最近在项目中遇到一个比较棘手的问题,项目中好几个模块都用到ListView或者GridView的”下拉刷新,上拉加载更多“功能 .一开始在网上找了大牛写的作品,用在项目中后发现时不时会出现卡壳的现象,改进以后会有所改善,不过还是感觉有所欠缺.无奈我是个处女座菜鸟,尝试着找出这些问题的根本原因却发现无从下手,所以先补补基础.( 纯文字看着确实很费劲,所以顺便引用下其他的文章)  概述 View

SurfaceView绘图机制

一.为什么需要用SurfaceView绘图,不直接继承View绘图 它的特性是:可以在主线程之外的线程中向屏幕绘图上.这样可以避免画图任务繁重的时候造成主线程阻塞,从而提高了程序的反应速度.在游戏开发中多用到SurfaceView. 二.SurfaceView类的机制 1.简单机制:详见"Camera实现预览.拍照" 2.绘图机制主要方法: (1).abstract void addCallback(SurfaceHolder.Callback callback); // 给Surfa

第三章 Android绘图机制与处理技巧

1.屏幕尺寸信息 屏幕大小:屏幕对角线长度,单位“寸”:分辨率:手机屏幕像素点个数,例如720x1280分辨率:PPI(Pixels Per Inch):即DPI(Dots Per Inch),它是对角线的像素点数除以屏幕大小得到的:系统屏幕密度:android系统定义了几个标准的DPI值作为手机的固定DPI.(注,最后一个有笔误,正确的是1080x1920)独立像素密度(DP):android系统使用mdpi屏幕作为标准,在这个屏幕上1dp=1px,其他屏幕可以通过比例进行换算.在hdpi中,

Android群英传知识点回顾——第六章:Android绘图机制与处理技巧

6.1 屏幕的尺寸信息 6.1.1 屏幕参数 6.1.2 系统屏幕密度 6.1.3 独立像素密度dp 6.1.4 单位转换 6.2 2D绘图基础 6.3 Android XML绘图 6.3.1 Bitmap 6.3.2 Shape 6.3.3 Layer 6.3.4 Selector 6.4 Android绘图技巧 6.4.1 Canvas 6.4.2 Layer图层 6.5 Android图像处理之色彩特效处理 6.5.1 色彩矩阵分析 6.5.2 Android颜色矩阵--ColorMatr

Android绘图机制与处理技巧(四)——Android图像处理之画笔特效处理

除了常用的画笔属性,比如普通的画笔(Paint),带边框.填充的style,颜色(Color),宽度(StrokeWidth),抗锯齿(ANTI_ALIAS_FLAG)等,Android还提供了各种各样专业的画笔工具,如记号笔.毛笔.蜡笔等,使用它们可以实现更加丰富的效果. PorterDuffXfermode 下图中列举了16种PorterDuffXfermode,有点像数学中集合的交集.并集这样的概念,它控制的是两个图像间的混合显示模式. PorterDuffXfermode设置的是两个图层

Android绘图机制与处理技巧

一屏幕的尺寸信息 1屏幕参数 2系统屏幕密度 3独立像素密度dp 4单位换算 二2D绘图基础 三Android XML 绘图 Bitmap Shape Layer Selector 四绘图技巧 Canvas 一.屏幕的尺寸信息 1屏幕参数 屏幕大小 指屏幕对角线的长度,通常使用"寸"来度量,例如4.7寸手机 5.5寸手机等. 分辨率 分辨率是指手机屏幕的像素点个数,例如720*1280是指屏幕分变率,指宽有720个像素点,高有1280个像素点. PPI 每英寸像素(Pixels Per

Android 绘图机制:canvas初解

转载请注明转自:noyet12的博客 博客原址:http://blog.csdn.net/u012975705/article/details/49992947 Canvas 即"画布"的意思,在Android中用其来进行2D绘画. 在使用canvas来进行绘图时,一般都会自定义一个View来重写它的onDraw方法: public class CustomCanvas extends View { public CustomCanvas(Context context) { supe