All Projects → wurensen → Graceviewpager

wurensen / Graceviewpager

1.支持ViewPager按需添加、删除视图,以及局部刷新; 2.修复多场景下ViewPager.PageTransformer返回的position错误,让开发者专注于动画实现; 3.修复ViewPager的width、paddingLeft、paddingRight、pageMargin动态改变导致当前page定位异常的问题; 4.提供自定义GraceViewPager,可快速实现一屏显示多Page的功能。

Programming Languages

java
68154 projects - #9 most used programming language

Labels

Projects that are alternatives of or similar to Graceviewpager

SlideView
🔖 Card RecycleViewManager, to make your interface cool.Use recyclerView to add cool effects to the view.
Stars: ✭ 16 (-95.31%)
Mutual labels:  viewpager
Wowoviewpager
Combine ViewPager and Animations to provide a simple way to create applications' guide pages.
Stars: ✭ 2,749 (+706.16%)
Mutual labels:  viewpager
Flowhelper
帮助您迅速构建顶部Tab,比如今日头条效果,热搜、搜索记录、与ViewPager/ViewPager2搭配的工具类;
Stars: ✭ 295 (-13.49%)
Mutual labels:  viewpager
react-native-viewpager-indicator
修改自react-native-scrollable-tab-view,增加了根据文字内容适配下划线长度的功能。
Stars: ✭ 52 (-84.75%)
Mutual labels:  viewpager
Reside-Menu
By applying viewpager animation you can also make AMAZING Reside Menu's
Stars: ✭ 72 (-78.89%)
Mutual labels:  viewpager
Cmpagetitleview
✍️一分钟集成类似抖音,新浪微博,腾讯视频,网易新闻,今日头条等常见的标题栏样式,api灵活易扩展,支持Cocoapods和Masonry布局,支持ChildController的完整生命周期
Stars: ✭ 270 (-20.82%)
Mutual labels:  viewpager
infinite view pager
📜Infinite View Pager widget for Flutter
Stars: ✭ 26 (-92.38%)
Mutual labels:  viewpager
Offsetanimator
Animations driven by finger movement
Stars: ✭ 317 (-7.04%)
Mutual labels:  viewpager
Inkeverticalviewpagerlive
仿映客viewPager上下滑动切换直播
Stars: ✭ 258 (-24.34%)
Mutual labels:  viewpager
Eleme Master
高仿饿了么3.0版本点餐页面
Stars: ✭ 297 (-12.9%)
Mutual labels:  viewpager
PhotoBrowse
PhotoBrowse is an Android photo browser that supports dragging off 图片浏览器,支持拉下拖动关闭
Stars: ✭ 22 (-93.55%)
Mutual labels:  viewpager
FastBanner
🔥快速轮播图,支持自定义布局和使用自有图片显示组件
Stars: ✭ 27 (-92.08%)
Mutual labels:  viewpager
Viewpagertransition
viewpager with parallax pages, together with vertical sliding (or click) and activity transition
Stars: ✭ 3,017 (+784.75%)
Mutual labels:  viewpager
ECardFlow
🍭A custom ViewPager for multiple card flow system. && A layout which provide beautiful background effects for ViewPager.
Stars: ✭ 47 (-86.22%)
Mutual labels:  viewpager
Cardslideview
一行代码实现ViewPager卡片效果,比ViewPager2更强大,底层同样是RecyclerView
Stars: ✭ 301 (-11.73%)
Mutual labels:  viewpager
ArcPageIndicator
Android Page Indicator for ViewPager with original animations. It uses an ellipse to dispose indication spots, and can draw a hand, like in old elevators.
Stars: ✭ 73 (-78.59%)
Mutual labels:  viewpager
Transformerslayout
🔥 App金刚区导航菜单,类似淘宝、QQ音乐等APP导航,方格布局横向多行滑动翻页带滚动条
Stars: ✭ 258 (-24.34%)
Mutual labels:  viewpager
Rtl Viewpager
ViewPager with RTL support 🔄
Stars: ✭ 323 (-5.28%)
Mutual labels:  viewpager
Loopingviewpager
A ViewPager and PagerAdapter combination that support auto scroll, infinite loop and page indicators.
Stars: ✭ 310 (-9.09%)
Mutual labels:  viewpager
Bannerview
横幅广告图片轮播控件
Stars: ✭ 290 (-14.96%)
Mutual labels:  viewpager

