android:绘制view过程学习记录

Android View的绘制流程三部曲 如果我们用面向对象的思维方式来思考,就会觉的View的绘制机制是很合理,很科学的。我们要在一张纸上画一幅画,首先我们要测量一下这幅画有多大吧,然后确定在纸的哪个地方画会显得比较美观,最后才是用画笔工具将画绘制在纸上。 在Android中也是一样的。View的绘制流程主要是指measure,layout,draw这三步,即测量,布局,绘制。首先是要测量View的宽高,然后布局确定在父容器中的位置坐标,最后才是绘制 阅读详情

View的getWidth和getHeight,getMeasuredWidth和getMeasuredHeight是在view放到layout中显示的时候才能获得正确的值的,但是往往我们需要在它显示之前就知道它的大小是多少,宽高是多少。怎么实现呢?我们需要预估View的宽高。

其实在View显示出来之后再获取它的宽高时能正确的得到它的大小,android绘制view的过程简单描述可以解释为:

计算大小(measure)、布局坐标计算(layout)、绘制到屏幕(draw);

第一步:

当activity启动时,初始化view,由Window对象DecorView调用View对象的public final void measure(int widthMeasureSpec, int heightMeasureSpec)方法开始。

第二步:

View的measure方法onMeasure(widthMeasureSpec, heightMeasureSpec),该方法进行实质性的view大小计算。注意:view的代销是由父view和自己的大小决定的,而不是单一决定的。这也就是为什么viewGroup的子类会重新该方法,比如linearLayout等。因为他们要计算自己和子view的代销。view基类有自己的实现,只是设置大小。其实根据源码来看,measure的过程本质就是把Match_parent和wrap_content转换为实际大小。

第三步:

当measure计算大小完成后,开始调用view的public final void layout(int l, int t, int r, int b),viewGroup将此方法abstract了,所以我们继承viewGroup的时候,需要重新该方法。该方法的实质是通过measure计算好的大小,计算出view在屏幕上的坐标点。

第四步:
measure完成了,layout过了,那么就要开始会知道屏幕上了,所以开始调用view的 public void draw(Canvas canvas)方法,此方法可以重写,自定义view的绘制。

1.一个是measure();

2.一个是requestLayout();

View.measure()方法的原型如下:

View.measure(widthMeasureSpec, heightMeasureSpec)它的两个参数是两个可以经过计算获得的MeasureSpec值,不需要时可以传两个0.

通过下面的方法可以计算得到MeasureSpec值:

View.MeasureSpec.makeMeasureSpec(maxW, View.MeasureSpec.AT_MOST)

这个方法的两个参数:

第一个参数表示父View中允许这个子View占用的宽/高;

第二个参数是模式,它有三种选择:

UNSPECIFIED:不限定;

EXACTLY:固定,确定大小;

AT_MOST:最多,最大大小。

具体请参照:http://www.eoeandroid.com/thread-200062-1-1.html

Android中View和ViewGroup介绍 图1 窗口系统的客户端DecorView实际上是一个ViewGroup。在依存关系上来讲,对单个主窗口来讲,DecorView是Top-Level View。View并不是关注的重点,重要的是我们需要知道消息分发路径是建立在什么关系上的。View的成员变量mParent用来管理View上级关系的。而ViewGroup顾名思义就是一组View的管理,于是在ViewGroup构建了焦点管理和子View节点数组。 阅读详情

相关推荐

Android View绘制6 Draw过程(下)

一 概述 上篇分析了自定义 View 绘制流程及其常用方法:Android View绘制4 Draw过程(上), 本篇将从代码的角度深入分析硬件加速绘制与软件绘制。 通过本篇文章,你将了解到: 1、软件绘制流程 2、硬件加速绘制流程 2、LayerType 对绘制的影响 3、Canvas 从哪里来到哪里去 4、绘制流程全家福 二 软件绘制流程 上篇说过在ViewRootImpl->draw(xx)里软件绘制与硬件加速绘制分道扬镳: 上图是Window 区分硬件加速绘制与软件绘制的入口。 由易到难,先

