Android自定义view绘制顺序漫谈

Android中的View与ViewGroup绘制过程,手势监听顺序与使用 NULL 博文链接:https://1002878825-qq-com.iteye.com/blog/1812390 立即下载

  今天就跟大家说说自定义view里面的绘制顺序问题,因为有时候避免不了在同一个地方绘制不同的view,那么就避免不了遮盖问题,这个时候就就必须考虑绘制顺序的问题了。
  说到绘制顺序就不得不提onDraw和dispatchDraw这两个方法,下面我们一一来看这两个方法。

onDraw

之前我们自定义view一般都继承了View这个类,其实Android里面所有的控件也都继承自这个类,无论是一个view还是viewGroup了,最终都是继承自view。好,如果我们自定义view直接继承自View类,那么我们重写了onDraw在里面做一些自己的绘制,我们也会重写super.onDraw(canvas),但是点击进去看会发现是空实现,只是用注释告诉我们“Implement this to do your drawing”,所以如果是继承自view,那么其实这个super是完全可以不写的,因为父类是空实现啊,但是如果是继承一个现有的view呢,那就不用点击过去看,肯定不是空实现,因为现有控件的绘制操作也是在onDraw里面写的啊,所以这个时候自己把代码写在super.onDraw(canvas)前面还是后面是有影响的

  • 把自己绘制的代码写在super.onDraw的后面,由于绘制代码会在原有内容绘制结束之后执行,所以绘制内容就会盖住控件原来的内容(这种应用场景就比较多,好比在原来的基础上面加一些东西)
  • 把自己绘制的代码写在super.onDraw的前面,由于绘制代码会在原有内容绘制之前执行,所以绘制的内容会被控件的super.onDraw的内容覆盖(这种应用场景比较少,但是也会有,例如给继承自textview的文本绘制一个背景色啦,当然绘制背景色有更简单的方法)

dispatchDraw

上面的onDraw是针对view自身的绘制,但是如果是把一个view放在viewGroup里面呢?那么父view和子view的绘制顺序又要怎么把握呢?就需要在这个dispatchDraw方法上面做文章了,先来看看这个方法的注释“Called by draw to draw the child views. This may be overridden by derived classes to gain control just before its children are drawn (but after its own view has been drawn).”翻译一下就是这个方法被draw方法调度然后绘制子view,这个方法可以被重写来获得控制权,以能够在它的子view们被绘制之前来做一些事情,但是此时它自身已经被绘制完毕了。好比有这么个例子,我们自定义了一个view继承自linearlayout,是的是一个viewgroup,然后我们想给linearlayout添加一些圆圈的幻影,然后我们将这个linearlayout写在xml中,如果它没有任何子view,那么这个幻影能够正常的展示出来,但是如果我们给这个linearlayout添加了子view,就会发现原来有的幻影现在没有了,这是因为幻影被子view遮盖了,那么要怎么处理呢?其实也很简单,就是在绘制完子view之后我们再绘制linearlayout的幻影就好了,这样就解决问题了,而上面的注释也说了,dispatchDraw方法就是用来调度绘制子view的方法,那么我们把绘制幻影的代码写在super.dispatchDraw(canvas);之后就好了,就这么简单

关于绘制的顺序概述

  1. 背景background的绘制,这个是发生在一个drawBackground(Canvas canvas)的private的私有方法里面,所以我们无法重写这个方法,只能通过现有Android提供的API去设置它
  2. onDraw主体绘制,如果是对于父布局而言,也是先调用onDraw绘制自己,然后调用dispatchDraw去绘制子view
  3. dispatchDraw绘制子view
  4. 滑动边缘渐变和滑动条
  5. 前景(foreGround)(前景的支持是从Android6.0开始的,之前的只是支持framelayout),但是我们貌似一般都不用。这个是被放在一个onDrawForeground方法里面的, 该方法是可以被重写的,做一些自己的设置。当然也可以利用API自带的方法通过xml中的android:scrollbarXXX系列属性设置或者在java代码中调用对应的set方法来进行设置。如果重写了这个那么在super.onDrawForeground()方法的前后写代码则可以控制绘制内容和和滑动边缘以及前景的遮盖关系

关于绘制方法的调度概述

为什么上面的方法会按照那样的如下的顺序:背景—onDraw—dispatchDraw—滑动边缘渐变和滑动条—foreGround的顺序来绘制呢?这是因为有一个方法在进行总调度,它就是draw方法,所以如果想要在所有的绘制之前或者所有绘制方法都调用完成后做一些事情,那么就可以重写这个draw方法了,所以如果将自己的绘制代码写在了super.draw(canvas);前面,那么相当于自己绘制的代码会被所有后面的绘制覆盖,如果写在了super.draw(canvas);后面,那么相当于自己的绘制代码会覆盖所有后面的绘制,其实将代码写在super.draw(canvas)后面相当于将代码写在了super.onDrawForeground后面了,因为执行到onDrawForeground就已经执行到绘制的结束时候了