GraceViewPager

Download

背景

ViewPager在实际项目使用过程中,出现数据刷新使用姿势不正确、动画偏移、动态修改width、paddingLeft、paddingRight、pageMargin导致当前page滚动位置定位异常。于是通过源码分析,解决这些问题,并对使用场景进行了封装。

可以通过下面的文章了解ViewPager为何会出现这些问题以及对应的解决方案:

  1. ViewPager源码分析(发现刷新数据的正确使用姿势)
  2. 解决ViewPager动画异常(数据刷新、padding、pageMargin)

简介

可实现如下效果:

效果图

主要功能

  1. 支持ViewPager按需添加、删除视图,以及局部刷新;

  2. 修复多场景下ViewPager.PageTransformer返回的position错误,让开发者专注于动画实现;

  3. 修复ViewPager的width、paddingLeft、paddingRight、pageMargin动态改变导致当前page滚动位置定位异常的问题;

  4. 提供自定义的ViewPager:GraceViewPager,可快速实现一屏显示多Page的功能。

使用方式

build.gradle添加依赖:

// 确保仓库已添加jcenter()
allprojects {
    repositories {
        ...
        jcenter()
    }
}

// 添加依赖
dependencies {
	compile 'com.lancewu:graceviewpager:<version>' 
}

<version>请替换为对应的版本号。

1.直接使用GraceViewPager

推荐直接使用GraceViewPager来替代ViewPager,在布局中直接使用:

<!--注意:不要设定padding-->
<com.lancewu.graceviewpager.GraceViewPager
        android:id="@+id/vp"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/colorAccent"
        app:gvp_pageHorizontalMinMargin="50dp"
        app:gvp_pageHeightWidthRatio="2"
        app:gvp_pageVerticalMinMargin="50dp" />

自定义属性说明:

自定义属性 说明
gvp_pageHeightWidthRatio page高宽比例值:如2,代表page的 高:宽=2:1,负数和0表示不需要按照比例
gvp_pageHorizontalMinMargin page水平最小边距,指显示page与ViewPager水平方向间的最小间距;当按比例设定时,高度可能不足以容纳,此时就要缩小宽度,增加间距,即最后的padding值会大于该设定值
gvp_pageVerticalMinMargin page垂直最小边距,指显示page与ViewPager垂直方向间的最小间距; 当按比例设定时,宽度可能不足以容纳,此时就要缩小高度,增加间距,即最后的padding值会大于该设定值

继承GracePagerAdapter,声明了泛型来表示item的实体类型:

private class Adapter extends GracePagerAdapter<String> {

    Adapter(@NonNull List<String> items) {
        super(items);
    }

    @NonNull
    @Override
    protected View instantiateItemView(@NonNull ViewGroup container, String item, int position) {
        return getLayoutInflater().inflate(R.layout.page_item, container, false);
    }

    @Override
    protected void bindItemView(@NonNull View itemView, String item, int position, boolean first) {
        TextView tv = itemView.findViewById(R.id.tv);
        tv.setText(item);
    }

}

GracePagerAdapter实例设置给GraceViewPager

mViewPager.setGraceAdapter(mAdapter);

添加页面切换动画,只需要继承GracePageTransformer

private class Transformer extends GracePageTransformer {

    private static final float SCALE = 0.9f;

    Transformer(@NonNull GracePagerAdapter pagerAdapter) {
        super(pagerAdapter);
    }

