1.先看效果
2.首先,我是使用ByRecyclerView,因此必须要在项目build.gradle文件中引入包
implementation 'com.github.youlookwhat:ByRecyclerView:1.0.11-support'
3.xml布局文件其实是很简单的引入控件 因为首页的滑动都是动态加载的,因此我使用了ByRecyclerView的多布局,通过在适配器中通过getItemViewType来处理不同item的效果(此处就不多说,后续会有专门的文章来讲这个) 因此:
a.顶部的搜索栏,默认的是在ByRecyclerView适配器中的position=0的item项中 而滑动显示的顶部搜索栏,是在activity中的,跟ByRecyclerView是同一级
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/color_F7F4F8"
android:orientation="vertical">
<android.support.v4.widget.SwipeRefreshLayout
android:id="@+id/mSwipeLayout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.example.jingbin.zkfudou.view.LoadingLayout
android:id="@+id/loading"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:overScrollMode="never">
<me.jingbin.library.ByRecyclerView
android:id="@+id/recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:overScrollMode="never" />
<!-- </LinearLayout>-->
<!-- </com.example.jingbin.zkfudou.view.MyScrollView>-->
</com.example.jingbin.zkfudou.view.LoadingLayout>
</android.support.v4.widget.SwipeRefreshLayout>
<RelativeLayout
android:id="@+id/search"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:background="@color/colorWhite"
android:paddingLeft="15dp"
android:paddingTop="30dp"
android:visibility="invisible"
android:paddingBottom="10dp"
android:paddingRight="20dp">
<RelativeLayout
android:id="@+id/ll_search"
android:layout_width="match_parent"
android:layout_height="27dp"
android:layout_alignParentTop="true"
android:layout_marginRight="15dp"
android:layout_toLeftOf="@+id/iv_msg"
android:background="@drawable/search_bg_2"
android:orientation="horizontal">
<ImageView
android:id="@+id/iv_search"
android:layout_width="15dp"
android:layout_height="15dp"
android:layout_centerVertical="true"
android:layout_marginLeft="10dp"
android:src="@mipmap/search_bar_1" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginLeft="5dp"
android:layout_toRightOf="@+id/iv_search"
android:text="想找点什么?"
android:textColor="@color/color_999999"
android:textSize="13sp" />
</RelativeLayout>
<ImageView
android:id="@+id/iv_msg"
android:layout_width="21dp"
android:layout_height="21dp"
android:layout_alignParentTop="true"
android:layout_alignParentRight="true"
android:layout_marginTop="4.5dp"
android:src="@mipmap/iv_msg_1" />
</RelativeLayout>
<!-- </LinearLayout>-->
<!-- </android.support.v4.widget.NestedScrollView>-->
</RelativeLayout>
</layout>
4.设置ByRecyclerView的滑动监听事件
通过监听滑动状态,来动态控制外层顶部布局的显示和隐藏,以及动画效果
注意:
a.外层定义 int[] dyFlush = {0};的作用:为了解决recyclerView再往上的时候,顶部布局没有隐藏
b.dyFlush原理:当滑动到第一项时,记录recyclerView滑动的高度总和
int[] dyFlush = {0};
private void setTopView() {
bindingView.recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView t, int dx, int dy) {
//找到即将移出屏幕Item的position,position是移出屏幕item的数量
int position = manager.findFirstVisibleItemPosition();
//根据position找到这个Item
View firstVisiableChildView = manager.findViewByPosition(position);
//获取Item的高
int itemHeight = firstVisiableChildView.getHeight();
//算出该Item还未移出屏幕的高度
int itemTop = firstVisiableChildView.getTop();
//position移出屏幕的数量*高度得出移动的距离
int iposition = position * itemHeight;
// //减去该Item还未移出屏幕的部分可得出滑动的距离
// iResult = iposition - itemTop;
dyFlush[0] += dy;
if (position == 0){
// if (dyFlush[0]> 0) {
iposition = dyFlush[0];
// }else {
// iposition += dyFlush[0];
// }
}else {
// iposition += dyFlush[0];
}
Log.d("TeshLog","position:"+position);
Log.d("TeshLog","dy:"+dy);
Log.d("TeshLog","dyFlush[0]:"+dyFlush[0]);
Log.d("TeshLog","itemHeight:"+itemHeight);
Log.d("TeshLog","iposition:"+iposition);
int height = bindingView.search.getHeight();
Log.d("TeshLog","height:"+height);
Log.d("TeshLog","----------------------------------------------");
if (iposition <= 0) {
bindingView.search.setVisibility(View.GONE);
bindingView.search.setBackgroundColor(Color.argb((int) 0, 227, 29, 26));//AGB由相关工具获得,或者美工提供
} else if (iposition > 0 && iposition < height) {
bindingView.search.setVisibility(View.VISIBLE);
//获取ScrollView向下滑动图片消失的比例
float scale = (float) iposition / height;
//更加这个比例,让标题颜色由浅入深
float alpha = (255 * scale);
// 只是layout背景透明
bindingView.search.setBackgroundColor(Color.argb((int) alpha, 255, 255, 255));
}else {
bindingView.search.setVisibility(View.VISIBLE);
bindingView.search.setBackgroundColor(getResources().getColor(R.color.colorWhite));
}
}
});
}
完美结束!