View 自定义 - 概览

开发自定义Android仪表盘View 自定义View赋予了开发者更高的自由度,可以创建完全符合应用需求的UI组件。例如,在一些特定场景下,系统提供的标准View无法满足需求时,就可以通过继承View类并重写相关方法来实现特定的视觉和交互效果。创建自定义View通常包括以下步骤:1. 创建继承自View的Java类,并进行基础结构设置。2. 重写构造函数,以传递上下文信息和属性集。3. 实现onDraw方法,用于绘制View的图形界面。4. 在onMeasure中处理测量逻辑,以适应不同的显示尺寸。 阅读详情

一、体系

详见:Activity、Window、DecorView、ViewRoot 之间的关系

二、绘制前的准备 DecorView

详见:DecorView

顶部图中可以看出 ViewRoot 最后一步是绘制,在绘制之前系统会有一些准备,即前面几个步骤:创建PhoneWindow、DecorView、ViewRootmpl。

三、View类中的方法

详见:View类中的方法

构造

View(context)

单参构造:代码中 new 创建实例的时候调用。

View(context, attrs)

双参构造:xml中使用时调用(xml转java代码的时候反射),attrs是xml中的属性。

View(context, attrs, defStyleAttr)

三参构造:使用主题Style的时候调用。
绘制过程

onFinishInflate()

当View和他的所有子控件被XML布局文件填充完成时被调用。

onMeasure()

当测量View和它的子View的尺寸需求时被调用。

onLayout()

当View给他的子View分配大小和位置的时候调用。

onSizeChanged()

当view尺寸发生变化时调用。
事件处理

onKeyDown()

按下按键时调用。

onKeyUp()

抬起按键时调用。

onTouchEvent()

触摸屏幕时调用。
焦点

onFocusChanged()

获取到或者失去焦点时调用。

onWindowFocusChanged()

窗口获取或者失去焦点时调用。
attach

onAttachedToWindow()

当View被连接到一个窗口时调用。

onDetachedFromWindow()

当View从窗口分离时调用。

onWindowVisibilityChanged()

当View的窗口的可见性发生改变时调用。

四、自定义控件的不同方式

详见:不同实现方式

复用已有控件复用布局文件
组合现有的控件
扩展已有的控件继承特定的View(如TextView)
继承特定的ViewGroup(如LinearLayout)
完全自定义直接继承 View主要是实现 onMeasure() + onDraw(),因为没有子元素需要布局。
需要自己实现 wrap_content、padding,不需要自己实现 margin 该属性是由父容器决定的。
直接继承 ViewGroup主要是实现 onMeasure() + onLayout(),因为子元素都绘制好了父容器不需要额外绘制。
需要自己实现 wrap_content、padding、margin。

五、绘制流程

从 DecorView 中可以看出 View 的绘制流程开始于ViewRootImpl 对象的 performTraversals(),从视图树根节点(即 DecorView 它是个 ViewGroup)开始由上向下遍历测绘(DecorView→中间层ViewGroup→最底层View)。 

七、自定义流程

构造函数只执行一次,而 onMeasure()、onLayout()、onDraw() 随着控件的刷新可能会执行很多次,因此用到的对象(如 Paint)需要定义成全局变量(避免频繁创建销毁造成内存抖动),在生命周期方法中使用前需要重置(避免每次执行都拿到用过的数据)。

7.1 重写构造自定义属性

详见:属性 Attribute

在 xml 中为控件设置的属性。

  • 自定义属性名称如果使用系统已定义的,例如 textSize 会在编译时报错。

7.2 重写测量、布局、绘制

自定义 View 主要是实现 onMeasure() + onDraw(),因为没有子元素需要布局。自定义 ViewGroup 主要是实现 onMeasure() + onLayout(),因为子元素都绘制好了父容器不需要额外绘制。 

Measure 过程测量控件的宽高performMeasure() → measure() → onMeasure() → 子控件的 Measure 过程。
Layout 过程

确定控件最终宽高在父容器中的位置

(即四个顶点位置)

performLayout() → layout() → onLayout() → 子控件的 Layout 过程。
Draw 过程将控件绘制在屏幕上performDraw() → draw() → onDraw() → 子控件的 Draw 过程。

电磁炉线圈加热仿真全流程:用Ansys Maxwell分析涡流效应与热损耗 本文详细介绍了使用Ansys Maxwell进行电磁炉线圈加热仿真的全流程。通过构建2D轴对称涡流场模型,深入分析了高频下的涡流效应、趋肤效应与热损耗分布,为优化线圈设计、提升加热效率与均匀性提供了量化依据和实用指南。 阅读详情

