`
luckliu521
  • 浏览: 258966 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Android怎么绘画视图How Android Draws Views

阅读更多
当一个活动接收到焦点时,它将被要求绘制它的布局。Android框架将处理这个绘画的过程,但是活动必须提供它的布局层次的根节点。

绘画从布局的根节点开始。它被要求来测量和绘制布局树。绘画通过遍历布局树并渲染每个和失效区域相交的视图来处理。相应的,每个视图组负责请求绘制它的子视图(通过draw() 方法)而每个视图负责画它自己。因为这个树是顺序遍历的,这意味着先画父节点(也就是在屏幕后面),然后按照树中出现的顺序画其同层次节点。

框架将不会画不在失效区域的视图,而且还将会帮你画视图背景。

你可以强制一个视图被重画,通过调用invalidate()。

绘画布局共有两步:一个度量过程和一个布局过程。度量过程在measure(int, int)里实现且是一个自顶向下的视图树遍历。每个视图在递归时往下推送尺寸规格。在度量过程的最后,每个视图都已经保存了自己的度量。第二个过程发生在layout(int, int, int, int) 中并且也是自顶向下。在这个过程中,每个父节点负责定位它的所有子节点,通过使用在度量过程中计算得到的尺寸。

当一个视图的measure()方法返回时,它的getMeasuredWidth()和getMeasuredHeight() 值必须被设置,以及所有这个视图子节点的值。一个视图的度量的宽度和高度值必须符合父视图引入的限制。这确保在度量过程之后,所有父节点接受所有它们的子节点的度量值。一个父视图可能会在其子视图上多次调用measure()方法。比如,父视图可能会通过未指定的尺寸调用measure来发现它们的大小,然后使用实际数值再次调用measure(),如果所有子视图未做限制的尺寸总合过大或过小(也即是,如果子视图之间不能对各自占据的空间达成共识的话,父视图将会干预并设置第二个过程的规则)。

要开始一个布局,可调用requestLayout()。这个方法通常在视图认为它自己不再适合它当前的边界的情况下被调用。

度量过程使用两个类来交流尺寸。View.MeasureSpec类被视图用来告诉它们的父视图它们想如何被度量和定位。基础的LayoutParams类仅仅描述了视图想有多大(高和宽)。对于每个维度,它可以指定下面之一:

·一个准确的数值

·FILL_PARENT, 这意味着视图想和父视图一样大(减掉填充padding)。

·WRAP_CONTENT, 这意味着视图只想有刚好包装其内容那么大(加上填充)

对于不同的ViewGroup子类,有相应的LayoutParams子类。比如,相对布局RelativeLayout有它自己的LayoutParams子类,这包含了能够让子视图横向和竖向居中显示的能力。

度量规格(MeasureSpecs)被用来沿着树从父到子的下传度量需求。一个MeasureSpecs可以是下面三种模式之一:

·UNSPECIFIED: 这被父视图用来决定其子视图期望的尺寸。比如,一个线性布局可能在它的子视图上调用measure() on its child,通过设置其高度为UNSPECIFIED 以及一个宽度为EXACTLY 240,来找出这个子视图在给定240像素宽度的情况下需要显示多高。

·EXACTLY: 这被父视图用来给子视图强加一个准确的尺寸。子视图必须使用这个大小,并确保其所有的后代将适合这个尺寸。

·AT_MOST: 这被父视图用来给子视图强加一个最大尺寸。子视图必须确保它自己以及所有的后代都适合这个尺寸。

→如果您认为本文档还有待完善,请 编辑文档
分享到:
评论

相关推荐

    Android状态栏透明(沉浸式)Demo

    在Android开发中,状态栏透明,也称为沉浸式(Immersive Mode)或者全屏模式,是一种提升用户体验的设计,使得应用内容可以延伸到系统状态栏下方,提供更广阔、更沉浸式的视觉效果。本Demo主要展示了如何实现Android...

    CommonTitleBar_historythr_machineugx_android_Android通用tiitlebar_

    这个布局可能包含ImageView用于放置应用图标,TextView用于显示应用名称,以及其他的按钮或视图元素。例如: ```xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_...

    Android开发 二维码扫描,识别相册图片二维码

    在Android开发中,二维码扫描和识别相册图片中的二维码是一项常用功能,这使得用户能够方便地从图片中获取隐藏的信息,如网址、联系人信息、文本等。在本项目"saomademo"中,我们将深入探讨如何实现这一功能,并讨论...

    Unity3D Android 状态栏

    window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); window.setStatusBarColor(Color.TRANSPARENT); }...

    解决Android 10 全面屏底部小横条NavigationDemo.zip

    3. **使用FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS**:设置`getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);`,然后使用`android:statusBarColor`和`android:navigationBarColor`...

    Android.Database.Best.Practices.0134437993

    A part of Addison-Wesley’s Android™ Deep Dive series for experienced Android developers, Android Database Best Practices draws on Adam Stroud’s extensive experience leading cutting-edge app ...

    Android沉浸式状态栏

    - 对于有自定义头部视图的`Toolbar`,需要设置`android:fitsSystemWindows="true"`并配合`android.support.v7.widget.Toolbar`的`setSupportActionBar()`方法来实现沉浸效果。 - 在某些第三方库或者特定设备上,...

    Android-Android屏幕适配之状态栏导航栏半透明全透明5.0以上去阴影方法多样

    window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); window.setStatusBarColor(Color.TRANSPARENT); // 去除导航栏阴影 window.clearFlags(WindowManager.LayoutParams.FLAG_...

    Android轻松实现沉浸式/透明式状态栏

    默认情况下,它是不透明的,并且遮挡了应用的部分视图。 2. **纯色沉浸式状态栏** 要设置纯色沉浸式状态栏,首先需要在AndroidManifest.xml中为Activity添加`android:theme`属性,指定一个允许透明状态栏的主题。...

    Android代码-MusicDNA

    The Music Player draws inspiration from paullewis's music-dna. The Player uses the FFT Data supplied by the Visualizer class of Android , calculates the Amplitude at that particular moment and plots ...

    android状态栏和主界面融为了一体

    这通常需要修改主题样式,如`Theme.AppCompat.NoActionBar`,并使用`getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)`来允许应用绘制状态栏背景。 3. **状态栏高度获取与调整...

    Android-Android改变状态栏颜色状态栏透明

    在Android应用开发中,改变状态栏的颜色和实现透明效果是一项常见的需求,这可以让应用程序界面更加美观,提升用户体验。本文将详细讲解如何在Android中实现这一功能。 首先,我们需要理解Android的状态栏。状态栏...

    android-toolbar和状态栏的使用、右上角setting

    在Android应用开发中,`Toolbar`是Android支持库提供的一种可自定义的视图组件,用作活动或应用的导航栏。它替代了之前的`Action Bar`,提供了更灵活的定制选项,允许开发者自由地调整布局和样式。本文将深入探讨`...

    Android之简单的实现透明状态栏

    在Android开发中,透明状态栏是一种常见的设计手法,它能够为应用提供更加沉浸式的用户体验,让用户感觉内容直接延伸到了屏幕的顶部。透明状态栏可以使应用的界面看起来更加现代且时尚,尤其是在那些需要全屏显示...

    Android 之 沉浸式状态栏及顶部状态栏背景色设置.txt

    其中,`android:clipToPadding` 属性表示是否裁剪视图到系统窗体边界,`android:fitsSystemWindows` 表示视图是否应该适应系统窗口。 2. **在Java代码中设置**: - 使用 `setStatusBarColor()` 方法设置状态栏的...

    Android自定义状态栏颜色

    在Android开发中,自定义状态栏颜色是一项常见的需求,它能帮助我们提升应用的整体视觉效果,使得应用看起来更加统一和专业。状态栏是Android设备顶部显示时间、通知图标以及网络状态的部分,而自定义状态栏颜色可以...

    Android 之低版本高版本实现沉浸式状态栏

    window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); window.setStatusBarColor(ContextCompat.getColor...

    Android 沉浸式状态栏的实现方法、状态栏透明的实现方法

    在Android 5.0及以上版本,我们使用`FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS`和`setStatusBarColor`来实现透明状态栏;在4.4至5.0之间,我们使用`SYSTEM_UI_FLAG_LAYOUT_STABLE`和`SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN`来...

Global site tag (gtag.js) - Google Analytics