自定義控件視圖篇(一)測量與布局

在自定義控件的開發過程中,"視圖篇"的測量與布局是非常關鍵的步驟,這直接決定了控件的尺寸、位置以及子視圖的排列方式。下面我將詳細介紹測量和布局的過程,以及如何在自定義控件中正確實現這些步驟。

視圖的測量 (onMeasure)

在 Android 中,每個視圖都會經歷測量過程來確定其尺寸。這個過程發生在 onMeasure() 方法中。系統會調用此方法并傳入兩個參數:MeasureSpecs。這兩個參數分別代表了水平方向和垂直方向上的約束。

MeasureSpec 包含三個部分:

  • MeasureSpec.UNSPECIFIED:沒有指定大小,視圖可以自由擴展。
  • MeasureSpec.EXACTLY:視圖應該嚴格遵守給定的大小。
  • MeasureSpec.AT_MOST:視圖不應超過給定的大小,但可以更小。

MeasureSpec 的值由 MeasureSpec.getSize()MeasureSpec.getMode() 方法獲取。在 onMeasure() 中,你需要根據這些約束計算出你的視圖的理想尺寸,并調用 setMeasuredDimension() 方法來設置視圖的寬高。

視圖的布局 (onLayout)

一旦視圖被測量,下一步就是布局。onLayout() 方法負責決定視圖內部元素的位置。當視圖的大小改變或者其父視圖調用了 requestLayout() 方法時,onLayout() 方法會被調用。

onLayout() 方法中,你需要遍歷所有的子視圖,并使用 layout() 方法來確定它們的位置。layout() 方法接收四個參數:左邊界、上邊界、右邊界和下邊界。

實現自定義視圖的測量和布局

下面是一個簡單的自定義視圖類,實現了測量和布局的基本邏輯:

Java

1public class CustomView extends View {
2
3    public CustomView(Context context) {
4        super(context);
5    }
6
7    public CustomView(Context context, AttributeSet attrs) {
8        super(context, attrs);
9    }
10
11    public CustomView(Context context, AttributeSet attrs, int defStyleAttr) {
12        super(context, attrs, defStyleAttr);
13    }
14
15    @Override
16    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
17        // 計算理想寬度和高度
18        int idealWidth = ...; // 你的寬度計算邏輯
19        int idealHeight = ...; // 你的高度計算邏輯
20
21        // 獲取寬度和高度的測量模式
22        int widthMode = MeasureSpec.getMode(widthMeasureSpec);
23        int heightMode = MeasureSpec.getMode(heightMeasureSpec);
24
25        int widthSize = MeasureSpec.getSize(widthMeasureSpec);
26        int heightSize = MeasureSpec.getSize(heightMeasureSpec);
27
28        // 根據測量模式和理想尺寸計算最終尺寸
29        int finalWidth = 0;
30        int finalHeight = 0;
31
32        if (widthMode == MeasureSpec.EXACTLY) {
33            finalWidth = widthSize;
34        } else {
35            finalWidth = idealWidth;
36        }
37
38        if (heightMode == MeasureSpec.EXACTLY) {
39            finalHeight = heightSize;
40        } else {
41            finalHeight = idealHeight;
42        }
43
44        setMeasuredDimension(finalWidth, finalHeight);
45    }
46
47    @Override
48    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
49        // 布局子視圖
50        for (int i = 0; i < getChildCount(); i++) {
51            View child = getChildAt(i);
52            // 計算子視圖的位置
53            int childLeft = ...; // 子視圖左邊界
54            int childTop = ...; // 子視圖上邊界
55            int childRight = ...; // 子視圖右邊界
56            int childBottom = ...; // 子視圖下邊界
57            child.layout(childLeft, childTop, childRight, childBottom);
58        }
59    }
60}

注意事項

  • 在?onMeasure()?中,務必考慮到?MeasureSpec?模式,不要忽略父視圖給出的約束。
  • 在?onLayout()?中,確保子視圖的坐標計算正確,避免重疊或超出邊界。
  • 考慮到性能問題,避免在?onMeasure()?和?onLayout()?中執行復雜的計算或操作,因為它們可能會頻繁被調用。

通過正確實現測量和布局,你可以創建出復雜而精確的自定義控件,滿足各種不同的需求。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/43275.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/43275.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/43275.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

2021版本的idea熱部署的詳細步驟