相关推荐

核磁分析必备,ACD/Labs软件使用全解析

核磁共振(NMR)是化学分析中的重要工具,而ACD/Labs提供了一套强大的软件解决方案。从实验设计到数据解读,ACD/Labs 的 NMR 预测可以显著加快您的工作流程。使用 ACD/NMR 预测可以:根据化学结构预测 1H、13C、15N、19F 和 31P 核的全套 1D 和 2D NMR 光谱;在几秒钟内计算化学位移和耦合常数;利用内部数据训练算法,提高新化学空间的准确性。

a13981820402的博客 5635

从零开始学习自定义view【1】自定义流程概览

首先,我们需要创建一个新的自定义View类。我们将这个类命名为CustomView,并继承自View类。这个类将成为我们自定义View的基础。最后,让我们看一下如何在布局文件中使用自定义View。我们可以在XML布局文件中添加一个CustomView的标签,并设置必要的属性。在这个示例中,我们使用了com.example.myapp作为自定义View的完整包名。确保根据你的项目设置正确的包名。通过这篇文章,我们将学习到如何创建自定义View类、实现构造函数和初始化方法、重写绘制方法和处理触摸事件。

jiet_h的博客 367

SpyGlass Lint脚本实战:如何用TCL自动化RTL代码检查(附完整配置模板)

本文详细介绍了如何利用TCL脚本实现SpyGlass Lint工具的自动化RTL代码检查。通过构建模块化、工程化的脚本框架,文章提供了从环境搭建、核心配置、规则定制到豁免管理的完整实战指南,并附有可复用的配置模板,旨在帮助IC设计工程师构建高效、一致的代码质量检查流水线。

weixin_29204205的博客 134

android自定义View

自定义view有四个构造函数 主要参数AttributeSet 获取在xml中定义的参数 继承view重写 onMeasure onLayout onDraw padding记得加入运算 view绘制流程 onMeasure 测量宽高->onLayout 根据测量完的数据进行定位->onDraw 给定位好的布局绘制到页面上 View #onMeasure()源码理解 ViewGroup中并没有measure()也没有onMeasure() 因为ViewGroup除了测量自身的宽高,还需要测量各个

weixin_43976560的博客 95

别再手动配电脑了!手把手教你用Windows Server 2022搭建企业AD域(附DNS配置避坑指南)

本文详细介绍了如何使用Windows Server 2022搭建企业AD域,提升20+终端的管理效率。通过实战案例和避坑指南,解析AD域的核心价值、部署步骤及DNS配置技巧,帮助企业实现集中权限管理、安全策略统一部署,显著降低IT运维成本。

weixin_30652897的博客 349

lumerical中DEVICE和MODE模块的交互使用(真的很干货!!可以自信的说网上绝对找不到比我更详细的步骤了)

几个脚本文件很重要! Lumerical仿真流程: 一、DEVICE: (1).建模并且运行完之后,在脚本提示符下键入以下脚本行以运行plotDopingProfile.lsf如图1(文件名如果索引不到的话就可以把文件直接用notepad++打开,然后把代码直接输入到device中script脚本中 如图2)脚本文件并生成下图 如图3: (图2) (图1) (图3) (2).仿真...

1万+

三思系列:重新认识Drawable

前言 关于三思系列 前一段时间,在某公众号看到了一篇关于splash页面动效的文章,具体为:将一个英文单词拆分为多个字母,散落在屏幕中,然后按照一定的路径回归,最终展示一段流光效果,完成splash页面。 当时文章中提到的做法是自定义View的实现。当时脑海中灵光一闪,感觉还是用Drawable来干这个事情更加合适。 记忆中,我曾经整理过一篇Drawable基础内容的文章,可惜丢失了,在开始干这件事情之前,我们把这一块内容再完整的梳理一遍。 这篇文章会比较长,先给出导图 Drawable的设计意图 A

leobert.lan的博客 395

2025.06.06【Ribo-seq】|riboWaltz:P-site定位与三碱基周期性分析流程

同学们,大家好!今天我们要学习的是riboWaltz——一款专为Ribo-seq(核糖体足迹测序)数据设计的R包,主要用于P-site定位优化和三碱基周期性分析。P-site的准确定位是Ribo-seq下游所有翻译组学分析的基础,riboWaltz为我们提供了系统、可视化、易用的解决方案。P-site定位优化:自动识别不同长度RPF的最佳P-site偏移量。三碱基周期性分析:可视化RPF在CDS、UTR等区域的分布,评估数据质量。多样本/多条件支持:可同时处理多个样本,便于批量分析和对比。

