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避免重复执行

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

在MATLAB和Simulink中设计并仿真一个智能建筑能效优化系统 智能建筑能效优化是现代建筑管理的重要组成部分,旨在通过智能化手段降低能源消耗、减少碳排放并提高居住舒适性。通过Simulink进行智能建筑能效优化仿真,可以验证控制策略的有效性、优化系统设计并降低开发成本。以下是如何在MATLAB和Simulink中设计并仿真一个智能建筑能效优化系统的详细步骤。通过上述步骤,我们成功设计并实现了基于Simulink的智能建筑能效优化仿真。该系统能够模拟复杂的建筑环境,验证能效优化策略的有效性,并通过优化设计提高建筑的能源利用效率和居住舒适性。 阅读详情

相关推荐

MATLAB不能识别已安装的visual studio 2015解决方法

首先,对于MATLAB识别已经安装的vs版本通过命令: mex -setup 下图为本电脑下同时安装的两个visual studio 如果搞清楚MATLAB识别电脑上安装vs的过程,可通过命令: mex -setup -v MATLAB输出识别编译器的整个过程。其中HKLM和HKCU分别是注册表中的HKEY_CURRENT_USER,HKEY_LOCAL_MA…的缩写,MATLAB没有找到对应编译器是由于注册表里没有对应信息(主要是文件路径,C++编译器的路径),或者在注册表里存在该信息,但是找不到

qq_36320710的博客 4897

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

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

weixin_35758982的博客 1955

从Excel到‘一张图’办案:手把手教你用AbutionGraph构建公安经侦知识图谱(含数据建模避坑指南)

本文详细介绍了如何利用AbutionGraph时序图数仓技术,将公安经侦领域的Excel、银行流水等碎片化数据转化为可交互的知识图谱。通过数据清洗、实体关系模型设计、时序数据处理等步骤,实现高效智能分析,提升办案效率。特别包含数据建模避坑指南和实战案例,助力公安金融案件侦破。

weixin_33702545的博客 343

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

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

chuyouyinghe的专栏 799

肿瘤基因组分析实战:VAF、MAF、CCF这些指标到底怎么算?(附Python代码示例)

本文通过Python代码示例,详细解析了肿瘤基因组分析中VAF、MAF和CCF三大核心指标的计算逻辑与应用。文章从VCF文件解析入手,逐步演示了变异等位基因频率、次等位基因频率及癌细胞分数的计算方法,并探讨了拷贝数变异对结果的影响及克隆结构推断的实战流程,为生物信息分析提供实用指南。

silver的专栏 1006

英伟达笔试1

本文摘要: 使用NAND2门设计4位奇偶校验发生器,通过15个NAND2门实现4输入异或功能,分三级结构完成奇校验计算。 时序分析公式总结: 建立时间约束:T_cq + T_comb(max) + T_setup + T_skew ≤ T_clk 保持时间约束:T_cq + T_comb(min) + T_skew ≥ T_hold 提供了两段路径的具体时序检查公式和建立违规修复方法 分析32位粘滞累积寄存器Verilog代码: 功能:记录输入数据中出现过的所有1位 每个bit独立实现,复位清零,有效输入时

soulermax的博客 166

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

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

weixin_42126668的博客 1023

地震勘探原理---地震预处理

3.1 为什么说要对数据进行振幅补偿?具体来说,地震波在传播过程中会遇到各种各样的地质条件,例如不同的岩层、土壤、水层等,这些介质的密度、速度等特性不同,因而对地震波的能量消耗也有所不同。在传播距离较远的情况下,能量损失可能会导致接收到的地震信号振幅变小。相反,在传播距离较近的情况下,能量损失可能较小,导致接收到的地震信号振幅变大。如果不对数据进行振幅补偿,这种振幅不均衡会导致地震数据分析和解释的误差和不确定性增加,可能产生错误的结论。

DARRENANJIAN的博客 3274

自定义ViewGroup中child绘制顺序

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

小久久的博客 845

从华为杯建模到论文录用:我的Biomedical Signal Processing and Control投稿全记录(含Latex模板与审稿人推荐技巧)

本文详细记录了作者从华为杯数学建模竞赛到Biomedical Signal Processing and Control期刊投稿的全过程,分享了如何将竞赛成果转化为学术论文的实用技巧,包括LaTeX排版中的常见陷阱与解决方案,以及审稿人推荐策略。特别提供了针对Elsevier模板的优化建议和高效回复审稿意见的方法,适合生物医学信号处理领域的研究者参考。

weixin_42549037的博客 454

python怎样按某一列值拆分Excel表格

pd.ExcelWriter@python #用python按某一列拆分Excel工作表,将内容写入一个工作簿 本次以“按照表中的某一列,将一张表格拆分为多张表”的需求为例,简单介绍这个过程中用到的pd.ExcelWriter,及每一句的作用。 如上表《学生.xlsx》,假设有14万行28列,请按照学校名,拆分表格(不想用复制粘贴)。 ##代码及解释如下 import pandas as pd from time import time#用来计算时间,展示进度,减少焦虑 in_ws='学生.xlsx'#

learn_get的博客 6787

View的绘制顺序

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

weixin_30706507的博客 174

水文仿真软件:HEC-RAS (Hydrologic Engineering Center‘s River Analysis System)_(7).一维非稳态水力模型

自定义脚本是通过编程语言(如 Python)编写的一系列自动化任务,可以帮助用户更高效地处理数据和运行模型。编写脚本:使用 Python 或其他编程语言编写自定义脚本。集成脚本:将脚本集成到 HEC-RAS 中,实现自动化数据处理和模型运行。

kkchenjj的博客 933

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

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

MarkRZJ的博客 130

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

View 事件分发

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

weixin_33725239的博客 98

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

漫谈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、付费专栏及课程。

余额充值