日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

HenCoder UI 部分 2-1 布局基础

發布時間:2023/12/10 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 HenCoder UI 部分 2-1 布局基础 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

HenCoder 的第二季:自定義 View 第二部分——布局過程的自定義,從這期正式開始了。好像有點小激動。

廢話少說,直入正題。

簡介

之前我說過,自定義 View 最關鍵的有三個點:繪制、布局和觸摸反饋。上一季講過的繪制,內容雖然多(好像講了 8 期?),但難度上其實是最簡單的。而布局就和它相反,布局過程的技術知識,內容比較少(應該 3 期就能講完),但你先要理解它的內部工作原理才能正確理解它的使用,而它的工作原理卻是有點繞的。所以如果你跟著 HenCoder 學習布局過程的自定義,大致會是這樣一種體驗:看完視頻或者讀完文章,感覺吸收了一大波知識,信息量好大難以吞咽的樣子,但當你真的把它們吞咽下去,然后下載了我的練習項目去做練習的時候,卻又發現:臥槽,就這么點東西?布局過程的自定義竟然這么簡單?

會者不難這個詞在很多地方都講得通,但在布局過程的自定義上,尤為適用。

具體的概念、原理和技術細節,來看視頻吧:



總結

有人說:什么?簡介完了就是總結了?

嚯嚯,對的。所有的內容都在視頻里講完了,所以在這里就把視頻里講到的關鍵點總結一下:

布局過程的含義

布局過程,就是程序在運行時利用布局文件的代碼來計算出實際尺寸的過程。

布局過程的工作內容

兩個階段:測量階段和布局階段。

測量階段:從上到下遞歸地調用每個 View 或者 ViewGroup 的 measure() 方法,測量他們的尺寸并計算它們的位置;
布局階段:從上到下遞歸地調用每個 View 或者 ViewGroup 的 layout() 方法,把測得的它們的尺寸和位置賦值給它們。

View 或 ViewGroup 的布局過程

  • 測量階段,measure()?方法被父 View 調用,在?measure()?中做一些準備和優化工作后,調用?onMeasure()?來進行實際的自我測量。?onMeasure()?做的事,View??ViewGroup?不一樣:

  • View:View??onMeasure()?中會計算出自己的尺寸然后保存;

  • ViewGroup:ViewGroup??onMeasure()?中會調用所有子 View 的?measure()?讓它們進行自我測量,并根據子 View 計算出的期望尺寸來計算出它們的實際尺寸和位置(實際上 99.99% 的父 View 都會使用子 View 給出的期望尺寸來作為實際尺寸,原因在下期或下下期會講到)然后保存。同時,它也會根據子 View 的尺寸和位置來計算出自己的尺寸然后保存;

  • 布局階段,layout()?方法被父 View 調用,在?layout()?中它會保存父 View 傳進來的自己的位置和尺寸,并且調用?onLayout()?來進行實際的內部布局。onLayout()?做的事,?View??ViewGroup也不一樣:

  • View:由于沒有子 View,所以?View??onLayout()?什么也不做。

  • ViewGroup:ViewGroup??onLayout()?中會調用自己的所有子 View 的?layout()?方法,把它們的尺寸和位置傳給它們,讓它們完成自我的內部布局。

  • 布局過程自定義的方式

    三類:

  • 重寫?onMeasure()?來修改已有的?View?的尺寸;

  • 重寫?onMeasure()?來全新定制自定義?View?的尺寸;

  • 重寫?onMeasure()??onLayout()?來全新定制自定義?ViewGroup?的內部布局。

  • 第一類自定義的具體做法

    也就是重寫?onMeasure()?來修改已有的?View?的尺寸的具體做法:

  • 重寫?onMeasure()?方法,并在里面調用?super.onMeasure(),觸發原有的自我測量;

  • ?super.onMeasure()?的下面用?getMeasuredWidth()??getMeasuredHeight()?來獲取到之前的測量結果,并使用自己的算法,根據測量結果計算出新的結果;

  • 調用?setMeasuredDimension()?來保存新的結果。

  • 練習項目

    為了避免轉頭就忘,強烈建議你趁熱打鐵,做一下這個練習項目:HenCoderPracticeLayout1(微信用戶可以點底部的「閱讀原文」)

    下期預告

    下期是布局部分的最后一期:全新自定義 View 的尺寸。

    覺得贊?

    那就關注一下?↓↓↓





    總結

    以上是生活随笔為你收集整理的HenCoder UI 部分 2-1 布局基础的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。