android自定义view三(draw和ondraw)

压测:Locust & WebSocket 二次开发 压测:Locust & WebSocket 二次开发 一、需求: 压测 WebSocket 接口性能问题。 二、问题: Locust 仅封装了Http Client;压测使用 WebSocket,需二次开发 三、解决方案:学习Http Client DrawScript.py #!/usr/bin/env python # -*- coding: utf-8 -*- """ ------------------------------------------------- File Nam 阅读详情

1、Android自定义View一(基础和原理)
http://blog.youkuaiyun.com/androidxiaogang/article/details/51849136
2、onMeasure(),onLayout()方法的和内部实现
http://blog.youkuaiyun.com/androidxiaogang/article/details/51880753

1、draw()和onDraw()的区别

1、draw()方法详解

在自定义View的时候可以重写draw和onDraw()方法


这里写图片描述


先看darw()方法:
这里写图片描述


从方法的上描述看:调用draw()的时候,必须手动的给view指定在Canvas,当实现自定义view的时候用onDraw(android.graphics.Canvas)这个方法代替。
虽然已经不推荐使用了,但还是应该分析一下它内部的流程
1. Draw the background(绘制背景)
2. If necessary, save the canvas’ layers to prepare for fading(如果需要,为保存这层为边缘的滑动效果作准备)
3. Draw view’s content(绘制内容)
4. Draw children(绘制子View)
5. If necessary, draw the fading edges and restore layers(如果需要,绘制边缘效果并且保存图层)
6. Draw decorations (scrollbars for instance)(绘制边框,比如scrollbars,其实每一个view,比如TextView也是有滚动条的,只是设置的显示或者不显示,或者gone)

接下来一步一步分析:

1、 绘制背景

 // Step 1, draw the background, if needed
        int saveCount;

        if (!dirtyOpaque) {
            drawBackground(canvas);
        }

第一部,比较简单,就是绘制view的背景

2、跳过第2和第5步

 // skip step 2 & 5 if possible (common case)

正常情况下,我们一般不用管这两步,这两步的主要作用是当我们滑动到view边缘时产生的效果(比如滑动到边一些阴影)一般开发中也用不到这种效果。因此跳过2和5

3、第三步,绘制view内容

 // Step 3, draw the content
            if (!dirtyOpaque) onDraw(canvas);

看到这个方法就明白了吧,原来draw()内部是调用onDraw()实现的

4、第四步,绘制子view

 // Step 4, draw the children
            dispatchDraw(canvas);

5、第五步,仍然跳过

6、第六步,绘制foreground,比如滚动条。

 /**
     * Draw any foreground content for this view.
     *
     * <p>Foreground content may consist of scroll bars, a {@link #setForeground foreground}
     * drawable or other view-specific decorations. The foreground is drawn on top of the
     * primary view content.</p>
     *
     * @param canvas canvas to draw into
     */
    public void onDrawForeground(Canvas canvas) {
        onDrawScrollIndicators(canvas);
        onDrawScrollBars(canvas);

        final Drawable foreground = mForegroundInfo != null ? mForegroundInfo.mDrawable : null;
        if (foreground != null) {
            if (mForegroundInfo.mBoundsChanged) {
                mForegroundInfo.mBoundsChanged = false;
                final Rect selfBounds = mForegroundInfo.mSelfBounds;
                final Rect overlayBounds = mForegroundInfo.mOverlayBounds;

                if (mForegroundInfo.mInsidePadding) {
                    selfBounds.set(0, 0, getWidth(), getHeight());
                } else {
                    selfBounds.set(getPaddingLeft(), getPaddingTop(),
                            getWidth() - getPaddingRight(), getHeight() - getPaddingBottom());
                }

                final int ld = getLayoutDirection();
                Gravity.apply(mForegroundInfo.mGravity, foreground.getIntrinsicWidth(),
                        foreground.getIntrinsicHeight(), selfBounds, overlayBounds, ld);
                foreground.setBounds(overlayBounds);
            }

            foreground.draw(canvas);
        }
    }

2、onDraw()方法详解