liuwg1226的专栏 918

androidP: View的工作原理-理解MeasureSpec

参考链接 https://blog.csdn.net/carson_ho/article/details/94545178?utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2aggregatepagefirst_rank_ecpm_v1~rank_v31_ecpm-7-94545178.pc_agg_new_rank&utm_term=android+measurespec.makemeasurespec&spm=1

zhuowalun8427的博客 253

自定义控件知识储备-View的绘制流程

在自定义控件这个学习系列里,首先写篇文章记录一下View的绘制流程,压压惊:-P。也为以后的自定义控件实践打个基础。虽然讲解View工作流程的文章很多,其中不乏很多精品文章,不过自己能从中理清思路,以自己之言总结出来,也是十分必要的。

蘑菇君的学习之路 1万+

Android进阶---自定义View:MeasureSpec的真正意义与View大小控制

接收到父控件传递的MeasureSpec后,View应该如何用来处理自己的尺寸呢?onMeasure是View测量尺寸最合理的时机,如果View不是ViewGroup相对就比较简单,只需要参照MeasureSpec,并跟自身需求来设定尺寸即可,默认onMeasure的就是完全按照父控件传递MeasureSpec设定自己的尺寸的。

2401_83704192的博客 1733

MeasureSpec三种测量模式详解例子

MeasureSpec三种测量模式详解例子

硬件基础(4):(7)ADC电压采集:软件校准(标定、拟合)

在实际项目中,**软件端校准**可以有效弥补硬件方面(分压电阻误差、放大器失调、参考源误差等)带来的系统性偏差,从而提高 ADC 测量精度。下面是一个常见的**多点实测校准**流程与思路,个人感觉传感器标定的原理也只这样。

FCZlll的博客 6241

Android之:了解MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,MeasureSpec.AT_MOST)

在自定义View和ViewGroup的时候,我们经常会遇到int型的MeasureSpec来表示一个组件的大小,这个变量里面不仅有组件的尺寸大小,还有大小的模式。 这个大小的模式,有点难以理解。在系统中组件的大小模式有三种: 1.精确模式(MeasureSpec.EXACTLY) 在这种模式下,尺寸的值是多少,那么这个组件的长或宽就是多少。 2.最大模式(MeasureSpec.AT_MO...

fanleiym的专栏 646

Paypal开发者中心获取“ClientId”和“ClientSecret”参数

正式环境设置 1、登录到 paypal开发者中心 网址:https://developer.paypal.com/developer/ 点击右上角登录按钮登录 2、左侧栏 - 我的应用程序和凭证 - 点击“创建新应用” 新注册的paypal账号,需要进行邮箱验证,验证通过后,需要等待一段时间(或重新登录),才会出现相关设置项位置 验证邮箱通过后,点击创建新应用 3、按提示填写,保存创建应用 4、点击刚创建的应用进入应用详情页 5、应用详情页获得网站开发人员所需要的“ClientId”和“Client

龚清林的博客 1万+

使用View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED)在在onCreate中获得控件的大小问题

android 在onCreate中获得控件的大小 int w = View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED); int h = View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED); edt_height.measure(w, h)...

qijingwang的博客 7125

从零到一:基于Blazor和Elsa Workflows的工作流系统开发实战

本文详细介绍了如何利用Blazor和Elsa Workflows构建高效的工作流系统,从技术选型到生产环境部署,涵盖动态工作流建模、Blazor前端集成及性能优化等核心内容。通过实战案例,展示如何实现订单处理系统的自动化与灵活性,提升企业流程效率。

weixin_26875109的博客 428

AUTOSAR从入门到精通-复杂设备驱动(CDD)

CDD是复杂设备驱动的首字母缩写主要为驱动程序或复杂驱动程序,但不限于驱动程序。复杂驱动程序是一种未被AUTOSAR标准化的软件实体,可以通过AUTOSAR接口和/或基本软件模块api访问。 CDD是位于基础软件复杂驱动层的特定模块,与标准BSW模块或Rte交互。 CDD可能需要与分层软件体系结构的模块连接 分层软件架构的模块可能需要连接到CDD CDD可能需要通过Rte连接swc。

