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/zh-hant/n/332419.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
CWZUL的頭像CWZUL
上一篇 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

發表回復

登錄後才能評論