首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏Android开发者家园

    View 绘制过程

    配合Activity 从启动到布局绘制简单分析 阅读 ? View绘制.png 基本概念介绍 Activity:一个 Activity 是一个应用程序组件,提供一个屏幕,用户可以用来交互。 上面内容是在 onCreate() 中执行完成 然后在 onResume 执行完成后调用View绘制 详细说明看:Activity 从启动到布局绘制简单分析 View 绘制 View 绘制流程可以分成三步 :测量、布局、绘制 分别对应了:onMeasure() onLayout() onDraw 当然这个过程中也会调用许多其他方法,都是作为辅助,大流程就这三步。 绘制 onDraw onDraw() 函数就是来绘制了,一般 ViewGroup 不会实现内部方法,子控件才重写 onDraw() 方法。也是内部一层层分发绘制。 然后 draw() 内部执行就和上面介绍 onDraw() 中一样了 到此整个页面的测量、布局、绘制就全部分析完毕了。 可以查看:Activity 从启动到布局绘制简单分析

    83320发布于 2019-12-26
  • 来自专栏向治洪

    View绘制流程

    View绘图流程 当 Activity 接收到焦点时候,它会被请求绘制布局,该请求由 Android framework 处理.绘制是从根节点开始,对布局树进行 measure 和 draw。 View 绘制流程函数调用链 ? 3. measure 核心方法 measure(int widthMeasureSpec, int heightMeasureSpec) 该方法定义在View.java类中,为 final 类型,不可被复写 View.onDraw(): View onDraw(Canvas)默认是空实现,自定义绘制过程需要复写方法,绘制自身内容。 dispatchDraw() 发起对子视图绘制。 从参数中可以看到,child.draw(canvas, this, drawingTime) 肯定是处理了和父视图相关逻辑,但 View 最终绘制,还是 View.draw(Canvas)方法。

    1.1K50发布于 2018-02-05
  • 来自专栏Android 进阶

    View 绘制源码分析

    绘制它自己,必须传入父view测量spec与子view自己padding值 protected void measureChild(View child, int parentWidthMeasureSpec horizontalEdges) {/绘制自己         // Step 3, draw the content         if (! dirtyOpaque) onDraw(canvas); //绘制view,如果当前没有子view则不需要绘制,在view中是空实现,具体在viewgroup中实现方法         // Step 但是当viewgroup需要通过onDraw方法来绘制内容时,于是就要显示关闭WILL_NOT_DRAW方法 Draw 分析总结 当是一个viewgroup,那么要递归所有的子view已完成绘制 从源码中可知 viewgroup不绘制任何内容,真正绘制在子view中进行,也就是调用子viewdraw方法进行绘制 View动画和ViewGroup布局动画区别: View动画指的是View自身动画,可以通过

    60330发布于 2019-12-26
  • 来自专栏我就是马云飞

    View绘制流程源码分析

    概述 View绘制流程主要是指测量、布局以及绘制显示,在View中,measure是测量View宽高,layout是控制View四个顶点位置,而draw就是将布局直接绘制出来。 数量后,循环遍历通过measureChild将子View绘制进去。 我们先来看看Viewlayout方法: public void layout(int l, int t, int r, int b) { if ((mPrivateFlags3 & PFLAG3 方法来进行view绘制,不过我们可以发现View和ViewGrouponlayout方法中并没有真正实现。 那我们看看其他,第一步:绘制背景,第三步:绘制内容,第四步:绘制view。第六步:绘制装饰,例如,前景,滚动条等等。

    78360发布于 2018-02-05
  • 来自专栏向治洪

    android之View绘制

    (),在View中这个函数什么都不会做,提供该函数主要是为viewGroup类型布局子视图用3、draw操作      draw操作利用前两部得到参数,将视图显示在屏幕上,到这里也就完成了整个视图绘制工作 子类也不应该修改该方法,因为其内部定义了绘图基本操作:      (1)绘制背景;      (2)如果要视图显示渐变框,这里会做一些准备工作;      (3绘制视图本身,即调用onDraw 而对于ViewGroup则不需要实现该函数,因为作为容器是“没有内容“,其包含了多个子view,而子View已经实现了自己绘制方法,因此只需要告诉子view绘制自己就可以了,也就是下面的dispatchDraw ;       以上三个方法是ViewGroup提供3个对子view进行测量参考方法,设计者需要在实际中首先覆写onMeasure(),之后再对子view进行遍历measure,这时候就可以使用以上三个方法 drawChild绘制子视图 // //所有子视图都绘制完成后这里还可以做一些处理,比如绘制阴影什么 //     }   其他  从以上分析可以看出View绘制是一个递归过程

    97590发布于 2018-01-30
  • 来自专栏我就是马云飞

    View绘制流程之MeasureSpec

    目的 我在一个多月之前就说我准备开始梳理基础事,好吧,我承认这一个月没我怎么梳理。或者梳理不多,当我梳理到view时候,发现需要分成绘制流程以及事件分发进行处理。一开始是想整理一般面试概要。 当我把整个绘制流程源码看完之后,我突然对一个词比较陌生,就是MeasureSpec。然后就决定整理一波。 MeasureSpec概念 通过源码我们可以知道MeasureSpec是View内部类,用来控制view尺寸。也就是view宽高是由他决定。 MODE_MASK :0x3<<MODE_SHIFT。0x代表16进制,10进制也为3(那为什么还要加上0x,不解),二进制为11,11向左进位30,也就是11后面30个0。 我在文章开头说了,这只是绘制流程中一个小东西而已。如果不结合整个绘制流程,单独看这个肯定一脸蒙蔽,那么后续绘制流程教程什么时候出?可能要过段时间了。

    73090发布于 2018-02-05
  • 来自专栏以Java架构赢天下

    View绘制-draw流程详解

    具体分析 以下源码基于版本27 DecorView draw 流程 在《View绘制-measure流程详解》中说过,View 绘制流程是从 ViewRootViewImpl 中 performMeasure = null) { mMenuBackground.draw(canvas); } } View draw 流程 就这样, View 绘制就开始啦。 horizontalEdges) { // Step 3, draw the content // 绘制内容 if (! ViewGroup 本身是继承 View ,它基本绘制流程也是通过父类 View 进行,只不过它重写了 dispatchDraw 方法,来进行子元素绘制View 本身是默认设置为 false ,没有启动这个优化标记(这也不难理解,因为一般我们自定义控件继承 View 时候,是要重写 onDraw 方法进行绘制)。

    1.5K30发布于 2019-06-06
  • 来自专栏向治洪

    android View绘制流程

    ,所以说这些View应该都具有相同绘制流程与机制才能显示到屏幕上(因为他们都具备相同父类View,可能每个控件具体绘制逻辑有差异,但是主流程都是一样)。 既然一个View绘制主要流程是这三步,那一定有一个开始地方呀,就像一个类从main函数执行一样呀。对于View绘制开始调运地方这里先给出结论,本文后面会反过来分析原因,先往下看就行。 因为每个View内容部分是各不相同,所以需要由子类去实现具体逻辑。 第四步,对当前View所有子View进行绘制,如果当前View没有子View就不需要进行绘制View默认不会绘制任何内容,真正绘制都需要自己在子类中实现。 View绘制是借助onDraw方法传入Canvas类来进行。 5-3 invalidate与postInvalidate方法总结 依据上面对Viewinvalidate分析我总结绘制如下流程图: ?

    1.7K90发布于 2018-01-30
  • 来自专栏曾大稳的博客

    Android View绘制流程分析

    我们刚接触android开发时候,应该都是从写布局开始,在写布局时候一般组长都要求我们少嵌套,这个是为什么呢?这个就要从我们今天要分析invalidate()分析。 performDraw(); //..... } 可以看到,进入这里面了,会依次调用performMeasure performLayout performDraw三个函数,依次调用了view绘制流程 ); } } mView就是ViewGroup,然后会调用ViewGrouponMeasure函数,然后测量,就从最上层父布局一直到测量到最底层view。 ); } mInLayout = false; } 同样道理,又是从最上层viewGroup到最底层view。 performDraw负责绘制,performDraw()会 调用draw,在调用drawSoftware /** * @return true if drawing was successful

    1.1K20发布于 2018-09-11
  • 来自专栏曾大稳的博客

    Android view绘制流程分析

    我们刚接触android开发时候,应该都是从写布局开始,在写布局时候一般组长都要求我们少嵌套,这个是为什么呢?这个就要从我们今天要分析invalidate()分析。 performDraw(); //..... } 可以看到,进入这里面了,会依次调用performMeasure performLayout performDraw三个函数,依次调用了view绘制流程 ); } } mView就是ViewGroup,然后会调用ViewGrouponMeasure函数,然后测量,就从最上层父布局一直到测量到最底层view。 ); } mInLayout = false; } 同样道理,又是从最上层viewGroup到最底层view。 performDraw负责绘制,performDraw()会 调用draw,在调用drawSoftware /** * @return true if drawing was successful

    1.3K30发布于 2018-09-11
  • 来自专栏Android-Xj

    Android中View是如何绘制

    界面窗口根布局是DecorView,该类继承自FrameLayout,而FrameLayout继承自ViewGroup。感觉绘制肯定会在ViewGroup或者View中 但是木有找到。 , HardwareRenderer.HardwareDrawCallbacks { } View绘制过程从ViewRootImpl.performTraversals()方法开始。 View绘制三个过程Measure、Layout、Draw 下面是这三个过程详细说明 Measure performMeasure方法如下: private void performMeasure( 再看一下dispatchDraw方法,这个方法是用来绘制View,所以要看ViewGroup.dispatchDraw方法,View.dispatchDraw是空View.draw方法内部会分别调用onDraw绘制自己以及dispatchDraw绘制View.

    2.8K40编辑于 2022-02-22
  • 来自专栏Android技术分享

    自定义View必备知识-View绘制流程

    View绘制流程框架 如图所示 ? View绘制是从上往下一层层迭代下来。 DecorView-->ViewGroup(--->ViewGroup)-->View ,按照这个流程从上往下,依次measure(测量),layout(布局),draw(绘制)。 ? canvas) draw过程则决定了View显示,完成draw后view会显示在屏幕上 绘制背景(background.draw(Canvas)) 绘制自己 protected void onDraw (Canvas canvas) onDraw绘制自己,新建一个paint 在canvas上绘制自己图形 绘制children (dispatchDraw)dispatchDraw会遍历调用所有子元素View测量、布局和绘制原理来看,要实现自定义View,根据自定义View种类不同,可能分别要自定义实现不同方法。

    2K30发布于 2019-05-29
  • 来自专栏深入理解Android

    重新复习Android View绘制流程

    了解绘制整体流程 绘制会从根视图ViewRootperformTraversals()方法开始,从上到下遍历整个视图树,每个View控件负责绘制自己,而ViewGroup还需要负责通知自己View View绘制流程之Measure Measure基本流程 页面的测量流程是从performMeasure方法开始,相关核心代码流程如下。 绘制View背景 drawBackground(canvas); ... // 步骤二:如果需要的话,保持canvas图层,为fading做准备 saveCount (canvas); ... // 步骤四:绘制ViewView dispatchDraw(canvas); ... // 步骤五:如果需要的话,绘制View } setWillNotDraw作用 // 如果一个View不需要绘制任何内容,那么设置这个标记位为true以后, // 系统会进行相应优化。

    68520编辑于 2022-06-22
  • 来自专栏Android进阶编程

    Android之View绘制问题汇总

    MeasureSpec是一种“测量规则”或者“测量说明书”,决定了View测量过程 ViewMeasureSpec会根据自身LayoutParamse和父容器MeasureSpec生成。 最终根据ViewMeasureSpec测量出View宽/高(测量时数据并非最终宽高) 2、MeasureSpec组成? SpecMode和SpecSize打包和解包方法 3、测量模式SpecMode类型和具体含义? 接口,可以在View树状态改变或者View树内部View可见性改变时,onGlobalLayout会被回调,能正确获取View宽/高 view.measure 8、Activity启动到最终加载ViewRoot 9、自定义View性能优化有哪些? 避免过度绘制 像素点能画一次就不要多次绘制,以及绘制看不到背景。开发者选项里内工具,只对xml布局有效果,看不到自定义View过度绘制,仍然需要注意。

    1.4K20编辑于 2023-03-06
  • 来自专栏北洋csdn

    Vsync信号和View绘制流程关系

    一个是vsync-app唤醒Chrographer做App绘制操作(生成当前帧数据) 一个是vsync-sf是SurfaceFliger使用,当vsync信号来临时进行合成操作(要满足消费完上一帧数据条件下 也就是说我们可以打乱顺序是先合成消费帧数据绘制到屏幕上还是先生成帧数据。 注意:有两个线程共同合作完成绘制动作:UIThread生成指令和RenderThread调用OpenGl库生成Buffer放入到BufferQuene缓冲队列中。 (释放操作在native层对应处理是把这块内存区域变成一个Bitmap交由RenderThread去渲染) draw方法其实并没有进行真正绘制,而是把绘制内容放入到了DisplayList中接着同步到 绘制最终会调用到View.invalidate方法 2.RenderThread执行时候UIThread就可以释放掉去做其他处理,接着RenerThread去取出DisplayList中数据进行处理生成

    65210编辑于 2022-05-06
  • 来自专栏Android&Java技术

    绘制一个漂亮弧形 View

    绘制一个漂亮弧形 View 来,先看下效果图: 怎么样? 漂亮吧,上面是一个标题栏,下面是一个弧形 View,标题栏和弧形 View 从左到右都有一个线性渐变色,类似于手机 QQ 顶部渐变效果,关于弧形这种效果,使用场景还是比较普遍,小面我们就一起来看看如何绘制吧 ,比较简单这里就不详细说了, onMeasure() 用于测量 View 宽高尺寸,onDraw() 就是具体绘制过程了,具体绘制思路是:我们在 onMeasure()方法中拿到测量出来宽和高, 有了路径之后我们就可以轻而易举地绘制出一个弧形了,完整代码请看下面: /** * Created by x-sir on 2018/8/10 :) * Function:自定义弧形 View * 3.将布局延伸到系统状态栏 Android 5.0 之后我们可以设置 Activity 布局延伸到系统状态栏中,这样我们页面看起来更美观和协调,设置也比较简单,直接贴代码了: @Override

    93320发布于 2020-02-27
  • 来自专栏HenCoder

    HenCoder Android 开发进阶:自定义 View 1-3 文字绘制

    之前内容在这里: HenCoder Android 开发进阶 自定义 View 1-1 绘制基础 HenCoder Android 开发进阶 自定义 View 1-2 Paint 详解 如果你没听说过 大概在这里: 而如果你像绘制其他内容一样,在绘制文字时候把坐标填成 (0, 0),文字并不会显示在 View 左上角,而是会几乎完全显示在 View 上方,到了 View 外部看不到位置: canvas.drawText StaticLayout 并不是一个 View 或者 ViewGroup ,而是 android.text.Layout 子类,它是纯粹用来绘制文字。 // 包含特殊符号绘制(如 emoji 表情)String text = "Hello HenCoder \uD83C\uDDE8\uD83C\uDDF3" // "Hello HenCoder ?? 练习项目 为了避免转头就忘,强烈建议你趁热打铁,做一下这个练习项目:HenCoderPracticeDraw3 下期预告 基本绘制(Canvas.drawXXX())以及高级绘制(Paint)都讲完了,

    1.5K20发布于 2018-08-20
  • 来自专栏Android开发实战

    Android组件View绘制流程原理分析

    androidView绘制 view绘制主要包括三个方面: measure 测量组件本身大小 layout 确定组件在视图中位置 draw 根据位置和大小,将组件画出来 视图绘制起点在ViewRootImpl draw绘制 完成measure和Layout后,ViewRootImpl中代码会创建一个Canvas对象,然后调用Viewdraw()方法来执行具体绘制工。 这里写图片描述 draw原理总结 可以看见,绘制过程就是把View对象绘制到屏幕上,整个draw过程需要注意如下细节: 如果该View是一个ViewGroup,则需要递归绘制其所包含所有子ViewView默认不会绘制任何内容,真正绘制都需要自己在子类中实现。 View绘制是借助onDraw方法传入Canvas类来进行。 在获取画布剪切区(每个Viewdraw中传入Canvas)时会自动处理掉padding,子View获取Canvas不用关注这些逻辑,只用关心如何绘制即可。

    1.5K40发布于 2018-10-22
  • 来自专栏设计模式

    View绘制流程深度剖析之-inlate

    在上面六种情况中是有一样: 如果mParentView不是null,那么:1、4是一样,2、5是一样3是一样,6是一样, 如果mParentView是null,那么:1、2、3、5是一样,4、6 attachToRoot) { root.addView(temp, params); } // 3. 3.ViewGroup.generateLayoutParams public LayoutParams generateLayoutParams(AttributeSet attrs) { return } else {// 带有包名View(例如自定义View,或者引用support包中Viewview = createView(name, null ", attrs); } 系统视图都在android.view包下,所以要添加前缀“android.view.”

    75530发布于 2020-12-16
  • 来自专栏向治洪

    Android View底层到底是怎么绘制

    Android绘制链图: 网上很多讲Android  view绘制流程往往只讲到了Measure - Layout - Draw。 这里面有一段很重要代码: window.getDecorView(); 正式这段代码告知系统可以从view根节点开始绘制了,通过DecorView方法,decorview调用了performTraversals draw(fullRedrawNeeded); } 调用然后系统再调用Measure - Layout - Draw实现了View绘制。 |= PFLAG3_IS_LAID_OUT; }  函数中参数l、t、r、b是指view左、上、右、底位置,通过这几个参数来确定view在Windows位置。 Draw decorations (scrollbars for instance) 根据view源码注释, 1,绘制背景 2,保存画布图层 3,调用了onDraw方法,子类中实现onDraw

    1.3K90发布于 2018-02-05
领券