getusushu的博客 4193

Android-高级-UI-进阶之路-(三)-理解-View-工作原理并带你入自定义-View-门

final MarginLayoutParams lp = (MarginLayoutParams) child.getLayoutParams(); //得到子元素的 MeasureSpec final int childWidthMeasureSpec = getChildMeasureSpec(parentWidthMeasureSpec, mPaddingLeft + mPaddingRight + lp.leftMargin + lp.rightMargin widthUsed, lp.widt

m0_64319166的博客 293

030、自动白平衡AWB实战:灰度世界、完美反射与色温估计的工程实现与局限

本文深入探讨了自动白平衡(AWB)算法在工程实践中的实现与局限性。作者结合实际项目经验,分析了灰度世界算法、完美反射算法和色温估计三种主流方法的优缺点和适用场景,并分享了调试过程中的关键技巧和常见陷阱。文章指出,纯色背景、多光源环境等特殊场景容易导致算法失效,需要通过混合策略和场景检测来优化。作者强调AWB调试需要大量实际场景测试,建议保留手动调节功能,并针对不同硬件配置进行参数标定。最后提出,AWB优化是一个持续迭代的过程,需要工程化的测试方法和数据处理能力。

zzfmlxs的博客 282

自定义view学习笔记一:五角星绘制

刚开始学习自定义view,记录一下学习过程。 参考了网络上的一些博文,自定义view需要关注最多的就是3个方法:onMeasure(), onLayout(),onDraw(),而其中最关键的就是onDraw()方法了。而自定义view中我们需要做的就是在canvas上面通过paint来画出我们想要的图形,下面是画五角星的代码。 package com.leen.android.customvie...

痴人说梦 847

基于STM32F103的智能门禁门锁门卫系统设计

本文设计了一种基于STM32F103单片机的智能门禁系统,集成了密码、射频IC卡和指纹识别三种验证方式。系统采用模块化设计,包含MFRC522射频模块、AS608指纹模块、矩阵键盘、OLED显示和舵机控制等硬件,实现了身份验证、密码修改、IC卡/指纹管理以及安全防护功能。测试结果表明系统响应迅速(密码验证250ms、指纹验证600ms)、功耗低(待机50mA),且具备掉电密码保存功能。该系统操作简便、功能完善,适用于家庭和办公场所,具有较高实用价值。未来可扩展远程控制、人脸识别等功能以进一步提升智能化水平。

3254968421的博客 319

Vue3 - 详解实现网站接入微信扫码登录功能,微信授权生成登录二维码用户用手机扫描二维码登陆,微信扫描二维码登录详细流程及示例代码,支持弹框式、浏览器单独新开页显示,最新vue集成微信扫码授权登录!

vue3,nuxt3,PC网站,网页,微信扫码登录,微信登陆,vue3微信扫码登录,获取个人信息,扫码登录后如何获取用户手机号,微信扫码授权登录,vue3详细实现微信扫一扫登陆,pc网页微信登录,vue3集成微信扫码登录,详细流程和示例源码,第三方扫码登录,vue3微信扫码登录怎么新开一页,跳页显示二维码,内嵌登录二维码,iframe,iframe新页面弹出,弹出一个小窗口显示登录二维码,登录报错,微信扫码没反应,解决手机点登录报错没反应,官方文档,手机扫描微信二维码登录网站,最好用的插件,vue-wxlo

🏆 前端领域优质创作者 1万+

android view 绘制过程,深入理解Android中View绘制的三大流程

前言最近对Android中View的绘制机制有了一些新的认识,所以想记录下来并分享给大家。View的工作流程主要是指measure、layout、draw这三大流程,即测量、布局和绘制,其中measure确定View的测量宽高,layout根据测量的宽高确定View在其父View中的四个顶点的位置,而draw则将View绘制到屏幕上,这样通过ViewGroup的递归遍历,一个View树就展现在屏幕...

