欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android進階教程之ViewGroup自定義布局

 更新時間:2019年06月23日 09:15:02   作者:水中魚之1999  
這篇文章主要給大家介紹了關(guān)于Android進階教程之ViewGroup自定義布局的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對各位Android開發(fā)者們具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧

前言

在我們的實際應(yīng)用中, 經(jīng)常需要用到自定義控件,比如自定義圓形頭像,自定義計步器等等。但有時我們不僅需要自定義控件,舉個例子,F(xiàn)loatingActionButton 大家都很常用,所以大家也很經(jīng)常會有一種需求,點擊某個 FloatingActionButton 彈出更多 FloatingActionButton ,這個需求的一般思路是寫 n 個 button 然后再一個個的去設(shè)置動畫效果。但這實在是太麻煩了,所以網(wǎng)上有個 FloatingActionButtonMenu 這個開源庫,這就是利用到了自定義布局 「ViewGroup」,現(xiàn)在就讓我給他家介紹下,如何自定義布局 「layout」。

難點

相比于自定義 View ,自定義 ViewGroup 的難點在于,子控件位置的確定和布局大小的確定。不像 單個 View 子要花粉好模式,測量好寬度就搞定了,ViewGroup 的長寬根據(jù)子 View 的數(shù)量和單個的大小變化而變化。這就是最大的坎,所以該如何確定 ViewGroup 的大小呢?

步驟

這里 我為大家設(shè)計一個 類似 LinearLayout 線性布局的 ViewGroup 作為范例。

首先,如果是一個 LinearLayout 那么當設(shè)置 wrap_content 時,他就會以子空間中最寬的那個為它的寬度。同時在高度方面會是所有子控件高度的總和。所以我們先寫兩個方法,分別用于測量 ViewGroup 的寬度和高度。

 private int getMaxWidth(){
  int count = getChildCount();
  int maxWidth = 0;
  for (int i = 0 ; i < count ; i ++){
   int currentWidth = getChildAt(i).getMeasuredWidth();
   if (maxWidth < currentWidth){
    maxWidth = currentWidth;
   }
  }
  return maxWidth;
 }
 
 private int getTotalHeight(){
  int count = getChildCount();
  int totalHeight = 0;
  for (int i = 0 ; i < count ; i++){
   totalHeight += getChildAt(i).getMeasuredHeight();
  }
  return totalHeight;
 }

對于 ViewGroup 而言我們可以粗略的分為兩種模式:固定長寬模式(match_parent),自適應(yīng)模式(wrap_content),根據(jù)這兩種模式,就可以對 ViewGroup 的繪制進行劃分。這里關(guān)于 measureChildren 這個方法,他是用于將所有的子 View 進行測量,這會觸發(fā)每個子 View 的 onMeasure 函數(shù),但是大家要注意要與 measureChild 區(qū)分,measureChild 是對單個 view 進行測量

 @Override
 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
  super.onMeasure(widthMeasureSpec, heightMeasureSpec);
 
  measureChildren(widthMeasureSpec, heightMeasureSpec);
 
  int widthMode = MeasureSpec.getMode(widthMeasureSpec);
  int width  = MeasureSpec.getSize(widthMeasureSpec);
  int heightMode= MeasureSpec.getMode(heightMeasureSpec);
  int height = MeasureSpec.getSize(heightMeasureSpec);
 
  if (widthMode == MeasureSpec.AT_MOST && heightMode == MeasureSpec.AT_MOST){
   int groupWidth = getMaxWidth();
   int groupHeight= getTotalHeight();
 
   setMeasuredDimension(groupWidth, groupHeight);
  }else if (widthMode == MeasureSpec.AT_MOST){
   setMeasuredDimension(getMaxWidth(), height);
  }else if (heightMode == MeasureSpec.AT_MOST){
   setMeasuredDimension(width, getTotalHeight());
  }
 }

重寫 onLayout

整完上面這些東西,我們的布局大小七十九已經(jīng)出來了,然我們在活動的布局文件里面加上它,并添加上幾個子 View 然后運行一下,先看看效果:

 <com.entry.android_view_user_defined_first.views.MyLinearLayout
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:background="@color/colorAccent">
 
  <Button
   android:layout_width="100dp"
   android:layout_height="50dp"
   android:text="qwe"/>
 
  <Button
   android:layout_width="250dp"
   android:layout_height="150dp"
   android:text="qwe"/>
 
  <Button
   android:layout_width="200dp"
   android:layout_height="75dp"
   android:text="qwe"/>
 
 </com.entry.android_view_user_defined_first.views.MyLinearLayout>

