ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

View的绘制流程

2021-03-13 19:32:13  阅读:170  来源: 互联网

标签:MeasureSpec int 流程 视图 static 绘制 public View


    在设计一个不能简单拼凑的自定义控件的时候,就需要设计人员自己实现控件的测量、布局和绘制等操作,而这需要熟练掌握View的绘制流程。

1. AndroidUI管理系统的层级关系

在这里插入图片描述
Activity是最外层载体,代表一个完整的用户界面,当我们使用setContentView方法来设置用户视图的时候,就会在DecorView中进行相关的渲染。而PhoneWindowActivityView的系统交互的接口。

1.2 绘制的整体流程

    当应用启动,会启动一个主Activity,并渲染关联的布局文件。绘制从根视图ViewRootperformTraversals()方法开始,从上到下遍历整个视图树,每个View控件负责绘制自己,而ViewGroup还需要负责通知自己的子View进行绘制操作。视图的绘制过程可以分为下面三个步骤:

  • Measure测量;
  • Layout布局;
  • Draw绘制;

VeiwRoot中的performTraversals()方法中的核心代码如下:

private void performTraversals(){
	int childWidthMeasureSpec = getRootMeasureSpec(mWidth, lp.width);
	int childHeightMeasureSpec = getRootMeasureSpec(mHeight, lp.height);
	// 执行测量流程
	performMeasure(childWidthMeasureSpec, childHeightMeasureSpec);
	// 执行布局流程
	performLayout(xxx);
	// 执行绘制流程
	performDraw();
}

注意到上面也就是前面提到的三个步骤的调用,那么MeasureSpec又是什么?

1.3 MeasureSpec

注意到是int申明,是一个整型值,32位。

  • 2位表示测量的模式SpecMode
  • 30位,表示某种测量规格下的SpecSize

MeasureSpecView类下的一个静态内部类,用来说明应该如何测量这个Veiw

public static class MeasureSpec {
		// 最大值测量模式
        public static final int AT_MOST = -2147483648;
        // 精确测量模式
        public static final int EXACTLY = 1073741824;
        // 不指定测量模式
        public static final int UNSPECIFIED = 0;

        public MeasureSpec() {
            throw new RuntimeException("Stub!");
        }
		// 根据指定的大小和模式,创建一个MeasureSpec
        public static int makeMeasureSpec(int size, int mode) {
            throw new RuntimeException("Stub!");
        }
        
        public static int getMode(int measureSpec) {
            throw new RuntimeException("Stub!");
        }

        public static int getSize(int measureSpec) {
            throw new RuntimeException("Stub!");
        }

        public static String toString(int measureSpec) {
            throw new RuntimeException("Stub!");
        }
    }

UNSPECIFIED不指定测量模式,很少用到。
EXACTLY精确测试模式,表示当该视图的layout_width或者layout_height被指定位具体数值或者match_parent时生效。
AT_MOST最大值模式,当视图的layout_width或者layout_height被指定为wrap_content时生效,此时的视图尺寸可以时不超过父视图允许的最大尺寸的任何值。


参考:Android高级进阶

标签:MeasureSpec,int,流程,视图,static,绘制,public,View
来源: https://blog.csdn.net/qq_26460841/article/details/114757684

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有