自定义View - 三大流程 - 学习小结

openLayer的学习小结 WebGIS引擎–openLayer的学习小结之前一直以为是一个简单的图层插件,后来在项目中用到了,才发现openLayer是如此的强大。ol.Map作为最重要的一个地图类,在创建地图时必须使用,主要格式如下:var map=new ol.Map({...});{}中主要定义具体的参数,本篇主要介绍的参数有layer、view、control、target。1、ol.Layer layer,顾名思 阅读详情

学习资源来源:https://www.jianshu.com/nb/9976005

measure、draw均为调度方法。具体的施工由onMeasure、onDraw实现。

  • layout方法确定View本身的位置,而onLayout方法会确定所有子元素的位置;因此,对于单一View的layout过程:由于单一View是没有子View的,故onLayout()是一个空实现,具体布局实现在layout中。   
  • 对于ViewGroup的layout过程:由于确定位置与具体布局有关,所以onLayout()在ViewGroup为1个抽象方法,需重写实现。
  • 自定义View需要支持padding和wrapcontent;而margin是由父容器控制的,默认已被支持。即外边距轮不到view来算,Andorid将其封装在LayoutParams内交由父容器统一处理。

测量 

MeasureSpec的生成规则

子View的LayoutParams  + 父View给出的测量规格(MeasureSpec) =  子View的测量规格。

即:子View的大小由父View的MeasureSpec和子View的LayoutParams 共同决定。

通过MeasureSpec的静态方法即可获取对应的Mode、Size以及生成新的MeasureSpec。

测量流程:

单一View的measure过程

                                                                              View的onMeasure实现

getSuggestedMinimumWidth:设置了背景图,则为背景图的大小,否则为android:minWidth的属性值。

setMeasuredDimension保存测量后的尺寸。ViewGroup可以通过child.getMeasuredWidth获取子View的测量值;

由以上代码可以看出,View本身是不支持wrap_content属性的,因此如果自定义View,需要完成对wrap_content的支持。

支持wrap_content及padding示例 - MeasureSpec使用示例:

	@Override
	protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
	{
		// super.onMeasure(widthMeasureSpec, heightMeasureSpec);
 
		/**
		 * 设置宽度
		 */
		int specMode = MeasureSpec.getMode(widthMeasureSpec);
		int specSize = MeasureSpec.getSize(widthMeasureSpec);
 
		if (specMode == MeasureSpec.EXACTLY)// match_parent , accurate
		{
			Log.e("xxx", "EXACTLY");
			mWidth = specSize;
		} else
		{
			// 由图片决定的宽
			int desireByImg = getPaddingLeft() + getPaddingRight() + mImage.getWidth();
			// 由字体决定的宽
			int desireByTitle = getPaddingLeft() + getPaddingRight() + mTextBound.width();
 
			if (specMode == MeasureSpec.AT_MOST)// wrap_content
			{
				int desire = Math.max(desireByImg, desireByTitle);
				mWidth = Math.min(desire, specSize);
				Log.e("xxx", "AT_MOST");
			}
		}
 
		/***
		 * 设置高度
		 */
 
		specMode = MeasureSpec.getMode(heightMeasureSpec);
		specSize = MeasureSpec.getSize(heightMeasureSpec);
		if (specMode == MeasureSpec.EXACTLY)// match_parent , accurate
		{
			mHeight = specSize;
		} else
		{
			int desire = getPaddingTop() + getPaddingBottom() + mImage.getHeight() + mTextBound.height();
			if (specMode == MeasureSpec.AT_MOST)// wrap_content
			{
				mHeight = Math.min(desire, specSize);
			}
		}
		setMeasuredDimension(mWidth, mHeight);
 
	}

在单一View measure过程中,getDefaultSize()只是简单的测量了宽高值,在实际使用时有时需更精细的测量。所以有时候也需重写onMeasure()。

关于测量宽高:

  1. 在某些情况下,需要多次测量(measure)才能确定View最终的宽/高;
  2. 该情况下,measure过程后得到的宽 / 高可能不准确;
  3. 此处建议:在layout过程中onLayout()去获取最终的宽 / 高

ViewGroup的测量过程

遍历所有的子View的尺寸;

合并所有子View的尺寸,最终得到ViewGroup父视图的测量尺寸;

注:ViewGroup无法对onMeasure作统一实现,因为不同的ViewGroup子类有不同的测量规则。这也是单一View的measure过程和ViewGroup的measure过程最大的不同。