关于绘制代码书写位置的概述

  • 出于效率考虑,viewgroup默认会绕过draw,onDraw方法,换而直接执行dispatchdraw,以此来简化绘制流程,所以如果你自定义了某个 ViewGroup 的子类(比如 LinearLayout)并且需要在它的除 dispatchDraw() 以外的任何一个绘制方法内绘制内容,你可能会需要调用 View.setWillNotDraw(false) 这行代码来切换到完整的绘制流程
  • 有时候代码写在ondraw里面可以,也可以写在dispatchDraw,但是推荐写在onDraw里面,因为对于这个方法android有优化,可以在不需要重绘时候自动跳过onDraw避免重复执行

  以上就是关于绘制顺序的全部内容,有问题欢迎批评指正,以上内容参考了扔物线大神的作品。

Jlink除了调试还能干啥?用JFlash SPI给W25Q64烧录固件的5个实用技巧 本文深入探讨了Jlink的隐藏功能,特别是通过JFlash SPI高效烧录W25Q64的5个进阶技巧。从硬件连接优化到批量处理脚本,再到数据安全验证,这些技巧能显著提升烧录速度和稳定性,适用于量产环境。文章还提供了详细的参数配置和脚本示例,帮助工程师充分发挥Jlink的潜力。 阅读详情

相关推荐

XianYuAutoDeliveryX:基于闲鱼API与大模型的智能自动发货系统实践

本文详细介绍了如何利用XianYuAutoDeliveryX系统,结合闲鱼API与大语言模型,构建一个智能自动发货解决方案。该系统能实现买家付款后秒级自动发货,并通过对接ChatGPT等大模型智能回复买家咨询,有效解放卖家时间,提升虚拟商品店铺的运营效率和客户体验。

bush的博客 1016

android调整view 子控件顺序,android控件显示顺序控制