背景&#xff1a;我是自己用的是2021版本的idea,然后發現跟2023版本的熱部署不太一樣&#xff0c;所以&#xff0c;今天自己出一期這樣的文章吧&#xff01;&#xff01;&#xff01;其他人配置的時候根據自己的情況&#xff0c;來閱讀吧&#xff01; 第一步&#xff1a;方式一…

MyBatis是如何分頁的及原理

MyBatis 是一種持久層框架&#xff0c;支持通過配置文件和注解將 SQL 映射為 Java 對象。在實際開發中&#xff0c;查詢數據時經常需要進行分頁處理。 MyBatis 也提供了支持分頁的方案&#xff0c;其主要思路是使用 Limit 偏移量和限制個數&#xff0c;來獲取指定數量的數據。下…

音視頻入門基礎:H.264專題(10)——FFmpeg源碼中,存放SPS屬性的結構體和解碼SPS的函數分析

一、引言 FFmpeg源碼對AnnexB包裝的H.264碼流解碼過程中&#xff0c;通過ff_h2645_extract_rbsp函數拿到該H.264碼流中的某個NALU的NALU Header RBSP后&#xff08;具體可以參考&#xff1a;《FFmpeg源碼&#xff1a;ff_h2645_extract_rbsp函數分析》&#xff09;&#xff0c…

【沐風老師】3DMAX建筑體塊生成插件BuildingBlocks使用方法詳解

BuildingBlocks建筑體塊生成插件使用方法詳解 聽說你還在手動建配景樓&#xff1f;有了BuildingBlocks這個插件&#xff0c;一分鐘搞定喔&#xff01; 3DMAX建筑體塊生成插件BuildingBlocks&#xff0c;用于快速自定義街道及生成配景樓區塊。 【適用版本】 3dMax2019及更高版…

空間分析在3D應用中的革命:提升投資回報與業務價值

在3D應用的浪潮中&#xff0c;空間分析技術正成為提升用戶體驗、優化業務決策和解決復雜問題的關鍵工具。本文將深入探討空間分析如何通過提供深度用戶行為洞察和數據可視化&#xff0c;增強3D應用的實際效益和市場競爭力。 一、空間分析的概念與背景 Tony Bevilacqua&#x…

分布式I/O從站的認知

為什么需要分布式I/O從站&#xff1f; 當PLC與控制機構距離過遠時&#xff0c;遠距離會帶來信號干擾&#xff0c;分布式I/O從站只需要一個網絡線纜連接。 ET200分布式I/O從站家族 體積緊湊、功能強大。 ET200SP ET200M ET200S ET200iSP ET200 AL ET200pro ET200 eco PN 通訊協議…

DSSM雙塔特征交互

傳統的DSSM雙塔無法在早期進行user和item側的特征交互&#xff0c;這在一定程度上降低了模型性能。我們想要對雙塔模型進行細粒度的特征交互&#xff0c;同時又不失雙塔模型離線建向量索引的解耦性。下面介紹兩篇這方面的工作。 美團-Dual Augmented Two-tower 在user和item的特…

1. CSS Grid 網格布局教程

CSS Grid 網格布局教程 一、概述 網格布局&#xff08;Grid&#xff09;是最強大的 CSS 布局方案。 它將網頁劃分成一個個網格&#xff0c;可以任意組合不同的網格&#xff0c;做出各種各樣的布局。以前&#xff0c;只能通過復雜的 CSS 框架達到的效果&#xff0c;現在瀏覽器…

linux工具應用_VERDI

verdi 1. 基礎知識1.1 verdi介紹1.2 fsdb文件2. fsdb dump2.1 1st step-設置環境變量LD_LIBRARY_PATH2.2 2nd step-xrun仿真命令2.3 3rd step-仿真過程中調用fsdb函數dump波形2.3.1 在testbench、top.sv中調用fsdb函數2.3.2 在tcl腳本中用xrun的dump指令(同樣要調用fsdb函數)2.…

Scrapy crawl spider 停止工作

Scrapy是一個用于爬取網站數據的流行框架&#xff0c;有時爬蟲可能會停止工作&#xff0c;這通常是由多種原因引起的。以下是一些常見問題及其解決方法&#xff1a; 1、問題背景 用戶在使用 Scrapy 0.16.2 版本進行網絡爬取時遇到問題&#xff0c;具體表現為爬蟲在運行一段時間…