除了measureChildren,如下方式也是ViewGroup提供的测量相关的方法。

布局

视图的位置即四个顶点位置:Left、Top、Right、Bottom。

单一View的布局过程

通过setFrame设置了View本身的位置。

注:对于单一View的laytou过程
  *    a. 由于单一View是没有子View的,故onLayout()是一个空实现
  *    b. 由于在layout()中已经对自身View进行了位置计算,所以单一View的layout过程在layout()后就已完成了

ViewGroup的布局过程

1、计算自身ViewGroup的位置:layout;

2、遍历View & 确定自身子View在ViewGroup的位置(调用子View的layout):onLayout;

 

绘制

详见”自定义View温习笔记“

 

强行插播 - 关于RecycleView的ItemDecoration的

getItemOffsets

onDrawOver

一图胜千言,结束。

小知识点:

当包含一个View的Activity退出或者当前的View被remove时,View的onDetachedFromWindow方法会被调用。

 对应的方法onAttachedToWindow是当包含此View的Activity启动时,此方法被调用。

Android应用层View绘制流程与源码分析,墙都不扶就服你 通过上面分析可以看出measure过程主要就是从顶层父View向子View递归调用view.measure方法(measure中又回调onMeasure方法)的过程。 阅读详情

相关推荐

自定义控件(一):View的测量及绘制流程、原理简介

本文简单介绍自定义控件的流程及原理,并从源码角度解读了Measure(),onMeasure(),draw(),onDraw()等方法,并实现了一个简单的显示系统媒体音量变化的自定义控件

我的Android合伙人是你么 751

Android中子布局、父布局之间的MeasureSpect、LayoutParameter之间的关系

(1)横坐标是父布局的SpecMode(测量模式),纵坐标是子布局的LayoutParams(布局参数)。(1)子布局的SpecMode(测量模式)可以根据上面的LayoutParams与SpecMode对应关系来记忆即可。(2)子布局的SpecSize(测量大小)只有在固定数值的情况下才是自身大小,其他都是父布局的大小。(2)UNSPECIFIED这种模式一般是系统自身的测量过程才会使用,一般不需要关注这个模式。固定数值------------------>MeasureSpec.EXACTLY。

xiaokang666的博客 509

Android自定义View之DashBoard(仪表盘)

前言 Android自定义View是Android初中级开发工程师向高级工程师进阶所必须掌握的一块内容,其重要性不言而喻。接下来的一段时间,我会连续出几篇跟自定义View相关的文章,从易到难,跟大家一起学习Android自定义View。本文讲一个Android很简单的View——DashBoard(仪表盘),以这个例子带大家去学习自定义View的基本绘制,让大家学会自定义View,并最终掌握。 注...

weixin_43901866的博客 1326

Android 自定义 View 三步骤

自定义 View 三步骤 自定义View三步骤,即:onMeasure()(测量),onLayout()(布局),onDraw()(绘制)。 onMeasure() 首先我们需要弄清楚,自定义 View 为什么需要重新测量。正常情况下,我们直接在 XML 布局文件中定义好 View 的宽高,然后让自定义 View 在此宽高的区域内显示即可。但是为了更好地兼容不同尺寸的屏幕,Android 系统提供了 wrap_content 和 match_parent 属性来规范控件的显示规则。它们分别代表自适应大小和.

非也缘也的博客 2657

【重磅干货】介质损耗因数(tanδ)揭秘:如何精准定位材料劣化最严重的温度?附权威研究PDF!

是评估绝缘材料性能的核心指标,能直接反映材料内部能量损耗和微观结构变化。通过分析tanδ-温度曲线的峰值点,可精准定位材料劣化最严重的温度。:极化损耗峰值的温度点(如环氧树脂的80℃)是材料性能拐点,需重点关注!:图3对比了5种材料的tanδ-温度曲线,峰值温度差异高达50℃!在电力设备、电子元器件等领域,材料的老化与温度密切相关。:[《介质损耗峰值温度在设备寿命预测中的应用》]在不同温度下测量tanδ,绘制曲线图。:[《多材料介质损耗峰值温度对比研究》]:基于tanδ峰值温度开发的。

mubiao05的博客 1349

X猫免费小说安卓逆向分析

