最近有群友提出一些效果瑟曲,這里做些簡單介紹:頂部topbar 底部幾個tab 中間recyclerview,好了豪治,recyclerview上滑topbar和tab隱藏洞拨,下滑topbar和tab顯示,說到這负拟,相信不少讀者們已經(jīng)想到了方法烦衣,那就是監(jiān)聽recyclerview,根據(jù)滑動的距離或者趨勢去顯示隱藏自己的view,這當(dāng)然是個辦法花吟,而且實現(xiàn)起來也很快启泣,但是這里呢,為了讓大家能去學(xué)習(xí)更多新的知識示辈,與時俱進嘛,所以介紹了5.0以上的Material風(fēng)格遣蚀,具體怎么做矾麻,下面細細道來:
step1:添加compile依賴
compile 'com.android.support:design:25.3.1'
step2:布局
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.zlx.zlxbasecv.MainActivity">
<include layout="@layout/appbar_main"/>
<include layout="@layout/content_main" />
<include layout="@layout/footer_main"/>
</android.support.design.widget.CoordinatorLayout>
<include layout="@layout/appbar_main"/> 布局:
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.AppBarLayout
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="wrap_content"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
android:background="?attr/colorPrimary"
app:layout_scrollFlags="scroll|enterAlways"/>
</android.support.design.widget.AppBarLayout>
<include layout="@layout/content_main" /> 布局:
<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.NestedScrollView
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"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:onClick="CoorClick"
android:text="你是誰?你從哪里來芭梯?你到哪里去险耀?"/>
</android.support.v4.widget.NestedScrollView>
<include layout="@layout/footer_main"/>布局:
此布局中,大家可以看到父布局有個自定義的behavior:app:layout_behavior="com.example.zlx.zlxbasecv.custom_view.cus_behavior.FooterBehavior" 在下面會提供
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="60dp"
android:layout_gravity="bottom"
app:layout_behavior="com.example.zlx.zlxbasecv.custom_view.cus_behavior.FooterBehavior"
android:background="?attr/colorPrimary">
<TextView
android:layout_width="0dp"
android:layout_height="match_parent"
android:text="Tab1"
android:layout_weight="1"
android:gravity="center"
android:textColor="@android:color/white"/>
<TextView
android:layout_width="0dp"
android:layout_height="match_parent"
android:text="Tab2"
android:layout_weight="1"
android:gravity="center"
android:textColor="@android:color/white"/>
<TextView
android:layout_width="0dp"
android:layout_height="match_parent"
android:text="Tab3"
android:layout_weight="1"
android:gravity="center"
android:textColor="@android:color/white"/>
</LinearLayout>
布局都寫完了玖喘,接下來介紹下自定義behavior:新建個FooterBehavior 繼承 CoordinatorLayout.Behavior甩牺,重寫里面的幾個方法:
情況一:屬性的綁定
- layoutDependsOn:根據(jù)返回的布爾值判斷兩個view是否形成綁定關(guān)系。
- onDependentViewChanged:完成兩件事
根據(jù)View dependency的狀態(tài)改變V child的狀態(tài)
返回true累奈,表示已經(jīng)改變V child的狀態(tài)贬派。這個返回值給誰用?
情況二:滾動的綁定
onStartNestedScroll澎媒,返回true表示子類可以觸發(fā)nested scroll搞乏。其中參數(shù)int nestedScrollAxes表示當(dāng)前滾動方向。例如戒努,return (nestedScrollAxes & ViewCompat.SCROLL_AXIS_VERTICAL) != 0;表示滾動方向是垂直的才觸發(fā)nest scroll请敦。
onNestedPreScroll,onStartNestedScroll返回true會觸發(fā)這個函數(shù)储玫。這個函數(shù)的參數(shù)是坐標(biāo)相關(guān)的侍筛,可以根據(jù)滑動距離寫其他View的響應(yīng)邏輯。
public class FooterBehavior extends CoordinatorLayout.Behavior<View>{
public FooterBehavior(Context context, AttributeSet attributeSet){
super(context,attributeSet);
}
/**
* 依賴條件撒穷,true表示綁定關(guān)系成立
* @param parent
* @param child
* @param dependency
* @return
*/
@Override
public boolean layoutDependsOn(CoordinatorLayout parent, View child, View dependency) {
return dependency instanceof AppBarLayout;
}
/**
* 屬性依賴邏輯匣椰,返回true表示要執(zhí)行
* @param parent
* @param child
* @param dependency
* @return
*/
@Override
public boolean onDependentViewChanged(CoordinatorLayout parent, View child, View dependency) {
float scaleY = Math.abs(dependency.getY()) / dependency.getHeight();
child.setTranslationY(child.getHeight() * scaleY);
return true;
}
}