Android 開發中 C++ 和Java 日志調試

在 C 中添加堆棧日志 先在 Android.bp 中 添加 ‘libutilscallstack’ shared_libs:["liblog"," libutilscallstack"]在想要打印堆棧的代碼中添加 #include <utils/CallStack.h> using android::CallStack;// 在函數中添加 int VisualizerLib_Crea…

生物素結合金納米粒子(Bt@Au-NPs ) biotin-conjugated Au-NPs

一、定義與特點 定義&#xff1a;生物素結合金納米粒子&#xff0c;簡稱BtAu-NPs或biotin-conjugated Au-NPs&#xff0c;是指通過特定的化學反應或物理方法將生物素修飾到金納米粒子表面&#xff0c;形成穩定的納米復合材料。 特點&#xff1a; 高穩定性&#xff1a;生物素的修…

重構功能帶來的配套改造查找思路

最近在重構項目中的一個基礎配置功能&#xff0c;這個功能因為后續的業務變化和最初的缺陷設計導致非常難維護和擴展&#xff0c;使用起來也比較費勁&#xff0c;所以決定花一段時間來對它進行重構&#xff0c;去除一些用不到的設計&#xff0c;簡化了使用方式和配置方式&#…

RabbitMQ 遷移

文章目錄 1. 導出配置2. 導入配置3. 導出和導入定義&#xff08;如果不需要消息&#xff09;導出定義導入定義 注意事項參考文檔 要將 RabbitMQ 的配置&#xff08;包括vhost、exchange等&#xff09;從一個實例遷移到另一個實例&#xff0c;您可以遵循以下步驟&#xff1a; 1.…

【VUE基礎】VUE3第七節—Vue Router路由基礎

Vue Router 是 Vue 官方的客戶端路由解決方案。 客戶端路由的作用是在單頁應用 (SPA) 中將瀏覽器的 URL 和用戶看到的內容綁定起來。當用戶在應用中瀏覽不同頁面時&#xff0c;URL 會隨之更新&#xff0c;但頁面不需要從服務器重新加載。 Vue Router 基于 Vue 的組件系統構建&…

LabVIEW在半導體自動化測試中的應用

半導體制造的復雜性和精密度要求極高&#xff0c;每一個生產步驟都需要嚴格的控制和監測。自動化測試設備在半導體制造中起到了關鍵作用&#xff0c;通過精密測量和數據分析&#xff0c;確保產品質量和生產效率。本文介紹如何使用LabVIEW結合研華硬件&#xff0c;開發一個用于半…

C語言編程3:運算符,運算符的基本用法

C語言3&#x1f525;&#xff1a;運算符&#xff0c;運算符的基本用法 一、運算符&#x1f33f; &#x1f387;1.1 定義 運算符是指進行運算的動作&#xff0c;比如加法運算符"“&#xff0c;減法運算符”-" 算子是指參與運算的值&#xff0c;這個值可能是常數&a…

自動化測試高級控件交互方法:TouchAction、觸屏操作、點按,雙擊,滑動,手勢解鎖!

在自動化測試領域中&#xff0c;TouchAction 是一種非常強大的工具&#xff0c;它允許我們模擬用戶在設備屏幕上的各種觸摸事件。這種模擬不僅限于簡單的點擊操作&#xff0c;還包括滑動、長按、多點觸控等復雜的手勢。 點按與雙擊 點按和雙擊是觸屏設備上最基本的操作之一。…

使用 Qt 和 ECharts 進行數據可視化

文章目錄 示例圖表預覽折線圖散點圖柱狀圖使用 Qt 和 ECharts 進行數據可視化一、準備工作1. 安裝 Qt2. 準備 ECharts二、在 Qt 中使用 ECharts1. 創建 Qt 項目2. 配置項目文件3. 在 UI 中添加 WebEngineView4. 加載 ECharts三、創建折線圖、散點圖和柱狀圖1. 折線圖2. 散點圖3…

Jupyter Notebook的安裝教程

以下是一個詳細的 Jupyter Notebook 安裝教程&#xff0c;適用于大多數操作系統&#xff1a; Windows 系統 1. 安裝 Python 訪問 Python 官網&#xff0c;下載并安裝適合你系統的 Python 版本。在安裝過程中&#xff0c;確保勾選“Add Python 3.x to PATH”選項&#xff0c;…