###具有共同头部的 ViewPager,支持与ListView,GridView,ScrollView,WebView,RecyclerView 嵌套使用。具有连续的滑动事件 和 滑动监听, 支持下拉刷新。
该项目参考了:https://github.com/cpoopc/ScrollableLayout 喜欢原作的可以去使用。相比原项目,代码更简单易懂,扩展性更高,欢迎大家下载体验本项目,如果使用过程中遇到什么问题,欢迎反馈。
该项目和我github上其他的view相关的项目已经一起打包上传到jCenter仓库中(源码地址 https://github.com/jeasonlzy0216/ViewCore ),使用的时候可以直接使用compile依赖,用法如下 ###该项目中使用到的大部分自定义控件,均来源于上述仓库
compile 'com.lzy.widget:view-core:0.2.1'
或者使用
compile project(':header_viewpager')
把自定义控件 HeaderViewPagerLayout 的 dispatchTouchEvent 方法进行重写,根据手势方向决定是否分发事件,同时使用 Scroller 滚动内部视图,达到滑动的连续性。 具体详细代码,实例代码中会有详细注释。
- 自定义控件
HeaderViewPagerLayout作为根布局 - 无论控件具有多少个子
View,只有第一个子View会被自定义控件按头部解析,所以,如果头部有多个View,可以使用ViewGroup包裹,例如下面实例使用的是LinearLayout包裹(头部是一个ViewPager和Indicator指示器),除了第一个View会被滑出去外,其余布局均不会被滑出。 - 如果滑动时,想让布局滑动到一定距离后停止么可以在xml布局中加入自定义属性
app:hvp_topOffset="50dp",值的大小表示距离顶部多少距离停止滑动 - 在头部滑动的过程中,可以使用
setOnScrollListener设置滑动监听,动态改变头部据或者其他布局的动画
###例如布局中做如下布局:
<?xml version="1.0" encoding="utf-8"?> <FrameLayout 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.lzy.widget.HeaderViewPager android:id="@+id/scrollableLayout" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" app:hvp_topOffset="50dp"> <RelativeLayout android:layout_width="match_parent" android:layout_height="200dp"> <com.lzy.widget.loop.LoopViewPager android:id="@+id/pagerHeader" android:layout_width="match_parent" android:layout_height="match_parent" app:lvp_delayTime="2000" app:lvp_isAutoLoop="true"/> <com.lzy.widget.tab.CircleIndicator android:id="@+id/ci" android:layout_width="match_parent" android:layout_height="20dp" android:layout_alignParentBottom="true" android:background="#4000" app:ci_normalRadiusColor="#FFF" app:ci_selectedRadiusColor="#FFF"/> </RelativeLayout> <com.lzy.widget.tab.PagerSlidingTabStrip android:id="@+id/tabs" android:layout_width="match_parent" android:layout_height="40dp" android:background="@mipmap/bg_menu_normal" android:textSize="16sp" app:pstsDividerColor="#00000000" app:pstsIndicatorColor="#2DA4F0" app:pstsIndicatorHeight="2dp" app:pstsShouldExpand="false" app:pstsTextAllCaps="false" app:pstsUnderlineHeight="2dp"/> <android.support.v4.view.ViewPager android:id="@+id/viewPager" android:layout_width="match_parent" android:layout_height="match_parent"/> </com.lzy.widget.HeaderViewPager> <include android:id="@+id/titleBar" layout="@layout/include_titlebar"/> </FrameLayout>
scrollableLayout.setCurrentScrollableContainer(fragments.get(0)); viewPager.addOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { @Override public void onPageSelected(int position) { scrollableLayout.setCurrentScrollableContainer(fragments.get(position)); } });
3.如果需要对滑动过程进行监听,可以使用如下代码,currentY 表示当前滑过的距离,maxY表示当前可以滑动的最大距离,有了这两个参数,就可以对任意布局,做任何动画了。例如如下代码就是实现 视差动画效果的代码。
scrollableLayout.setOnScrollListener(new HeaderViewPagerLayout.OnScrollListener() {
@Override
public void onScroll(int currentY, int maxY) {
image.setTranslationY(currentY / 2);
}
});