Android CoordinatorLayout 入門介紹

來源:互聯網
上載者:User

標籤:編碼   座標   tom   des   自訂   api   err   方法   bottom   

Android CoordinatorLayout 入門介紹
    • CoordinatorLayout
    • View 知道如何表現

 

在 2015 年的 I/O 開發人員大會上,Google 介紹了一個新的 Android Design Support Library,該庫可以協助開發人員在應用上使用 meterial design。它包含了許多重要的 meterial design 的構建塊,並且它支援 API 7及以上的版本。如果你錯過了這次大會,那就請開啟Google開發人員網站來查閱它的相關資訊吧:傳送門。

CoordinatorLayout

在庫中所有好的東東之間,看起來真正有趣的是 CoordinatorLayout,它是一個 FrameLayout。從它的名字中,你或許已經猜到:該布局的強大在於,能夠協調子項目之間的依賴關係。

你需要做的就是把 View 包含在 CoordinatorLayout 中。讓我們直接進入代碼吧。下面的例子非常簡單,它包含了 Floating Action Button,點擊時會觸發一個 Snackbar

首先,在 gradle 檔案中引入 meterial design 庫:

compile ‘com.android.support:design:22.2.0‘

接下來,為 Activity 建立一個簡單的布局檔案:

  

<?xml version="1.0" encoding="utf-8"?> <android.support.design.widget.CoordinatorLayout     xmlns:android="http://schemas.android.com/apk/res/android"     android:layout_width="match_parent"     android:layout_height="match_parent">      <android.support.design.widget.FloatingActionButton         android:id="@+id/fab"         android:layout_width="wrap_content"         android:layout_height="wrap_content"         android:layout_gravity="end|bottom"         android:layout_margin="16dp"         android:src="@drawable/ic_done" />  </android.support.design.widget.CoordinatorLayout> 

  

  還需要添加 MainActivity

  

public class MainActivity extends AppCompatActivity {    @Override     protected void onCreate(Bundle savedInstanceState) {     super.onCreate(savedInstanceState);     setContentView(R.layout.activity_main);     findViewById(R.id.fab).setOnClickListener(new View.OnClickListener() {       @Override       public void onClick(View view) {         Snackbar.make(view, "Hello Snackbar", Snackbar.LENGTH_LONG).show();       }     });   } } 

  

效果顯示 

 

非常酷,是嗎?

但是,如果你想使用其它 FAB 的實現又會怎麼樣呢?因為 Support Library 中的 FAB 實現沒有菜單選項,於是,我們嘗試一下由開發人員 Base 實現的 FAB 開源庫。

compile ‘com.getbase:floatingactionbutton:1.9.1‘

  

<?xml version="1.0" encoding="utf-8"?> <android.support.design.widget.CoordinatorLayout     xmlns:android="http://schemas.android.com/apk/res/android"     xmlns:app="http://schemas.android.com/apk/res-auto"     android:layout_width="match_parent"     android:layout_height="match_parent">      <com.getbase.floatingactionbutton.FloatingActionButton         android:id="@+id/fab"         android:layout_width="wrap_content"         android:layout_height="wrap_content"         android:layout_gravity="end|bottom"         android:layout_margin="16dp"         app:fab_icon="@drawable/ic_done" />  </android.support.design.widget.CoordinatorLayout> 

  

開源庫效果顯示 

 

,在這種情況下,CoordinatorLayout 不能正常工作。這是因為 View 沒有預設的CoordinatorLayout.Behavior 的實現。現有的解決方案就是等待有人來完善它。

或者呢,我們可以為這個組件寫一個自訂的行為實現。:D

View 知道如何表現

這個架構真的非常強大,要給 view 自訂行為時,你根本不需要擷取這個 view。你還可以改變任意 view 的預設行為。

首先,需要繼承 Behavior 類:

public class FloatingActionButtonBehavior extends CoordinatorLayout.Behavior<FloatingActionButton>

為了使這個類可以填充 xml 中的內容,我們需要給它設定一個構造方法,方法有兩個參數:Context 和AttributeSet

public FloatingActionButtonBehavior(Context context, AttributeSet attrs) {}

接下來的步驟是重寫 layoutDependsOn() 方法,並且,如果我們想監聽改變,就讓方法返回 true。在例子中,我們只想監聽 Snackbar 對象的改變。

@Override public boolean layoutDependsOn(CoordinatorLayout parent, FloatingActionButton child, View dependency) {   return dependency instanceof SnackbarLayout; } 

 

現在,讓我們繼承真正行為的實現。當 CoordinatorLayout 中的 view 每次發生變化時,onDependentViewChanged 方法都會被調用。在這個方法中,我們要讀取當前 Snackbar 的狀態。當Snackbar 顯示的時候,我們想把 FAB 也移上來。要實現這樣的目的,我們需要把 FAB 的 Y 座標設定為Snackbar 的高度。要得到正確的轉換值,我們需要從轉化的 Y 值中減去 Snackbar 的高度。

@Override public boolean onDependentViewChanged(CoordinatorLayout parent, FloatingActionButton child, View dependency) {   float translationY = Math.min(0, dependency.getTranslationY() - dependency.getHeight());   child.setTranslationY(translationY);   return true; } 

  

最後一步就是告訴 CoordinatorLayout 使用 FloatingActionButtonBeahvior

<?xml version="1.0" encoding="utf-8"?> <android.support.design.widget.CoordinatorLayout     xmlns:android="http://schemas.android.com/apk/res/android"     xmlns:app="http://schemas.android.com/apk/res-auto"     android:layout_width="match_parent"     android:layout_height="match_parent">      <com.getbase.floatingactionbutton.FloatingActionButton         android:id="@+id/fab"         android:layout_width="wrap_content"         android:layout_height="wrap_content"         android:layout_gravity="end|bottom"         android:layout_margin="16dp"         app:layout_behavior="com.getbase.coordinatorlayoutdemo.FloatingActionButtonBehavior"         app:fab_icon="@drawable/ic_done" />  </android.support.design.widget.CoordinatorLayout> 

  

最終,問題被修正了:

 

問題修正後的效果顯示 

 

如果你想為 view 定義預設行為,只需要在你的 Behavior 類上添加 DefaultBehavior 註解就可以了。

以上代碼的 GitHub 地址為:https://github.com/ggajews/coordinatorlayoutwithfabdemo 。

祝大家編碼愉快!

Android CoordinatorLayout 入門介紹

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.