七猫免费小说安卓逆向分析 难度(♥♥) 文章目录七猫免费小说安卓逆向分析 难度(♥♥)1. 查壳2. 抓包分析3. sign1. Frida-rpc2. Native函数分析快3点了. 睡觉~ 白天再继续写! 1. 查壳 我这边使用的是ApkTool, 拖进去显示未加壳。 2. 抓包分析 POST https://xiaoshuo.wtzw.com/api/v1/login/index HTTP/1.1 net-env: 1 channel: qm-cbcpa056_wm is-white: 0 platf

Qiled的博客 4367

自定义View的三大流程浅析

目录 0.前置 1.自定义View简介 2.MeasureSpec 1) SpecMode 3.View的工作流程 1) View的measure过程 2)ViewGroup的measure过程 3)layout流程 4)draw流程 0.前置 上层容器负责下层子控件的测量和绘制,并传递交互事件。通常Activity界面由顶部的titleView和下方contentVie...

qq_37321098的博客 2013

从零到一:手把手部署用友T3标准版11.2及SQL Server 2008R2环境

本文详细介绍了从零开始部署用友T3标准版11.2及SQL Server 2008R2环境的完整流程,包括环境准备、SQL Server安装、环境检测与修复、T3标准版安装实战以及初始化配置与测试。通过手把手的步骤指导和常见问题解决方案,帮助用户顺利完成部署,确保系统稳定运行。

weixin_28339967的博客 453

自定义View(三)---自定义View整个流程的梳理与总结

转载请注明出处:From李诗雨—http://blog.youkuaiyun.com/cjm2484836553/article/details/71024436 不诗意的女程序猿不是好厨师~ 在自定义View(一)–View的基础概念,工作流程及生命周期的理解中我们了解一些自定义Veiw的基本知识点,也熟悉了View的整个工作流程,对它的生命周期也算得上很熟悉了。接着自定义View(二)–表层浅析Vie

cjm2484836553的博客 3317

SAP MTO实战:从销售订单到生产订单的精准触发与配置详解

本文深入解析SAP系统中按订单生产(MTO)模式的核心流程与配置。详细阐述了如何通过精准配置物料主数据策略组、需求类型及计划策略(如策略50),实现从销售订单自动触发生产订单的完整链路。文章结合实战案例,指导用户打通销售与生产环节,并提供了关键事务代码与常见问题排查指南,助力企业实现以销定产,优化库存与成本控制。

weixin_29300931的博客 212

行人检测模型在海思平台上的部署:从 PyTorch 到 NNIE 深度优化与实践

摘要 本文详细介绍行人检测模型从PyTorch到海思NNIE平台的部署流程。首先分析了行人检测面临的挑战(尺度变化、遮挡、姿态多样性等)及边缘部署的优势(实时性、隐私保护等)。重点阐述了模型转换过程:PyTorch→ONNX→Caffe→NNIE-WK,其中PyTorch转ONNX需注意评估模式设置、虚拟输入匹配、操作集版本选择等关键点。文章旨在帮助开发者在海思3516D芯片上实现高效的行人检测,克服部署过程中的常见问题,最终实现边缘设备的实时目标检测能力。

FJN110的博客 216

自定义View的三个构造方法