    @Override
    public void transformPageWithCorrectPosition(@NonNull View page, float position) {
        if (position >= -1 && position <= 1) {
            // [-1,1],中间以及相邻的页面,一般相邻的才会用于计算动画
            float scale = SCALE + (1 - SCALE) * (1 - Math.abs(position));
            page.setScaleX(scale);
            page.setScaleY(scale);
        } else {
            // [-Infinity,-1)、(1,+Infinity],超出相邻的范围
            page.setScaleX(SCALE);
            page.setScaleY(SCALE);
        }
    }

}

然后给GraceViewPager设置动画:

mViewPager.setGracePageTransformer(false, new Transformer(mAdapter));

如果需要动态修改相关属性,也提供了对应的API:

// 动态修改比例
mViewPager.setPageHeightWidthRatio(ratio);
// 动态修改水平最小间距
mViewPager.setPageHorizontalMinMargin(horizontalMinMargin);
// 动态修改垂直最小间距
mViewPager.setPageVerticalMinMargin(verticalMinMargin);

// 修改pageMargin,请使用如下修正过滚动位置的方法
mViewPager.setGracePageMargin(pageMargin);

2.给ViewPager添加支持

如果不便于用GraceViewPager替换掉项目中已有的ViewPager,也提供对应的支持方式。

添加一屏多页支持

支持对已有的ViewPager进行一屏多页的支持,首先去除布局中的padding属性:

<!--remove all padding attrs-->
<android.support.v4.view.ViewPager
    android:id="@+id/vp"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/colorAccent" />

代码中创建一屏多页插件实例GraceMultiPagePlugin,并给ViewPager添加插件支持:

GraceMultiPagePlugin mMultiPagePlugin;
// 添加一屏多页支持
mMultiPagePlugin = new GraceMultiPagePlugin.Builder(mViewPager)
    .pageHeightWidthRatio(2f)
    .pageHorizontalMinMargin(dip2px(50))
    .pageVerticalMinMargin(dip2px(50))
    .build();
GraceViewPagerSupport.supportMultiPage(mViewPager, mMultiPagePlugin);

同时支持动态修改属性:

// 修改比例
mMultiPagePlugin.setPageHeightWidthRatio(ratio);
// 修改水平最小间距
mMultiPagePlugin.setPageHorizontalMinMargin(horizontalMinMargin);
// 修改垂直最小间距
mMultiPagePlugin.setPageVerticalMinMargin(verticalMinMargin);

添加布局变化后滚动位置修正

// 添加布局变化支持修复滚动
GraceViewPagerSupport.supportLayoutChange(mViewPager);

添加动态修改pageMargin后滚动位置修正

// 动态修改pageMargin时使用该方法
GraceViewPagerSupport.setPageMargin(mViewPager, pageMargin);

添加按需创建、销毁视图和动态刷新视图的PagerAdapter

private class Adapter extends GracePagerAdapter<String> {

    Adapter(@NonNull List<String> items) {
        super(items);
    }

    @NonNull
    @Override
    protected View instantiateItemView(@NonNull ViewGroup container, String item, int position) {
        return getLayoutInflater().inflate(R.layout.page_item, container, false);
    }

    @Override
    protected void bindItemView(@NonNull View itemView, String item, int position, boolean first) {
        TextView tv = itemView.findViewById(R.id.tv);
        tv.setText(item);
    }

}

使用修正的页面切换动画,专注于动画本身的实现

需要配合GracePagerAdapter使用:

private class Transformer extends GracePageTransformer {

    private static final float SCALE = 0.9f;

    Transformer(@NonNull GracePagerAdapter pagerAdapter) {
        super(pagerAdapter);
    }

    @Override
    public void transformPageWithCorrectPosition(@NonNull View page, float position) {
        if (position >= -1 && position <= 1) {
            // [-1,1],中间以及相邻的页面,一般相邻的才会用于计算动画
            float scale = SCALE + (1 - SCALE) * (1 - Math.abs(position));
            page.setScaleX(scale);
            page.setScaleY(scale);
        } else {
            // [-Infinity,-1)、(1,+Infinity],超出相邻的范围
            page.setScaleX(SCALE);
            page.setScaleY(SCALE);
        }
    }

}

Change Log

Change Log

License

Copyright 2018 LanceWu

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

 http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].