CoordinatorLayout使用總結

              coordinatorlayout很強大,但是現在都是千篇一律的是配合appbarlayout等使用,確實很完美,但是也許正是太完美了,結果就是同質化嚴重,可擴展性差,所以我們應該學習用的同時學習他的思想比較好,比如說coordiantorlayout對於view的解耦做的非常好,所以我重點研究了behaviour,覺得很強大,直接把整理過程記錄下來:

           

/**
 * coordiantorlayout使用總結:
 * 1.必須作爲根部局使用,也就是說在fragment中無法使用,他其實就是一個加強版的framelayout
 * 2.app:layout_scrollFlags="scroll|enterAlways"屬性,是appbarlayout內部的屬性,是誰需要滾動消失,誰就指定,但是不能在佈局的最外層指定,否則無效
 *
 * 自定義behavior使用規則以及問題:
 * 1.behaviour規定了追隨者的追隨規則,因此誰是追隨者,誰就設置behaviour
 * 2.自定義behaviour在AS上一直顯示沒有任何地方應用,其實已經起作用了
 * 3.coordinatorLayout其實只對垂直的兩個字view進行動作協調
 * 4.coordinatorLayout如果垂直子view大於2個,那麼可以設置多個behavior,但是不會起作用,因此再次印證了只能協調垂直的兩個子view
 * 5.設置behaviour的方法有兩個,第一個是採用註解的方式設置{@link AppBarLayout},自己內部去定義behavior{@link AppBarLayout.Behavior},
 * 第二種方式就是我們自定義,然後通過xml文件進行設置
 * 6.接第四條說,如果垂直子view大於2個,例如三個四個,並且類型都一樣例如都是imageview,behaviour的泛型也是imageview或者view會怎麼樣?試驗結果是,所有的imageview都是事件源
 * 這有什麼好處呢?好處就是我們可以設定一定的規則讓追隨者可以改變追隨的人;如果三個view的類型都不同,例如有imageview,textview等,behaviour中的泛型爲其中一種,會出現什麼
 * 效果呢?根據其他博客說,coordinatorLayout會遍歷所有的子view然後找到互相依賴的view進行關聯,但是測試結果卻是,和兩個關聯者是否挨着有很大關係,可自行測試。
 * 7.app:layout_behavior使用的view在自定義behavior中,在xml文件中設置的view爲追隨者,也就是被動的view,但是在coordinatorLayout和appbarlayout配合使用中,卻相反爲主動view,不解?
 * 8.如果僅僅是有兩個view,並且運動規則一致,則完全可以使用app:layout_aucher來使用,很簡單
 *
 * 參考學習博客:
 * 1. http://www.jianshu.com/p/26439595ffef
 * 2. http://www.jianshu.com/p/a506ee4afecb
 * 3. http://www.jianshu.com/p/72d45d1f7d55
 * 4. http://blog.csdn.net/xyz_lmn/article/details/48055919
 */
public class MyBehaviour extends CoordinatorLayout.Behavior<ImageView> {
    public MyBehaviour() {
        super();
    }

    public MyBehaviour(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    /**
     * 這個方法一直都會調用,用來判斷事件源是否爲依賴的view,猜想:我們可以設置某些限制條件來更換事件源
     *
     * @param parent
     * @param child
     * @param dependency
     * @return
     */
    @Override
    public boolean layoutDependsOn(CoordinatorLayout parent, ImageView child, View dependency) {
        return dependency instanceof TextView;
    }

    /**
     * 三個參數含義說明CoordinatorLayout只能協調垂直的兩個子view,這個方法只有當事件源view的尺寸大小或者位置發生改變時調用(其他爲測試)
     *
     * @param parent     CoordinatorLayout
     * @param child      設置behaviour的view,即爲被動執行者
     * @param dependency 他爲主動者,是另一個view的依賴者,即爲事件源
     * @return
     */
    @Override
    public boolean onDependentViewChanged(CoordinatorLayout parent, ImageView child, View dependency) {
        return true;
    }


    /**
     * 如果事件源爲可滑動的並且實現了NestedScrollingChild接口的view調用纔有效果,具體有如下view:
     * HorizontalGridView
     * NestedScrollView
     * RecyclerView
     * SwipeRefreshLayout
     * VerticalGridView
     * 所以這就是爲什麼listview不可以的原因了,當然我們也可以自定義listview自己加上,具體參數含義可以使用的時候打印一下
     *
     * @param coordinatorLayout
     * @param child
     * @param target
     * @param dxConsumed
     * @param dyConsumed
     * @param dxUnconsumed
     * @param dyUnconsumed
     */
    @Override
    public void onNestedScroll(CoordinatorLayout coordinatorLayout, ImageView child, View target, int dxConsumed, int dyConsumed, int dxUnconsumed, int dyUnconsumed) {
        super.onNestedScroll(coordinatorLayout, child, target, dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed);
    }
}
佈局很簡單:

   <android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/activity_text"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ImageView
        android:id="@+id/testImg"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:layout_gravity="bottom"
        android:scaleType="fitXY"
        android:src="@drawable/pic3"
        app:layout_behavior="com.hawk.android.camera.coordinatorlayoutdemo2.MyBehaviour" />

    <TextView
        android:id="@+id/child1"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:layout_gravity="center"
        android:background="@color/colorPrimaryDark" />
</android.support.design.widget.CoordinatorLayout>

裏面有兩個不解的地方,歡迎解釋,謝謝


補充:最近又翻開看了看這個控件,覺得確實很強大,不過仔細想想又存在問題,那就是屏幕適配問題,如何解決屏幕適配呢?後來雖然解決了,不過還是暫時放棄學習這個控件了,記錄一下這次的學習資料:

ConstraintLayout學習網站記錄:
1.http://blog.csdn.net/sinat_34383316/article/details/70674399?locationNum=9&fps=1
2.http://m.blog.csdn.net/qq_33689414/article/details/75103731
3.http://blog.csdn.net/u013706904/article/details/52957946
4.http://blog.chengyunfeng.com/?p=1030
5.https://mp.weixin.qq.com/s/kFPDThFZo7ZGOBLUv22myQ
6.http://www.jianshu.com/p/792d2682c538
7.http://blog.csdn.net/lmj623565791/article/details/78011599
8.http://blog.csdn.net/guolin_blog/article/details/53122387
9.https://mp.weixin.qq.com/s/gGR2itbY7hh9fo61SxaMQQ


ConstraintLayout其實就是加強版的相對佈局,設計的初衷就是爲了解決佈局的深層嵌套導致的頁面渲染性能下降問題,但是我們現在已經做好了屏幕的適配,完全可以使用絕對
佈局的方式來減少佈局的嵌套,所以暫時忽略掉這個控件的學習

發佈了62 篇原創文章 · 獲贊 28 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章