weixin_31001069的博客 2011

C语言使用开源库libusb进行USB设备操作

https://libusb.info/libusb is a C library that provides generic access to USB devices. It is intended to be used by developers to facilitate the production of applications that communicate with USB hardware. It is portable: Using a single cross-platform AP

m0_60352504的博客 1554

Android View 绘制流程 过程分析

前言 今天整理了一下Android View的绘制流程,记录一下 一、如何获取View的宽高 我们经常会遇到要获取控件宽高的情况,可以通过以下两种方式来获取。 1. 通过View的post() MFragmentTabView tabView = findViewById(R.id.fragment_tab_view); tabView.post(new Runnable() { @Override public void run() { tabView.getW

不再烦恼 2041

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

揭秘 Android View 绘制原理:从源码剖析到极致理解

在 Android 系统里,用户界面是由一个个 View 或 ViewGroup 构成的。View 作为界面的基本元素,其绘制过程直接影响着界面的显示效果和性能。一个高效、正确的绘制过程能够保证界面的流畅性和美观性,提升用户体验。而对绘制原理的深入理解,有助于开发者优化布局、解决绘制冲突以及实现自定义的 UI 效果。继承 View 类:创建一个新的类,继承自View或其子类(如ViewGroup重写构造函数:在构造函数中进行必要的初始化操作,如初始化画笔、加载资源等。重写onMeasure方法。

Android开发领域创作者 992

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

浅析Android View的软件绘制流程

前言 在《浅析Android中View的测量布局流程》中分析到,VSYNC信号到达App进程之后开启了View布局过程,经过对整个View树遍历完成测量和布局,最终确定所有View的大小以及在屏幕中所处的位置。但是View的内容想要在屏幕上可见,还需要经过绘制渲染来生成图形数据并交由硬件来刷新屏幕才可以。 在《浅析Android View绘制过程中的Surface》中分析到,View绘制渲染生成的图形数据需要在进程间传输,最终才能完成合成上屏。基于跨进程的数据传输,生产者(通常是App进程)生产图形数据并交

boker_han的博客 1525

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

View的绘制流程

View绘制的三大流程主要指:measure(测量)、layout(布局)、draw(绘制)。measure过程中确定View的尺寸(即宽高),layout过程中确定View的位置(即上下左右的位置),draw过程确定View显示的内容。在开发中,通常都是在Activity的onCreate()中调用setContentView(R.layout.custom_layout)来实现想要的页面布局。...

走向远方 2373

Android基础之View的绘制原理

绘制完毕之后干嘛呢。会交个RenderThread处理,然后交给SurfaceFlinger,最后显示到屏幕上。

Misdirection_XG的博客 1240

安卓View的绘制流程和机制

View系统的绘制流程会从ViewRoot的performTraversals()方法中开始,performTraversals()的意思是:执行遍历 View的整个绘制流程可以分为以下三个阶段: measure: 判断是否需要重新计算View的大小,需要的话则计算; layout: 判断是否需要重新计算View的位置,需要的话则计算; draw: 判断是否需要重新绘制View,需要的话则重...

kdsde的专栏 1208

Android 中View的绘制机制源码分析 一

差不多半年没有写博客了,一来是因为工作比较忙,二来是觉得没有什么比较值得写,最近对Android中View的绘制机制有了一些新的认识,所以想记录下来并分享给大家。在之后的几篇博客中,我会给大家分享如下的内容:1、View中measure(),layout(),draw()函数执行过程分析,带领大家详细分析View的尺寸计算,位置计算,并最终绘制到UI上的过程2、以LinearLayout为例讲解尺

Android学习之旅 5634
上一篇: android:listView学习记录2
下一篇: 打开思维的枷锁:选项卡切换、手势识别动作ViewFlipper的一个案例分析
extjavaee
博客等级 码龄16年 7粉丝 21原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值