在android中如果首先在xml中静态添加了一个控件,剩下的控件都是通过addView动态添加,那么如果有控件覆盖的情况(比如说使用FrameLayout或者RelativeLayout),先加入得控件就会被后加入得控件覆盖。在View类中有这样一个方法bringToFront ,它得注释如下:/*** Change the view's z order in the tree, so it'...

weixin_35758982的博客 1955

pyinstaller+scrapy打包出现错误:OSError: could not get source code

错误如下: Traceback (most recent call last): File "scrapy\utils\defer.py", line 55, in mustbe_deferred File "scrapy\core\spidermw.py", line 60, in process_spider_input File "scrapy\core\scraper.py", line 152, in call_spider File "scrapy\utils\misc.py

kin的博客 1759

遇到个难题,怎么修改子View绘制顺序?

前言 周一的早上,由于项目的开发做的差不多了,正在等待测试结果的我就开始发呆,思考端午节的去处~ “理塘?稻城?还是...解决bug?” 不行不行,可不能让BUG耽误了我的假期,于是我打开公司的项目管理工具,看看测试有没有反馈问题。果然,出现了一个BUG。 大概就是一个RecycleView,需要把其中某一项做放大效果,类似焦点放大的效果。 但是现在的APP中显示效果是会被下一个View遮挡住,我简单写了个Demo说明: ...

chuyouyinghe的专栏 799

Mediapipe姿态估计——用坐标计算手指关节弯曲角度并实时标注

利用mediapipe搭建姿态检测模型;mediapipe人体标注节点坐标;mediapipe计算手指弯曲角度并实时渲染;mediapipe计算关节弯曲角度。mediapipe手势识别;mediapipe姿态检测模型;mediapipe学习。

kalakalabala的博客 1万+

奥比中光Dabai深度相机SDK在Ubuntu22.04的兼容性安装指南

本文详细指导如何在Ubuntu22.04系统上安装奥比中光Dabai深度相机的SDK。针对新旧版本不兼容的核心问题,重点推荐使用经过验证的v1.10.18版本SDK,并提供了从系统依赖检查、SDK下载安装、Python环境配置到编译测试的完整步骤,帮助用户成功解决安装难题并实现相机驱动。

j2k3l4的博客 1000

android调整view 子控件顺序,Android自定义View之绘制顺序

Android自定义View之绘制顺序android 自定义ViewAndroid 里面的绘制都是按顺序的,先绘制的内容会被后绘制的盖住.而在实际的项目中,绘制内容相互遮盖的情况是很普遍的,那么怎么实现自己需要的遮盖关系,就是这期要讲的内容。前言具体来讲,一个完整的绘制过程会依次绘制以下几个内容:背景(drawBackground())主体(onDraw())子 View(dispatchDraw...

weixin_42126668的博客 1023

暗月项目七详解

本文围绕“暗月靶场项目七”展开,记录了一次从外网 Web 入口逐步深入内网并最终获取域控目标的完整实训过程。

Re_K123的博客 419

自定义ViewGroup中child绘制顺序

背景 在项目中需要显示一组用户头像(见下图),右边的图片有一部分在左边的图片下面,依次叠加。 我们可以使用LinearLayout,然后每个图片向左偏移-xdp,但是这样做你会发现实现的效果并不是这样,而是右边的头像在左边的头像上面。 这是因为ViewGroup绘制子view的顺序导致的,先添加的view先绘制,我们可不可以改变ViewGroup的绘制顺序呢,当然可以,在View中有一个方法setTranslationZ(float translationZ),translationZ值越大优先级就越低

小久久的博客 845

把消息说清楚:OData V2 的 sap-message、错误体 errordetails 与 ABAP 端落地实践(Gateway Foundation / RAP)

OData V2消息机制解析:SAP业务系统的结构化通信设计 本文深入剖析了SAP系统中OData V2协议的消息传递机制。该设计通过双通道(成功时使用sap-message响应头,失败时采用error响应体)实现业务数据与提示信息的结构化分离,解决了企业级应用中"只返回业务数据"或"简单报错"的不足。文章详细解读了消息结构中的关键要素:target字段实现精准UI定位、severity级别控制交互流程、transition标记区分状态消息与过渡消息。同时揭示了SAP

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 852

vue2/3 - 详细实现内网使用离线百度地图功能,百度地图如何离线加载详细教程(内网部署及使用),在vue中无需网络离线使用百度地图相关功能,提供最新完整的瓦片资源下载及相关工具(示例代码,一键复制

vue,vue2,vue3,百度地图,离线使用百度地图,百度地图瓦片官方下载,vue内网使用百度地图离线无网络,断网情况下使用百度地图,vue离线百度地图教程,如何实现内网部署百度地图,无需联网离线使用,vue+ts实现离线百度地图 内网离线百度地图,如何在百度地图Vue项目中下载离线地图,百度离线地图加载不出来,百度地图离线使用不显示怎么办,怎么解决vue内网使用离线百度地图加载失败问题,vue实现离线地图+百度瓦片,vue引入百度离线地图,vue项目如何使用离线百度地图和自定义地图样式,百度离线地图的下

✅ 精选推荐文章 1万+

View的绘制顺序

1.写在 super.onDraw() 的下面 把绘制代码写在super.onDraw()的下面,由于绘制代码会在原有内容绘制结束之后才执行,所以绘制内容就会盖住控件原来的内容。 2.写在 super.onDraw() 的上面 如果把绘制代码写在super.onDraw()的上面,由于绘制代码会执行在原有内容的绘制之前,所以绘制的内容会被控件的原内容盖住。 3.dispatchDr...

weixin_30706507的博客 174

物联网与人工智能项目实战:构建智能农业监控系统

智能农业监控系统通过物联网技术实时监测农业环境中的各项数据(如土壤湿度、温度、光照强度等),并利用人工智能技术分析和预测农业生产的趋势,进而为农民提供决策支持。系统的核心目标是提高农作物的产量和品质,同时减少资源浪费,优化农田管理。环境监测:实时采集农田的温湿度、土壤湿度、光照等环境数据。作物生长监测:通过传感器和图像识别技术监测作物的生长状况。智能灌溉系统:根据土壤湿度和气候条件自动调整灌溉量。病虫害检测与预警:利用人工智能和图像识别技术自动检测作物病虫害,并及时给出预警。数据分析与决策支持。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 709

关于安卓自定义 View 设计的坑点漫谈

今天遇到一个问题,有测试反馈移动端 H5 页面点击输入框软键盘不弹起,然后我检查了一下代码,JS是开启了,焦点也默认获取,但是确实是点击没反应,后来发现是自定义 webview 的构造方法出了问题 public X5WebView(Context arg0) { this(arg0, null); } @SuppressLint("SetJavaScriptEn...

MarkRZJ的博客 130

IEM模型,地表粗糙度模拟

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

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

View 事件分发

View 事件分发 学习自 《Android开发艺术探索》 官方文档-MotionEvent 事件分发机制漫谈 View的事件分发机制,使我们了解View的工作原理继而学习如何自定义View的基础,尽管这些知识比较理论,但是还是很有必要了解其原理的,知其然不知其所以然是不可取的。 MotionEvent重提 我们在之前已经提到了MotionEvent对象也多少有些应用,但是并没有对其太过关注,而M...

weixin_33725239的博客 98

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

漫谈MySQL权限安全,威力加强版

前言 伟人曾经说过: 书是人类进步的阶梯 书中自有黄金屋,书中自有颜如玉 读书破万卷,下笔如有神 书是唯一不死的东西。 书籍是伟大的天才留给人类的遗产。 最近有很多朋友在我的公众号上提问“Android开发的经典入门教材和学习路线?”、“Android 开发入门教程有哪些推荐?”等类似的问题,我们不断重复回答这些问题,这让我萌生了做 2020ndroid开发爆款书籍推荐:从小白—Android高级工程师系列学习路线书籍介绍的想法,整理收集开发大牛的学习经验,以便让我们少走弯路,更快速成长。希望

m0_56530263的博客 100

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

温故而知新!漫谈MySQL权限安全,威力加强版

前言 伟人曾经说过: 书是人类进步的阶梯 书中自有黄金屋,书中自有颜如玉 读书破万卷,下笔如有神 书是唯一不死的东西。 书籍是伟大的天才留给人类的遗产。 最近有很多朋友在我的公众号上提问“Android开发的经典入门教材和学习路线?”、“Android 开发入门教程有哪些推荐?”等类似的问题,我们不断重复回答这些问题,这让我萌生了做 2020ndroid开发爆款书籍推荐:从小白—Android高级工程师系列学习路线书籍介绍的想法,整理收集开发大牛的学习经验,以便让我们少走弯路,更快速成长。希望

m0_57064331的博客 212

Android-LayoutAnimation

Android-LayoutAnimation 学习自 《Android开发艺术探索》 LayoutAnimation漫谈 LayoutAnimation 也是View动画的一种,作用是为ViewGroup的ChildView添加出场动画,我们经常回看到一些ListView的Item的出场效果很漂亮,就是通过LayoutAnimation实现的。 LayoutAnimation 首先还是在 re...

weixin_34249367的博客 85

系统的Drawable(四)-LayerListDrawable

系统的Drawable(四)-LayerListDrawable 学习自 https://blog.youkuaiyun.com/u014695188/article/details/52815444 LayerListDrawable 漫谈 使用layer-list可以将多个drawable按照顺序层叠在一起显示,默认情况下,所有的item中的drawable都会自动根据它附上view的大小而进行缩放。巧妙...

weixin_34355715的博客 203

Android 如何改变View的绘制层级

Android 改变View的绘制层级

leilifengxingmw的博客 6297

给linearlayout的控件排序

总结一句话就是: 用LinearLayout的removeViewAt (int index)   与 addView (View child, int index) 方法排序.  明白了的话就不用往下看了.... 首先根据需求的一次次修改,图是这样的(别问我为什么不用gridview...问老板去...) ...但是这样太丑了... 隐藏掉无权限的又显得太空....那排一下序

小乌笨笨的博客 2667

Carson带你学Android:手把手教你写一个完整的自定义View

前言 自定义View是Android开发者必须了解的基础 今天,我将手把手教你写一个自定义View,并理清自定义View所有应该的注意点 阅读本文前,请先阅读我写的一系列自定义View文章 自定义View基础 - 最易懂的自定义View原理系列(1) 自定义View Measure过程 - 最易懂的自定义View原理系列(2) 自定义View Layout过程 - 最易懂的

Carson带你学Android 4万+

Android自定义View流程

在开发中,View视图具有非常重要的作用,它是直接呈现给使用者的,因此向用户展示精美高效的View视图很有意义。Android系统提供了丰富的视图组件,如TextView、ImageView、Button等,还提供了RelativeLayout、LinearLayout、FrameLayout等组合组件,使用这些组件搭配能实现良好的视图效果。

qq_43357394的博客 1727

手把手教你写一个完整的自定义View

https://www.jianshu.com/p/e9d8420b1b9c 前言 自定义View是Android开发者必须了解的基础 今天,我将手把手教你写一个自定义View,并理清自定义View所有应该的注意点 阅读本文前,请先阅读我写的一系列自定义View文章(1)自定义View基础 - 最易懂的自定义View原理系列(2)自定义View Measure过程 - 最易懂的自定义View原理系列(3)自定义View Layout过程 - 最易懂的自定义View原理系列(4)自定义View Draw

az44yao的专栏 369

浅谈自定义View的宽高获取

自定义View的时候经常少不了获取View的宽高信息,当然不一定是自定义View的时候才会需要获取宽高信息,其他情况下我们也会有这样的需求,获取方式和获取的时机也十分讲究.下面分别从这几个api讲起: 1.构造方法 2.onFinishInflate 3.onSizeChanged 4.onMeasure 5.onWindowFocusChanged 6.onLayout 7.Vie

热爱不止,前行不息 2万+

Android --- 自定义View的三种实现方式及自定义属性使用介绍

我们在使用Android原生控件的时候,经常可以看到在布局文件中可以设置很多的属性值,如

梁同学与Android 2672
上一篇: Android自定义view之clip裁切以及几何变换
下一篇: EventBus源码解析,看这篇就够了
和小胖
博客等级 码龄12年 8粉丝 42原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值