从上面draw()方法可以看出,即使在draw()内部也是调用了onDraw()方法,draw()方法的使用其实帮我们绘制一些比较特别的东西,比如view边缘滑动时的阴湿,和滚动条之类的。但在实际开发这,这些一般是用不到了,这也是android API是
建议我们使用onDraw()方法的原因。
进入onDraw()方法中:

 /**
     * Implement this to do your drawing.
     *
     * @param canvas the canvas on which the background will be drawn
     */
    protected void onDraw(Canvas canvas) {
    }

这个方法是一个空的实现。当看到源码中有空实现的时候,这就是要求我们自已去实现。

2、dispatchDraw的使用

在上面draw()的第四步中,看到调用dispatchDraw是绘制子View的,在View与ViewGroup中的代码不同:
在View中


这里写图片描述


而在ViewGroup中
这里写图片描述

在View中是一个空的实现,因为View中可以没有自已的子View,但在ViewGroup中,它一定有自已的子类。

3、Canvas的使用

从上面的分析可以看出自定义View最终调用的是用onDraw()进行绘制了,而且是一个空的实现,那么所有工作就转移到我们传入的参数Canvas中,了解这个类的使用,帮助我们绘制出各种不同的效果。
这里写图片描述


看API介绍

Canvas被draw调用,当draw的时候需要4个基本的元素

1、a Bitmap to hold the pixels (一个图片,最终呈现我们画的东西)

2、a Canvas to host the draw calls (writing into the bitmap)(把canvas绘制到图片中)

3、a drawing primitive (e.g. Rect, Path, text, Bitmap), (绘制的具体内容,可以文本,图片,形状之类)

4、a paint (to describe the colors and styles for the drawing).(绘制需要的工具,大小,颜色)

PyQt5绘图 绘图 PyQt5绘图系统能渲染矢量图像、位图图像和轮廓字体文本。一般会使 用在修改或者提高现有组件的功能,或者创建自己的组件。使用PyQt5 的绘图API进行操作 绘图由 paintEvent() 方法完成,绘图的代码要放在 QPainter 对象 的 begin() 和 end() 方法之间。是低级接口 一、文本涂鸦 从画一些Unicode文本开始,写了一些文本上下居中对齐的俄罗斯Cylliric语言的文字 代码实现: import sys from PyQt5.QtWidgets import QWid 阅读详情

相关推荐

Android 自定义 View 之 draw 原理分析

Android自定义View系列文章至今已经分析了自定义流程的measure,layout以及对TouchEvent的处理。那么接下来当然应该讲到对draw原理分析了,draw这一步骤是整个自定义过程中极为重要的一步,而今天这一篇文章就是对draw原理进行分析。经过measure测量和layout定位后,自定义View便进入了draw绘制阶段。

薛建新的博客 1996

Python实现多子图绘制系统

之前在添加DrawType控件的时候,不仅添加了全局控件,而且每个AxisList也都添加了,这可不是乱添加的,而是为了后续的功能,即子图绘制。如果一个窗口中有多组坐标轴,那么每个坐标轴都应该有相应的图像。

微小冷的学习笔记 5872

吉他谱_This Charming Man - The Smiths.pdf

初级入门吉他谱 guitar tab

《Python多人游戏项目实战》第三节 在窗口上显示玩家ID以及对话内容

本节只是在上一节内容的基础上加一些小功能:显示不同的人物图片、在人物头顶上显示玩家ID以及人物头顶上显示一个聊天对话框。大家可以把这一节内容当做一个过渡,用来巩固下多人游戏程序中pickle的用法。程序完成后的运行结果如下:本项目结构显示如下:├── SimHei.ttf # 字体文件├── client.py # 客户端代码├── pics # 图片文件夹。

热爱代码 3917

用Arduino和MAX30102做个心率血氧仪,从硬件连线到算法调试全流程避坑

本文详细介绍了如何使用Arduino和MAX30102传感器构建高精度心率血氧仪,涵盖硬件连线、软件配置、信号处理及算法优化全流程。通过实战案例和避坑指南,帮助开发者快速实现临床级精度的健康监测设备,适用于可穿戴设备和医疗健康领域。

weixin_26897585的博客 384

【分布式系统学习】CAP原理详解

概述:互联网最重要任务莫过于海量数据处理,即大规模分布式系统,分布式是互联网的核心技术!!!如上所述,分布式系统是无法同时满足CAP三个特性的。1.Atomicity(原子性)一个事务中的所有操作,要么全部完成,要么全部不完成,不会在中间某个环节结束。事务在执行过程中发生错误,会被回滚到事务开始前的状态,就像这个事务从来没有执行过一样。2.Consistency(一致性)在事务开始之前和事务结束以后,数据库的完整性没有被破坏。3.Isolation(隔离性)