運行效果如下:


我們看見布局出來了,大小好像也沒啥問題,但是子 View 呢??! 這么沒看見子 View 在看看代碼,系統(tǒng)之前然我們重寫的 onLayout() 還是空著的呀!!也就是說,子 View 的大小和位置根本就還沒有進行過設(shè)定!讓我們來重寫下 onLayout() 方法。

 @Override
 protected void onLayout(boolean changed, int l, int t, int r, int b) {
  int count = getChildCount();
  int currentHeight = 0;
  for (int i = 0 ; i < count ; i++){
   View view = getChildAt(i);
   int height = view.getMeasuredHeight();
   int width = view.getMeasuredWidth();
   view.layout(l, currentHeight, l + width, currentHeight + height);
   currentHeight += height;
  }
 }

再運行一下看看:


成功了有木有!

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。

相關(guān)文章

  • Android開發(fā)手冊Chip監(jiān)聽及ChipGroup監(jiān)聽

    Android開發(fā)手冊Chip監(jiān)聽及ChipGroup監(jiān)聽

    這篇文章主要為大家介紹了Android開發(fā)手冊Chip監(jiān)聽及ChipGroup監(jiān)聽,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06
  • Android編程實現(xiàn)在底端顯示選項卡的方法

    Android編程實現(xiàn)在底端顯示選項卡的方法

    這篇文章主要介紹了Android編程實現(xiàn)在底端顯示選項卡的方法,涉及Android界面線性布局、相對布局及選項卡設(shè)置相關(guān)操作技巧,需要的朋友可以參考下
    2017-02-02
  • Flutter?異步編程之單線程下異步模型圖文示例詳解

    Flutter?異步編程之單線程下異步模型圖文示例詳解

    這篇文章主要為大家介紹了Flutter?異步編程之單線程下異步模型圖文示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-09-09
  • Android編程視頻播放API之MediaPlayer用法示例

    Android編程視頻播放API之MediaPlayer用法示例

    這篇文章主要介紹了Android編程視頻播放API之MediaPlayer用法,結(jié)合實例形式分析了基于Android API實現(xiàn)視頻播放功能的多媒體文件讀取、判斷、事件響應(yīng)及流媒體播放等相關(guān)實現(xiàn)技巧,需要的朋友可以參考下
    2017-08-08
  • Android中ArrayList和數(shù)組相互轉(zhuǎn)換

    Android中ArrayList和數(shù)組相互轉(zhuǎn)換

    在我們?nèi)粘i_發(fā)中難免會要將ArrayList和數(shù)組相互轉(zhuǎn)換,那么如何才能相互轉(zhuǎn)換呢?下面跟著小編一起通過這篇文章學習學習。
    2016-08-08
  • Android 三種動畫詳解及簡單實例

    Android 三種動畫詳解及簡單實例

    這篇文章主要介紹了Android 三種動畫詳解及簡單實例的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • Android 實現(xiàn)左滑出現(xiàn)刪除選項

    Android 實現(xiàn)左滑出現(xiàn)刪除選項

    滑動刪除的部分主要包含兩個部分, 一個是內(nèi)容區(qū)域(用于放置正常顯示的view),另一個是操作區(qū)域(用于放置刪除按鈕)。下面通過本文給大家介紹Android 實現(xiàn)左滑出現(xiàn)刪除選項,需要的朋友可以參考下
    2017-06-06
  • Android 自定義view實現(xiàn)TopBar效果

    Android 自定義view實現(xiàn)TopBar效果

    這篇文章主要為大家詳細介紹了Android 自定義view實現(xiàn)TopBar效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-09-09
  • Kotlin中雙冒號::使用方法

    Kotlin中雙冒號::使用方法

    這篇文章主要給大家介紹了關(guān)于Kotlin中雙冒號::使用的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Kotlin具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-09-09
  • Kotlin實現(xiàn)在類里面創(chuàng)建main函數(shù)

    Kotlin實現(xiàn)在類里面創(chuàng)建main函數(shù)

    這篇文章主要介紹了Kotlin實現(xiàn)在類里面創(chuàng)建main函數(shù),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-03-03

最新評論