1793

仿猫眼电影在线选座组件

前言部分 本文基本实现电影选座的效果,参考的是猫眼的效果来进行编写。2019年开年第一个月这篇可能是这个月的最后一篇了,希望今年继续做到坚持每月写博客的习惯,虽然博客的质量还不行,这主要还是因为能力上差的还多,但是不能轻易放弃,毕竟不能人人都是大神,博客能帮到别人或者帮到自己就有它的价值了。2019希望各位通过努力遇见更好的自己。 下面效果图先来镇楼吧 内容部分 实现步骤 常规的自定义...

鲨鱼不会飞的博客 6607

PyCharm 2024最新版图文安装教程(python环境搭建+PyCharm安装+运行测试+汉化+背景图设置)

PyCharm 2024新版图文安装教程(python环境搭建+PyCharm安装+运行测试+汉化+背景图设置)

Code_流苏:在代码中寻诗意,在实践中觅真知 4万+

由ip地址和子网掩码求网络号、主机号、广播地址(超详细)

1、用二进制数表示IP地址   在进行计算之前,我们首先要学会十进制的IP地址怎么转换为二进制的IP地址。   给出一个例子: 十进制:172.16.25.3 二进制:10101100.00010000.00011001.00000011 1、如果两台主机的网络号相同,我们就说它们是同一网段 2、主机号的意义 - 1)主机号部分全变成1,即为该网段的广播地址 - 2)主机号部分全变成0,即为该网段的网路地址(网络号) 3、如果主机号部分为x位,则该网络能容纳最大主机数为: 2的x次方-2。减2

爱吃雪糕的小布丁的博客 9万+

推荐项目:Structure View —— 开源代码导航神器

推荐项目:Structure View —— 开源代码导航神器 在编码的世界里,快速定位和理解代码结构是每位开发者梦寐以求的超能力。今天,让我们一起探索Atom编辑器的一个杰出插件——Structure View,它如同Eclipse的Outline视图或IntelliJ IDEA/WebStorm的Structure工具窗口,为你的源代码提供了直观的树状导航,让复杂的代码结构一目了然。 项目介绍...

gitblog_00004的博客 791

一个车载HUD的设计参考

一个车载HUD的设计参考

weixin_72050316的博客 796

Android游戏开发之旅(十一)View中手势识别

<br />有关Android平台 的游戏开发 中我们需要涉及到控制,在开始的Android游戏开发之旅 中我们提到了按键和轨迹球的控制方式,从今天开始 Android123开始给出大家游戏中其他的一些控制方式,比如今天的手势操作和未来重力感应。<br /><br /> 很多网友发现Android中手势识别提供了两个类,由于Android 1.6以下的版本比如cupcake中无法使用android .view.GestureDetector, 而 android.gesture.Gesture是

JavaTiger 1313

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

CRM开发要点(五)

本文主要阐述UI配置的内容。 关于View的配置,首先是要建立一个配置。如上图所示,一个配置有4个属性值。第一个是RCK(Role Configuration Key),这个是在导航条参数文件里面设置的,可以每个导航条参数文件有一个独立的RCK,也可以多个导航条参数文件共用一个,这个看具体需求;第二个是组件用法,默认是,如果这个组件重用了,则这里就填重用的ID;第

范叉叉的博客 1380

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

editor修改样式 vue_手撸一个vue管理页面,支持markdown

生命不止,奋斗不息,终于有了片刻的喘息,让我能在闲暇之余,继续构建我的个人博客。通过前面几章的学习,我们已经通过自己的努力,编写了博客的首页,博客的登录页,今天我就带大家手撸后台管理页面(写的很糙,大家不要介怀)开始之前先欣赏美图路由的管理在写管理页面的时候,我遇到了一个拦路虎, 就是我创建了一个 Dashborad.vue,用它来表示博客后端页面的概览页,准备放一些统计信息。当我按照之前的那种方...

weixin_39640444的博客 290

假人有限元模型

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

你所不知道的Android原生开发的现状,手慢无