大龄烤红薯的博客 5024

谈谈自定义View的流程?

更多面试题请看这里:https://interview.raoyunsoft.com/ 面试题专栏会持续更新欢迎关注订阅自定义View是Android开发者进阶的必备技能,掌握其流程能让你灵活实现复杂UI效果。核心分为两大块:理解系统绘制流程和实现自定义逻辑。View绘制从开始,分为三个阶段:Measure(测量) Layout(布局) Draw(绘制) 核心工具: :画布(绘制图形/文字) :画笔(控制颜色/样式) 二、自定义View六步法 1. 定义自定义属性 在中声明属性: X

bookzhan的专栏 424

工业级RFID读写器|识读器CK-LR08-E00通过以太网TCPIP自由协议与汇川PLC控制器联机与通讯实例方案

本文以工业级RFID读写器CK-LR08-E00和汇川PLC控制器H5U是实例介绍工业级RFID读写器CK-LR08-E00通过以太网TCPIP自由协议与汇川PLC控制器联机与通讯方案。

华翔天诚科技 4372

【源码深度】Android View 工作流程全解析|Measure、Layout、Draw 源码与自定义 View|Android全栈体系150讲-21

u013365435的博客 122

展会客流统计的客流统计系统,WiFi客流每时每客

一般展会的举行时间都在3-7天之间,展会作为市场部门一项重要工作,一直以来没有一项有效的工具能够提供数据支持。 展会最重要的是通过活动和产品来吸引参展者的参观,如何统计展会期间的客流量呢?如何通过将数据转化成为活动数据的支撑呢? 目前成熟的解决方案有,视频客流统计、WiFi客流统计、红外线客流统计等方式。由于展会通常的时间都比较短,视频、红外线客流统计采购及安装价格都比较高,需

isentech的博客 3994

保姆级教程:用Qlib和LightGBM从零搭建你的第一个AI量化选股策略(附完整代码)

本文提供了一份详细的教程,教你如何使用Qlib和LightGBM从零搭建AI量化选股策略。教程涵盖了环境配置、数据获取、特征工程、模型训练和策略回测等关键步骤,并附有完整代码和常见问题解决方案,适合量化投资初学者快速上手。

weixin_29191081的博客 446

View绘制流程

iffy 105

一个测试工程师走进一家酒吧……

一个测试工程师走进一家酒吧,要了一杯啤酒;一个测试工程师走进一家酒吧,要了一杯咖啡;一个测试工程师走进一家酒吧,要了 0.7 杯啤酒;一个测试工程师走进一家酒吧,要了-1 杯啤酒;一个测试...

字节跳动技术团队官方博客 4887

自定义View之draw()与onDraw()方法

关于draw()方法与onDraw()方法的一些知识。

swt369的博客 9347

19、英国模式:银行体系的演变与现代金融架构

本文深入探讨了英国银行体系从专业化向全能银行的演变过程,分析了自律监管模式的优劣,并解析了围栏制度对金融稳定的影响。同时,文章还介绍了信用合作社、建筑协会和投资银行的角色与转型,全面展示了英国金融体系的多样性与复杂性,以及其在全球金融市场中的重要作用。

embedding5hiker的博客 105

innovus:streamOut gds中pg text带有冒号(:)解决办法

streamOut后查看layout,发现部分PG text后面加了冒号,比如VDD: / VSS:。当然,这个问题还有另一种解决办法,就是通过脚本给terminal打text再streamOut。我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧?

m0_61544122的博客 1190

Android ViewGroup的draw和onDraw的调用时机

