Android中dispatchDraw分析

2023-05-16

Android中dispatchDraw分析

View中:

public void draw(Canvas canvas) {

/*

1. Draw the background   绘制背景

2. If necessary, save the canvas' layers to prepare for fading  如有必要,颜色渐变淡之前保存画布层(即锁定原有的画布内容)

3. Draw view's content  绘制view的内容

4. Draw children    绘制子view

5. If necessary, draw the fading edges and restore layers   如有必要,绘制颜色渐变淡的边框,并恢复画布(即画布改变的内容附加到原有内容上)

6. Draw decorations (scrollbars for instance)   绘制装饰,比如滚动条

*/

   ...

   if (!dirtyOpaque) {

       drawBackground(canvas); //背景绘制

   }

   // skip step 2 & 5 if possible (common case) 通常情况跳过第2和第5步

   ...

   if (!dirtyOpaque) onDraw(canvas); //调用onDraw

   dispatchDraw(canvas);   //绘制子view

   onDrawScrollBars(canvas); //绘制滚动条

   ...

}

protected void dispatchDraw(Canvas canvas) { //空实现 }

protected void onDraw(Canvas canvas) { //空实现 }


ViewGroup中:

protected void dispatchDraw(Canvas canvas) {

    ...

    drawChild(...); //绘制子view

    ...

}


protected boolean drawChild(Canvas canvas, View child, long drawingTime) {

        return child.draw(canvas, this, drawingTime);

}



说明:

1. 自定义一个view时,重写onDraw。

    调用view.invalidate(),会触发onDraw和computeScroll()。前提是该view被附加在当前窗口上

    view.postInvalidate(); //是在非UI线程上调用的


2.  自定义一个ViewGroup,重写onDraw。

     onDraw可能不会被调用,原因是需要先设置一个背景(颜色或图)。

           表示这个group有东西需要绘制了,才会触发draw,之后是onDraw。

    因此,一般直接重写dispatchDraw来绘制viewGroup


3. 自定义一个ViewGroup

    dispatchDraw会调用drawChild。

总结:

绘制VIew本身的内容,通过调用View.onDraw(canvas)函数实现

绘制自己的孩子通过dispatchDraw(canvas)实现


    View组件的绘制会调用draw(Canvas canvas)方法,draw过程中主要是先画Drawable背景,对 drawable调用setBounds()然后是draw(Canvas c)方法.有点注意的是背景drawable的实际大小会影响view组件的大小,drawable的实际大小通过getIntrinsicWidth()和getIntrinsicHeight()获取,当背景比较大时view组件大小等于背景drawable的大小
     画完背景后,draw过程会调用onDraw(Canvas canvas)方法,然后就是dispatchDraw(Canvas canvas)方法, dispatchDraw()主要是分发给子组件进行绘制,我们通常定制组件的时候重写的是onDraw()方法。值得注意的是ViewGroup容器组件的绘制,当它没有背景时直接调用的是dispatchDraw()方法, 而绕过了draw()方法,当它有背景的时候就调用draw()方法,而draw()方法里包含了dispatchDraw()方法的调用。因此要在ViewGroup上绘制东西的时候往往重写的是dispatchDraw()方法而不是onDraw()方法,或者自定制一个Drawable,重写它的draw(Canvas c)和 getIntrinsicWidth(), getIntrinsicHeight()方法,然后设为背景。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android中dispatchDraw分析 的相关文章

随机推荐

  • vue3.0常用eslint配置详解 .eslintrc.js

    规则值 34 off 34 或者 0 xff0c 关闭 34 warn 34 或者 1 xff0c 警告 34 error 34 或者 2 xff0c 报错 eslintrc js配置 module span class token pun
  • 实际项目中使用Postsharp

    我现在的项目中使用了winform net2 0 43 asp net mvc net3 5 43 sqlserver2000 xff0c Orm使用的是Castle的ActiveRecord 客户端与服务器端通信使用的是Ice xff0c
  • 开启SELINUX真的就那么难吗?

    我们都知道Linux的安全性要高于windows xff0c 可是你明白Linux到底比windows的安全性高在哪里吗 xff1f 有人在部署环境的时候 xff0c 开局两件事关防火墙 关Selinux xff0c 请问你把Linux的这
  • SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)

    1 1 Spring Spring是一个开源框架 xff0c Spring 是于 2003 年兴起的一个轻量级的 Java 开发框架 xff0c 由 Rod Johnson 在其著作 Expert One On One J2EE Devel
  • 服务器不支持ipv6,怎么解决

    让服务器开发人员修改到上面的测试ipv6通过为止 如果服务器不会修改怎么办 找专业的人员帮忙 有可能需要购买中转服务 本解决方案的花钱找人帮忙部分有介绍 关于ipv6审核给你点借鉴 此文介绍了一些服务器如何适配ipv6 需要添加aaaa中转
  • VS2015远程连接虚拟机

    目录 一 安装VC Linux exe 二 打开VS 选择新建项目 三 配置VS 四 创建项目 一 安装VC Linux exe 下载地址 xff1a 二 打开VS 选择新建项目 三 配置VS 打开VS xff0c 菜单栏点击工具 gt 选
  • 成都富华力鼎:短视频脚本有哪些类型

    制作短视频 xff0c 一个好的脚本是成功的关键 很多小伙伴没有提前写脚本 xff0c 在拍摄的时候就会遇到各种各样的问题 xff0c 场景不适合 员不适合 临时改内容等等 短视频脚本有哪些类型 1 提纲脚本 提纲脚本 xff1a 应用在纪
  • Android开发-Android 10 的新功能及新特性

    前 言 Google 在去年 xff08 2019年 xff09 3月份首次公布了 Android 10 的测试版 xff0c 然后在去年 5 月份的 Google 年度 I O 开发者大会上展示了 Android 10 系统的几个新的功能
  • asp.net动态切换主题

    C 代码 protected void Page PreInit object sender EventArgs e if Request QueryString 34 theme 34 61 null switch Request Que
  • datatable中button

    function test 34 ruleDataTable2 34 dataTable 34 sAjaxSource 34 dbLinkUrl sqlResultexport 34 fnServerData 34 createShowin
  • 重构——使用多态替换switch

    好吧 xff0c 我这个菜鸟确实是常常在用面向过程的思想在考虑问题 xff0c 在编写程序 现在我已经摈弃了自己对java语言个人的偏见 xff0c 而是用平等公平的态度看待java和C 43 43 他们各有千秋 xff0c 各有乾坤的 好
  • HttpUtil

    package com cmb utils import com fasterxml jackson databind ObjectMapper import org apache http Header import org apache
  • springboot异步请求

    场景 xff1a 用户注册的时候会发送短信和邮件 xff0c 注册成功和发送短信 邮件解耦后会提高响应效率 启动类添加注解 64 EnableAsync 64 SpringBootApplication public class Appli
  • Linux安装Terminator

    大家在使用Linux系统的时候 xff0c 有很大一部分时间都是和系统的终端打交道 时间久了会不会有一种厌烦的感觉呢 xff1f xff08 我是一个始终如一的人 xff0c 怎能厌烦呢 xff1f xff09 x1f604 ubuntu下
  • 安装软件或者依赖包时显示错误:unable to locate package zliblg-dev

    在网上查了很久 xff0c 有人说需要更新一下 sudo apt get update 但是还是不行 xff0c 然后我把依赖包中的英文字母l改为阿拉伯数字1就好了 xff0c 哈哈 xff0c 就是这莫简单
  • ranger命令

    ranger命令 ranger主要用来在终端浏览文件的 使用起来也比较优于平时常用的cd命令 安装 span class token function sudo span span class token function apt get
  • firewalld 和 docker 冲突问题

    造成冲突的主要原因是 xff1a iptables的存在 firewalld 和 iptables 首先 xff0c firewalld 和 iptables 都不是防火墙 xff0c 它们只是防火墙的管理程序 xff0c 真正的防火墙是内
  • Android Studio项目中各目录的图标含义

    对初学安卓的人 xff0c 熟悉Android Studio上的各模块都要花力气 打开团队的一个工程 xff0c 对各目录上显示的图标有圆点 方块 三条柱形等等 xff0c 真的一脸茫然 所以本文记录对工程中的文件图标的含义 xff0c 方
  • base64转换

    String data 61 34 9j 4AAQSkZJRgABAQEAZABkAAD 2wBDAAUDBAQEAwUEBAQFBQUGBwwIBwcHBw8LCwkMEQ8SEhEPERETFhwXExQaFRERGCEYGh0dHx8
  • Android中dispatchDraw分析

    Android中dispatchDraw分析 View中 xff1a public void draw Canvas canvas 1 Draw the background 绘制背景 2 If necessary save the can