android开发者网站上有相关的说明文档: public View (Context context)是在java代码创建视图的时候被调用,如果是从xml填充的视图,就不会调用这个 public View (Context context, AttributeSet attrs)这个是在xml创建但是没有指定style的时候被调用 public View (Context context,

Changemain 3385

FLUENT Meshing Watertight Geometry工作流入门 - 9 生成体网格

总结一下我们学到的东西。讨论体积网格的重要性,并了解生成体积网格的不同方法。还了解体积网格质量的重要性,并学习如何改进它。

B_etter_Man的博客 1万+

Android自定义View绘制流程小结

总之一句话,当系统控件满足不了我们的需求时,就需要自定义View来实现,足以表达自定义有多么强大! 通过网上资料和结合自己实践,这篇文章主要用来理解绘制流程的一个具体过程的,绘制流程的起始都是在ViewRootlmpl类的performTraversals方法里开始。 private void performTraversals() { ...... //最

wjw190077的博客 5264

标准论文参考文献添加方法——Zotero入门使用教程

第一篇论文投出去了,写一下最后一步的参考文献修饰润色吧! 论文的参考文献,即References,是论文的最后一步,相信不管是写毕设论文还是期刊论文都遇到过需要修改参考文献的情况,非常之麻烦。而且参考文献中经常会与生僻奇怪气体出现,一个一个修改非常浪费时间,这里介绍一下一个非常好用的软件Zetero。 第一步:软件的下载安装及绑定Word 尽量使用客户端吧,

MISAYAONE的博客 20万+

《备考信息系统项目管理师》 - 专栏介绍和目录

本专栏会持续详细梳理软考高级信息系统项目管理师(高项)的考点、所有历年真题(包括综合知识、案例分析、论文)等,有论文专项,预测模拟题等内容。需要的可以先订阅下哦。

数据知道的博客 2万+

View的工作原理小结

View的工作原理 一、初识ViewRoot和DecorView ViewRoot对应于ViewRootImpl类,为连接WindowManager和DecorView的纽带。首先看看ViewRootImpl是什么时候被调用的。 1、启动Acitivity 最终会调用 ActivityThread#handleResumeActivity(),这里面会执行窗体添加 DecorView 的操作 ( ...

湟同学你好的博客 1862

蓝牙模块HM-10手册

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

Android自定义View系列:布局自定义

1 布局基础 1.1 布局过程的含义 布局过程,就是程序在运行时利用布局文件的代码来计算出实际尺寸的过程。 1.2 布局过程的工作内容 两个阶段:测量阶段和布局阶段。 测量阶段:从上到下递归地调用每个View或者ViewGroup的 measure() 方法,测量它们的尺寸并计算它们的位置 布局阶段:从上到下调用每个View或者ViewGroup的 layout() 方法,把测得的它们的尺...

Vincent的博客 1427

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

visio安装包

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

关于自定义 View 的那点事

在 Android 开发中,自定义 View 是一个非常重要的技能。通过自定义 View,您可以创建出独特、个性化的用户界面,提升用户体验。本文详细介绍了自定义 View 的基本步骤,包括创建自定义 View 类、重写 onMeasure 方法和 onDraw 方法。同时,我们还深入分析了 onMeasure 和 onDraw 方法的原理和使用方法,并通过实战应用展示了如何创建一个带有边框的圆形 View 和一个可拖动的 View。希望这些方法和代码示例能够帮助您创建出独特、个性化的用户界面,提升用户体验。

qixiyang9412的博客 771

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

一篇文章搞定《Android中View的绘制流程》

像事件的分发一样,View的绘制流程我也分成了三部分来讲1、怎样到达ViewRootImpl。2、到达ViewRootImpl做了什么。3、View的最终绘制之后我会利用一个自定义View的实例来反刍这篇文章,像《一篇文章搞定搞定事件分发》一样。最后可以看到调用了mView的Measure、Layout、Draw方法。 我们点进去发现,在View的Measure、Layout、Draw会调用我们熟知的onMeasure()、onLayout()、onDraw()方法。

小孟来码的博客 6688

Android自定义View小结篇

近来忙着银联支付接口对接,博客也没有更新。在前几篇Android自定义View基础篇当中有几处地方明显不足。例如:view中使用handler 就不合理,view中自带了post方法。在view小结篇当中主要讲解自定义过程中的一些疑问及踩过的坑。1、自定义View中的wrap_content从ViewRoot的performTraversals开始,经过measure,layout,draw 三个流

文淑的博客 1035

【Android View】自定义属性

在自定义view过程中有时为了方便需要自定义属性,本篇就来总结回顾下这个知识点。

dev晴天的博客 1943

Android——View绘制机制小结

Android的view绘制机制

Jiazimiao的博客 2327

View知识点小结

View在我们日常开发中十分常见,常见的控件如Button,TextView等就是一个View,而LinearLayout,RelativeLayout等就是ViewGroup,而ViewGroup又是继承View的,所以可以说View是所有控件的基类,由此可见View的地位和作用十分重要,所以我们有必要了解一下View的基础知识。   一个View要能被我们肉眼所见,那么该View必然得先经过

苏四的博客 418

pytorch中view的使用小结

pytorch中的view类似于numpy中的resize和reshape,也就是说它的作用是重新组合tensor数据。

非晚非晚的博客 2912

View 绘制流程知识小结

今天我们来复习下View的绘制流程。View是Android中所有控件的基类,是控件的一种抽象,代表了一个控件。 Android进阶——Android视图工作机制之measure、layout、draw 一、View树的绘制流程 measure –> layout –> draw 测量 –> 布局 –>绘制 measure :测量出View的宽/高; ...

lingguiqin的博客 368
上一篇: 自定义View、事件体系等基础温习笔记
下一篇: Android IPC原理分析小结
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值