Android View绘制流程详解

一、View的生命周期

1、onMeasure:设置View的测量尺寸,对应 xml 文件中的布局宽高模式以及 getWidth()、getHeight() 等

2、onLayout:ViewGroup 中的子 View 安排位置,对应 xml 文件中的布局文件结构以及 layout() 方法

3、onDraw:绘制自己,支持自定义绘制。

二、View的测量

1、测量模式:EXACTLY(具体大小)、AT_MOST(wrap_content)、UNSPECIFIED(设置为 0)

2、测量过程

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int widthMode = MeasureSpec.getMode(widthMeasureSpec);
        int widthSize = MeasureSpec.getSize(widthMeasureSpec);
        int heightMode = MeasureSpec.getMode(heightMeasureSpec);
        int heightSize = MeasureSpec.getSize(heightMeasureSpec);

        int width = 0;
        int height = 0;

        // 根据测量模式计算出尺寸
        if (widthMode == MeasureSpec.EXACTLY) {
            width = widthSize;
        } else {
            // 对于 match_parent 或者未指定大小的控件,使用默认值,比如控件的最低宽度等。
        }

        if (heightMode == MeasureSpec.EXACTLY) {
            height = heightSize;
        } else {
            // 同上,根据测量模式计算出尺寸,对于自适应大小的控件,尺寸为默认值。
        }

        setMeasuredDimension(width, height);
    }

三、View的布局

1、ViewGroup 需要实现 onLayout() 方法,对子 View 进行布局。

2、可以通过 getMeasuredWidth()、getMeasuredHeight()、getWidth()、getHeight() 等方法获得尺寸信息。

3、可以通过 getChildCount()、getChildAt(int index)、removeView(View view)、addView(View view) 等方法对子 View 进行操作。

    @Override
    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
        int childCount = getChildCount();
        int topOffset = 0;
        for (int i = 0; i < childCount; i++) {
            View childView = getChildAt(i);
            // 对于一些不想占用区域的控件,可以通过 childView.getVisibility() 等判断。
            if (childView.getVisibility() == VISIBLE) {
                int childWidth = childView.getMeasuredWidth();
                int childHeight = childView.getMeasuredHeight();
                childView.layout(0, topOffset, childWidth, topOffset + childHeight);
                topOffset += childHeight;
            }
        }
    }

四、View的绘制

1、View 首先会调用 onDraw(Canvas canvas) 方法,传入一个 Canvas 对象,让开发人员自行绘制。

2、如果不重写 onDraw,则 View 会直接绘制自己的背景以及指定的 Drawable。

3、View 的绘制和布局都是在 UI 线程中执行,因此需要注意 UI 线程的性能。

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        // 自定义绘制
        Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
        paint.setColor(Color.GREEN);
        canvas.drawCircle(getWidth() / 2f, getHeight() / 2f, getWidth() / 2f, paint);
    }

五、View的绘制流程总结

View 的绘制流程可以概括为:以 onDraw 为核心在 UI 线程中绘制 View,调用 onMeasure 和 onLayout 方法给出 View 的尺寸和位置。

通过了解 View 的生命周期、测量、布局、绘制等方面,可以更好地理解 Android 的 View 操作,从而更加灵活地开发。

原创文章,作者:CWZUL,如若转载,请注明出处:https://www.506064.com/n/332419.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
CWZULCWZUL
上一篇 2025-01-24 18:46
下一篇 2025-01-24 18:46

相关推荐

  • Android ViewPager和ScrollView滑动冲突问题

    Android开发中,ViewPager和ScrollView是两个常用的控件。但是当它们同时使用时,可能会发生滑动冲突的问题。本文将从多个方面介绍解决Android ViewPa…

    编程 2025-04-28
  • Android如何点击其他区域收起软键盘

    在Android应用中,当输入框获取焦点弹出软键盘后,我们希望能够点击其他区域使软键盘消失,以提升用户体验。本篇文章将说明如何实现这一功能。 一、获取焦点并显示软键盘 在Andro…

    编程 2025-04-28
  • Python爬虫流程用法介绍

    本文将介绍Python爬虫的流程,包括数据采集、数据处理以及数据存储等方面。如果想要使用Python爬取网站数据,本文将为您提供详细的指导和实例。 一、数据采集 1、确定目标网站 …

    编程 2025-04-27
  • Java项目Git发布流程规范

    本文旨在介绍Java项目在使用Git进行发布时的流程规范。Git作为一个版本控制工具,其功能十分强大,但是对于Java项目进行发布时,需要我们根据标准化的流程规范来执行操作,以确保…

    编程 2025-04-27
  • Android Studio HUD 实现指南

    本文将会以实例来详细阐述如何在 Android Studio 中使用 HUD 功能实现菊花等待指示器的效果。 一、引入依赖库 首先,我们需要在 build.gradle 文件中引入…

    编程 2025-04-27
  • Android和Vue3混合开发方案

    本文将介绍如何将Android和Vue3结合起来进行混合开发,以及其中的优势和注意事项。 一、环境搭建 在进行混合开发之前,需要搭建好相应的开发环境。首先需要安装 Android …

    编程 2025-04-27
  • Android Java Utils 可以如何提高你的开发效率

    Android Java Utils 是一款提供了一系列方便实用的工具类的 Java 库,可以帮助开发者更加高效地进行 Android 开发,提高开发效率。本文将从以下几个方面对 …

    编程 2025-04-27
  • xmake qt:构建Qt应用的全流程解决方案

    本文将会详细阐述xmake qt的使用方法以及其能够解决的问题。针对Qt应用开发中的各种困境,xmake提供了一整套的解决方案,包括自动构建、依赖管理、部署打包等,极大地提高了开发…

    编程 2025-04-27
  • Linux sync详解

    一、sync概述 sync是Linux中一个非常重要的命令,它可以将文件系统缓存中的内容,强制写入磁盘中。在执行sync之前,所有的文件系统更新将不会立即写入磁盘,而是先缓存在内存…

    编程 2025-04-25
  • 神经网络代码详解

    神经网络作为一种人工智能技术,被广泛应用于语音识别、图像识别、自然语言处理等领域。而神经网络的模型编写,离不开代码。本文将从多个方面详细阐述神经网络模型编写的代码技术。 一、神经网…

    编程 2025-04-25

发表回复

登录后才能评论