• Stars
    star
    767
  • Rank 58,972 (Top 2 %)
  • Language
    Java
  • Created over 8 years ago
  • Updated over 7 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

具有共同头部的 ViewPager,支持与ListView,GridView,ScrollView,WebView,RecyclerView 嵌套使用。具有连续的滑动事件 和 滑动监听, 支持下拉刷新。

HeaderViewPager

###具有共同头部的 ViewPager,支持与ListView,GridView,ScrollView,WebView,RecyclerView 嵌套使用。具有连续的滑动事件 和 滑动监听, 支持下拉刷新。

该项目参考了:https://github.com/cpoopc/ScrollableLayout 喜欢原作的可以去使用。相比原项目,代码更简单易懂,扩展性更高,欢迎大家下载体验本项目,如果使用过程中遇到什么问题,欢迎反馈。

演示

image image image

1.用法

该项目和我github上其他的view相关的项目已经一起打包上传到jCenter仓库中(源码地址 https://github.com/jeasonlzy0216/ViewCore ),使用的时候可以直接使用compile依赖,用法如下 ###该项目中使用到的大部分自定义控件,均来源于上述仓库

	compile 'com.lzy.widget:view-core:0.2.1'

或者使用

    compile project(':header_viewpager')

2.实现原理

把自定义控件 HeaderViewPagerLayoutdispatchTouchEvent 方法进行重写,根据手势方向决定是否分发事件,同时使用 Scroller 滚动内部视图,达到滑动的连续性。 具体详细代码,实例代码中会有详细注释。

3.代码参考

1.布局解析

  • 自定义控件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>

2.对于自定义控件,需要做如下初始化

	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);
        }
    });

More Repositories

1

okhttp-OkGo

OkGo - 3.0 震撼来袭,该库是基于 Http 协议,封装了 OkHttp 的网络请求框架,比 Retrofit 更简单易用,支持 RxJava,RxJava2,支持自定义缓存,支持批量断点下载管理和批量上传管理功能
Java
10,586
star
2

ImagePicker

完全仿微信的图片选择,并且提供了多种图片加载接口,选择图片后可以旋转,可以裁剪成矩形或圆形,可以配置各种其他的参数
Java
4,289
star
3

NineGridView

类似QQ空间,微信朋友圈,微博主页等,展示图片的九宫格控件,自动根据图片的数量确定图片大小和控件大小,使用Adapter模式设置图片,对外提供接口回调,使用接口加载图片,支持任意的图片加载框架,如 Glide,ImageLoader,Fresco,xUtils3,Picasso 等,支持点击图片全屏预览大图。
Java
2,463
star
4

VerticalSlideView

类似淘宝的商品详情页,继续拖动查看详情,其中拖动增加了阻尼,并且重写了ListView,GridView,ScrollView,WebView,RecyclerView 的 dispatchTouchEvent 方法,使用的时候无须额外的代码,可以任意嵌套使用。
Java
710
star
5

PullZoomView

类似QQ空间,新浪微博个人主页下拉头部放大的布局效果,支持ListView,GridView,ScrollView,WebView,RecyclerView,以及其他的任意View和ViewGroup。支持头部视差动画,阻尼下拉放大,滑动过程监听。
Java
591
star
6

AlphaIndicatorView

仿微信底部tab标签,滑动的时候颜色渐变,使用极其简单,只需要两行代码。
Java
377
star
7

ViewCore

主要是常用自定义控件的类库,该项目已经上传到 jCenter 仓库,可以直接使用
Java
200
star
8

OverScrollDecor

类似IOS的over-scrolling效果,即对于滑动到顶部的View继续滑动时会超出,松手后自动还原到原始位置。支持ListView,GridView,ScrollView,WebView,RecyclerView,以及其他的任意View和ViewGroup。
Java
129
star
9

HexagonView

六边形带圆角的自定义View,支持图文混排,点击区域,水平垂直方向切换,圆角大小等各种属性
Java
46
star
10

Screenshots

2
star
11

YaoBi

Java
1
star