去年无疑是 Flutter 技术如火如荼发展的一年。 每一个移动开发者都在为 Flutter 带来的“快速开发、富有表现力和灵活的 UI、原生性能”的特色和理念而痴狂,从超级 App 到独立应用,从纯 Flutter 到混合栈,开发者们在不同的场景下乐此不疲的探索和应用着 Flutter 技术,也在面临着各种各样不同的挑战。 Alibaba集团内也有越来越多的业务和团队开始尝试 Flutter 技术栈,从闲鱼的一支独秀引领潮流,到如今淘宝特价版、盒马、优酷、飞猪等BU业务相继入局,Flutter的业务应用在

m0_57205780的博客 191

手撕面试官,程序员为什么都喜欢阿里P7,Android多线程断点续传

*其实上面说了这么多,钱是永远赚不完的,在这个知识付费的时代,知识技能提升才是是根本!我作为一名8年的高级工程师,知识技能已经学习的差不多。**在看这篇文章的可能有刚刚入门,刚刚开始工作,或者大佬级人物。像刚刚开始学Android开发小白想要快速提升自己,最快捷的方式,就是有人可以带着你一起分析,这样学习起来最为高效,所以这里分享一套高手学习的源码和框架视频等精品Android架构师教程,保证你学了以后保证薪资上升一个台阶。这么重要的事情说三遍啦!

2401_84102759的博客 461

Android常见问题及开发经验总结(二),面试必问

Context:包含上下文信息(外部值) 的一个参数. Android 中的 Context 分三种,Application Context ,Activity Context ,Service Context. 它描述的是一个应用程序环境的信息,通过它我们可以获取应用程序的资源和类,也包括一些应用级别操作,例如:启动一个Activity,发送广播,接受Intent信息等 8.Service的onCreate回调在UI线程中吗? Service生命周期的各个回调和其他的应用组件一样,是跑在主线程中,会影响到

m0_65145426的博客 121

Hi~重新认识一下Drawable!

/ 今日科技快讯 /3月4日,北京时间下午16点24分,美国太空探索技术公司SpaceX利用八手火箭,将第18批60颗星链卫星从肯尼迪航天中心39A发射台升空送入轨道。随后,火箭助...

郭霖 578

Android源码阅读分析:View体系(一)——体系概览及绘制流程

本文主要分析Android的View体系及绘制流程。

董小虫的专栏 1338

BezierMaker源码深度解析:Android自定义View最佳实践

BezierMaker是一款通过de Casteljau算法绘制贝塞尔曲线的Android开源项目,支持1-7阶贝塞尔曲线的形成动画及切线计算,是学习Android自定义View的优质实践案例。 ## 项目核心功能与架构概览 BezierMaker的核心功能集中在`BezierView`类([bezier/src/main/java/com/wx/beziermaker/BezierView.

gitblog_01131的博客 699

安卓自定义View进阶-Matrix详解

这应该是目前最详细的一篇讲解Matrix的中文文章了,在上一篇文章Matrix原理中,我们对Matrix做了一个简单的了解,偏向理论,在本文中则会详细的讲解Matrix的具体用法,以及与Matrix相关的一些实用技巧。

GcsSloop 5434

Android自定义View-Paint

View 上的内容是通过 Canvas 绘制出来的,但 Canvas 中的大多数绘制方法都是需要 Paint 作为参数的,例如 canvas.drawCircle(100, 100, 50, paint) 最后就需要传递一个 Paint。 内容概览 内部类 类型 简介 enum Paint.Cap Cap指定了描边线和路径(Path)的开始和结束显示效果。 enum Paint...

一个码农的博客 1003

【Android 修炼手册】常用技术篇 -- Android 自定义 View

预备知识 了解 android 基本开发 看完本文可以达到什么程度 学会自定义 View 以及其中的关键点 阅读前准备工作 clone CommonTec 项目,其中 myview 是自定义 View 的代码 文章概览 自定义 View 内容总体来说还是比较简单,更多的是要满足具体的需求,所以本文内容并不太难,看起来比较愉悦。 在学习如何自定义 View 之前,需要...

weixin_45365889的博客 236

GraphQL Java 后端接入 MongoDB:Connectors 连接器实战与 N+1 查询优化

> 本篇指南基于 HowToGraphQL 开源仓库中的 [graphql-java 教程 · 连接器章节](https://link.gitcode.com/i/fc606862a59a4ed7bd4e5a9d3b257583) 展开,讲解如何为基于 `graphql-java` + `graphql-java-tools` + Jetty 的 Java GraphQL 服务器接入 MongoD

gitblog_09772的博客 326
上一篇: View 自定义 - 坐标系、位置获取
下一篇: Compose 自定义 - 绘制阶段 Draw
Jomurphys
博客等级 码龄9年 1768粉丝 261原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值