Android ViewGroup的draw和onDraw的调用时机 View.draw和View.onDraw的调用关系 首先,View.draw和View.onDraw是两个不同的方法,只有View.draw被调用,View.onDraw才有可能被调用。在View.draw中有下面一段代码: final boolean dirtyOpaque = (privateFlags & PFLAG_DIRTY_MASK) == PFLAG_DIRTY_OPAQUE && (mAttach

C_biubiubiu的博客 3518

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Android View 绘制流程之三:draw绘制

Android View 绘制流程之三:draw绘制一.draw方法的整体流程二.drawBackground实现三.onDraw四.dispatchDraw的实现五.ScrollBar的绘制 draw()方法是View系统测绘流程的最后一步,就是绘制,当view测量完大小、确定完位置后,就需要在其位置处绘制出其内容等视觉上的东西;View的draw方法有固定的流程,一般ViewGroup需要在d...

依生依世 3884

假人有限元模型

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

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

ARTEX代码实现深潜:冷图压缩(Cold Digest)如何防止多Agent长时运行上下文爆炸

ARTEX 是一个基于 LLM 的多智能体自主渗透测试框架(Multi-Agent Penetration Testing),其规划器(Planner)+ Worker 的长时运行会不断向探索图(Exploration Graph)中写入意图、事实与漏洞节点。节点越积越多,每轮送入模型的 `graph_overview` 也会越来越长,最终触发上下文爆炸(Context Explosion)。AR

gitblog_00647的博客 356

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

View的onMeasure()、onLayout()、onDraw()总结

自定义View是android开发中常有的一项工作,要想自定义View,你就必须熟练掌握View的测量、布局及绘制,了解其原理并会使用。 View视图绘制需要搞清楚两个问题,一个是从哪里开始绘制,一个是怎么绘制? 先说从哪里开始绘制的问题:我们平常在使用Activity的时候,都会调用setContentView来设置布局文件,没错,视图绘制就是从这个方法开始的; 再来说说怎么绘制的: 在...

流月的博客 5850

Android 自定义View之Draw过程(上)

前言 Android 展示之三部曲: Measure(测量)---->Layout(摆放)---->Draw(绘制) 前边我们已经分析了: Android 自定义View之Measure过程 Android 自定义View之Layout过程 这俩最主要的任务是:确定View/ViewGroup可绘制的矩形区域。 接下来将会分析,如何在这给定的区域内绘制想要的图形。 Draw 过程涉及知识较多,分为上中下三篇 Android 自定义View之Draw过程(上) Android 自定

870

Android13 View draw流程分析

上面方法主要处理如下:1、调用View的drawBackground方法,绘制View的背景。2、调用View的onDraw方法。3、调用View的dispatchDraw方法,描绘子View。4、调用View的onDrawForeground方法,绘制View的前景。5、调用View的drawDefaultFocusHighlight方法,绘制默认焦点高亮显示。

liuning1985622的博客 867

view组件draw,onDraw,dispatchDraw,自定义view

此文章转自:http://blog.sina.com.cn/s/blog_55afbecd0100vqba.html    Android的view组件显示主要经过mesure, layout和draw这三个过程。在mesure阶段里调用mesure(int widthSpec, int heightSpec)方法,这个方法是final不能被重写,在这个过程里会调用onMesur

busjb的专栏 1560

View中的draw和onDraw有什么区别

我们在自定义view的时候只需要重写onDraw(),而没必要去重写draw(),因为onDraw()是draw()方法的一部分。 大概扫一下源码就可以明白,draw()这个函数本身会做很多事情, * 1. Draw the background * 2. If necessary, save the canvas' layers to prepare for fading * 3. Dr

蚁人日记 5274

Android | View.draw() 全流程解析:从背景到前景的七步渲染及其DispatchDraw()、OnDraw()区别

绝大多数View不需要绘制边缘渐变(fading edges),因此它们会走快速路径:跳过步骤2和步骤5中昂贵的图层保存与恢复操作(saveLayer和),从而提升绘制效率。开发者应避免重写方法。如果需要自定义绘制,请重写。如果需要控制子View的绘制顺序,请重写。绘制顺序是固定的。背景永远在最底层,内容在中间,子View在内容之上,装饰和前景在最顶层。是绘制的总入口。对于ViewGroup方法会递归调用每个子View的方法,从而形成一棵从根View到所有子孙View的绘制树。

小马快跑的博客 806

View中的draw和onDraw的区别

1.大概扫一下源码就可以明白,draw()这个函数本身会做很多事情,          *      1. Draw the background          *      2. If necessary, save the canvas' layers to prepare for fading          *      3. Draw view's content

fener10289的专栏 2万+
上一篇: android自定义View二(View的种类)
下一篇: Cookie和Session
android_xiaogang
博客等级 码龄12年 89粉丝 142原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值