diff --git a/README.md b/README.md index 3fe9474..0110821 100644 --- a/README.md +++ b/README.md @@ -5,15 +5,13 @@ Infinite cycle ViewPager with two-way orientation and interactive effect. [![DevLight](https://lh4.googleusercontent.com/-9btnRFp_eVo/V5cfwZsBpMI/AAAAAAAAC4E/s4NGoezKhpAVdVofAoez1QWpzK5Na8_cQCL0B/w147-h20-no/devlight-badge.png)](http://devlight.com.ua) -[![Android Arsenal](https://img.shields.io/badge/Android%20Arsenal-NavigationTabBar-yellow.svg?style=flat)](http://android-arsenal.com/details/1/3382) + [![Android](https://img.shields.io/badge/platform-android-brightgreen.svg?style=flat&label=Platform)](https://github.com/DevLight-Mobile-Agency) [![Download](https://api.bintray.com/packages/gigamole/maven/navigationtabbar/images/download.svg) ](https://bintray.com/gigamole/maven/navigationtabbar/_latestVersion) [![Crates.io](https://img.shields.io/crates/l/rustc-serialize.svg?maxAge=2592000&label=License)](https://github.com/DevLight-Mobile-Agency/InfiniteCycleViewPager/blob/master/LICENSE.txt) [![Codacy Badge](https://api.codacy.com/project/badge/Grade/fa85dd3c9aa84d879b3e76be8462145e)](https://www.codacy.com/app/gigamole53/InfiniteCycleViewPager?utm_source=github.com&utm_medium=referral&utm_content=DevLight-Mobile-Agency/InfiniteCycleViewPager&utm_campaign=Badge_Grade) -| | | | | | | -|:-: |:-: |:-: |:-: |:-: |:-: | -![](https://lh6.googleusercontent.com/-Bf7uxUiRvfk/VvpVlkZzsVI/AAAAAAAACPA/Ysg9uuBpaL8UhsXpYPlyNJK6IJssdkMvg/w325-h552-no/hntb.gif)|![](https://lh4.googleusercontent.com/-mF70XCnMpgk/V1NnK34tnhI/AAAAAAAACkY/z0Z15Q_7gg4fMovWiEvo9agJgz7m933cQCL0B/w323-h552-no/btbntb.gif)|![](https://lh5.googleusercontent.com/-LcHHajuKNzw/Vz77El2lHsI/AAAAAAAACiQ/I0CjrMUP6R4ioH9h8nEe37LCqXmb3GJKACL0B/w317-h552-no/ntbsi.gif)|![](https://lh6.googleusercontent.com/-hMvLn-jzY3k/VzcPrGAmr4I/AAAAAAAACc0/US0yokfG23kQJEAPxFoPp-8lOUNRSPV9QCL0B/w321-h552-no/cltntb.gif)|![](https://lh4.googleusercontent.com/-k4Ac7-c2m8E/VvpVlk3ZmLI/AAAAAAAACPA/21ISoAYGZzUlvGPmIauXwfYZOKdCYIRGg/w323-h552-no/vntb.gif)|![](https://lh5.googleusercontent.com/-hmELfZQvexU/VvpVlooaPvI/AAAAAAAACPA/5HA5ic7dASwBUYqpqcfxAmfLzPPDXejqQ/w322-h552-no/ntbs.gif) +![](https://lh6.googleusercontent.com/-FATAVUtldQA/V7reKBGkq0I/AAAAAAAAC_g/PYx4RoE1TAUYtoGje5ONcUJERscxVXRmQCL0B/w402-h637-no/icvp.gif) U can check the sample app [here](https://github.com/DevLight-Mobile-Agency/InfiniteCycleViewPager/tree/master/app). @@ -63,206 +61,80 @@ Sample Parameters -For `NTB` you can set such parameters as: +For `InfiniteCycleViewPager` you can set such parameters as: - - models: + - min scale: - allows you to set `NTB` models, where you set icon and color. Can be set up only via code. + allows you to set the minimum scale of left and right bottom pages. - - behavior: + - max scale: - allows you to set bottom translation behavior. + allows you to set the maximum scale of center top page. - - view pager: + - min scale offset: - allows you to connect `NTB` with `ViewPager`. If you want your can also set `OnPageChangeListener`. + allows you to set offset from edge to minimum scaled pages. - - background color: + - center scale offset: - allows you to set background to `NTB` which automatically set with offset relative to badge gravity and corners radius. + allows you to set offset from center when two pages appears. - model selected icon: allows you to set selected icon when current model is active. - - model title: + - medium scaled: - allows you to enable title in you model. + allows you to set is scaling would be min -> max or min -> medium -> max. - - model badge: + - scroll duration: - allows you to enable badge in you model. + allows you to set snap scrolling duration. - - use custom typeface on badge: + - scroll interpolator: - allows you to handle set of custom typeface in your badge. + allows you to set snap scrolling interpolator. - - title mode: + - page transform listener: - allows you to handle mode of the model title show. Can show all or only active. - - - title size: - - allows you to set titles size. - - - scale mode: - - allows you to handle mode of the model icon and title scale. - - - tint mode: - - allows you to enable or disable icon tinting. - - - badge size: - - allows you to set badges size. - - - badge position: - - allows you to set the badge position in you model. Can be: left(25%), center(50%) and right(75%). - - - badge gravity: - - allows you to set the badge gravity in NTB. Can be top or bottom. - - - badge colors: - - allows you to set the badge bg and title colors. - - - typeface: - - allows you to set custom typeface to your title. - - - corners radius: - - allows you to set corners radius of pointer. - - - icon size fraction: + allows you to set page transform listener. - allows you to set icon size fraction relative to smaller model side. - - - animation duration: - - allows you to set animation duration. - - - inactive color: - - allows you to set inactive icon color. - - - active color: - - allows you to set active icon color. - - - tab bar listener: - - allows you to set listener which triggering on start or on end when you set model index. - - - preview colors: - - allows you to set preview colors, which generate count of models equals to count of colors. - Tips -Creation of models occurs through `Builder` pattern. - -`ModelBuilder` requires two fields: icon and color. Title, badge title and selected icon is optional. - -You can set selected icon. Resize and scale of selected icon equals to original icon. +Two-way widget need a lot of memory. -Orientation automatically detected according to `View` size. +Infinite scroll available when item count more then 2. -By default badge bg color is the active model color and badge title color is the model bg color. To reset colors just set `AUTO_COLOR` value to badge bg and title color. - -By default badge sizes and title sizes is auto fit. To reset calculation just set `AUTO_SIZE` value to badge size and title size. - -By default icon size fraction is `0.5F` (half of smaller side of `NTB` model). To reset scale fraction of icon to automatic just put in method `AUTO_SCALE` value. - -If your set `ViewPager` and enable swipe you can action down on active pointer and do like drag. +You can set vertical or horizontal infinite cycle ViewPager. Init Check out in code init: ```java -final NavigationTabBar navigationTabBar = (NavigationTabBar) findViewById(R.id.ntb); -final ArrayList models = new ArrayList<>(); -models.add( - new NavigationTabBar.Model.Builder( - getResources().getDrawable(R.drawable.ic_first), - Color.parseColor(colors[0]) - ).title("Heart") - .badgeTitle("NTB") - .build() -); -models.add( - new NavigationTabBar.Model.Builder( - getResources().getDrawable(R.drawable.ic_second), - Color.parseColor(colors[1]) - ).title("Cup") - .badgeTitle("with") - .build() -); -models.add( - new NavigationTabBar.Model.Builder( - getResources().getDrawable(R.drawable.ic_third), - Color.parseColor(colors[2]) - ).title("Diploma") - .badgeTitle("state") - .build() -); -models.add( - new NavigationTabBar.Model.Builder( - getResources().getDrawable(R.drawable.ic_fourth), - Color.parseColor(colors[3]) - ).title("Flag") - .badgeTitle("icon") - .build() -); -models.add( - new NavigationTabBar.Model.Builder( - getResources().getDrawable(R.drawable.ic_fifth), - Color.parseColor(colors[4]) - ).title("Medal") - .badgeTitle("777") - .build() -); -navigationTabBar.setModels(models); -navigationTabBar.setViewPager(viewPager, 2); - -navigationTabBar.setTitleMode(NavigationTabBar.TitleMode.ACTIVE); -navigationTabBar.setBadgeGravity(NavigationTabBar.BadgeGravity.BOTTOM); -navigationTabBar.setBadgePosition(NavigationTabBar.BadgePosition.CENTER); -navigationTabBar.setTypeface("fonts/custom_font.ttf"); -navigationTabBar.setIsBadged(true); -navigationTabBar.setIsTitled(true); -navigationTabBar.setIsTinted(true); -navigationTabBar.setIsBadgeUseTypeface(true); -navigationTabBar.setBadgeBgColor(Color.RED); -navigationTabBar.setBadgeTitleColor(Color.WHITE); -navigationTabBar.setIsSwiped(true); -navigationTabBar.setBgColor(Color.BLACK); -navigationTabBar.setBadgeSize(10); -navigationTabBar.setTitleSize(10); -navigationTabBar.setIconSizeFraction(0.5); +// final VerticalInfiniteCycleViewPager infiniteCycleViewPager = +// (VerticalInfiniteCycleViewPager) view.findViewById(R.id.vicvp); + final HorizontalInfiniteCycleViewPager infiniteCycleViewPager = + (HorizontalInfiniteCycleViewPager) view.findViewById(R.id.hicvp); + infiniteCycleViewPager.setAdapter(...); + infiniteCycleViewPager.setScrollDuration(500); + infiniteCycleViewPager.setInterpolator(...); + infiniteCycleViewPager.setMediumScaled(true); + infiniteCycleViewPager.setMaxPageScale(0.8F); + infiniteCycleViewPager.setMinPageScale(0.5F); + infiniteCycleViewPager.setCenterPageScaleOffset(30.0F); + infiniteCycleViewPager.setMinPageScaleOffset(5.0F); + infiniteCycleViewPager.setOnInfiniteCyclePageTransformListener(...); ``` -If your models is in badge mode you can set title, hide, show, toggle and update badge title like this: +If your want to get item position just call this metho: ```java -model.setTitle("Here some title to model"); -model.hideBadge(); -model.showBadge(); -model.toggleBadge(); -model.updateBadgeTitle("Here some title like NEW or some integer value"); +infiniteCycleViewPager.getRealItem(); ``` -To enable behavior translation inside `CoordinatorLayout` when at bottom of screen: -```java -navigationTabBar.setBehaviorEnabled(true); -``` - -To deselect active index and reset pointer: +To update your ViewPager after some adapter update or else, you can call this method: ```java -navigationTabBar.deselect(); +infiniteCycleViewPager.notifyDataSetChanged(); ``` Other methods check out in sample. @@ -270,51 +142,36 @@ Other methods check out in sample. And XML init: ```xml - + + + ``` Getting Help ====== -To report a specific problem or feature request, [open a new issue on Github](https://github.com/DevLight-Mobile-Agency/NavigationTabBar/issues/new). +To report a specific problem or feature request, [open a new issue on Github](https://github.com/DevLight-Mobile-Agency/InfiniteCycleViewPager/issues/new). License ====== -Apache 2.0 and MIT. See [LICENSE](https://github.com/DevLight-Mobile-Agency/NavigationTabBar/blob/master/LICENSE.txt) file for details. +Apache 2.0 and MIT. See [LICENSE](https://github.com/DevLight-Mobile-Agency/InfiniteCycleViewPager/blob/master/LICENSE.txt) file for details. Inspiration =========== -| | | | | -|:-: |:-: |:-: |:-: | -![](https://s-media-cache-ak0.pinimg.com/originals/39/ee/33/39ee330f3460bd638284f0576bc95b65.gif)|![](https://s-media-cache-ak0.pinimg.com/564x/f4/0d/a9/f40da9e5b73eb5e0e46681eba38f1347.jpg)|![](https://s-media-cache-ak0.pinimg.com/564x/14/eb/dd/14ebddfc0d92f02be3d61ede48a9da6e.jpg)|![](https://d13yacurqjgara.cloudfront.net/users/25514/screenshots/1367175/attachments/195679/Sleep-Tracker-iPhone-UI-ramotion.png) - -Thanks to [Valery Nuzhniy](https://www.pinterest.com/hevbolt/) for NTB badge design. +| | | +|:-: |:-: | +![](https://d13yacurqjgara.cloudfront.net/users/1169587/screenshots/2832006/cinema_app_gif.gif)|![](http://dbwgapw6amg93.cloudfront.net/wp-content/uploads/2016/05/personal-festival-app-beautiful-mobile-ui.jpg?097e9c) Author ======= @@ -329,7 +186,7 @@ Support If you'd like to support future development and new product features, please make a payments on Gratipay and Beerpay or become a patron on Patreon. [![Gratipay](https://img.shields.io/gratipay/user/gigamole.svg?maxAge=2592000)](https://gratipay.com/~GIGAMOLE/) -[![Beerpay](https://beerpay.io/DevLight-Mobile-Agency/NavigationTabBar/badge.svg?style=flat)](https://beerpay.io/DevLight-Mobile-Agency/NavigationTabBar) +[![Beerpay](https://beerpay.io/DevLight-Mobile-Agency/InfiniteCycleViewPager/badge.svg?style=flat)](https://beerpay.io/DevLight-Mobile-Agency/InfiniteCycleViewPager) [![Patreon](https://lh5.googleusercontent.com/-lXI_oKp5724/V58ysdDtxHI/AAAAAAAAC7s/g91W_YT2SM0Q_VaIhDAMmoe-jHPP3ijJwCL0B/w140-h20-no/patreon-badge.png)](https://www.patreon.com/gigamole) Also, if you use this library in applications that are available on Google Play, please report it to us or author. diff --git a/app/build.gradle b/app/build.gradle index 9d400de..21f76ea 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -6,7 +6,7 @@ android { defaultConfig { applicationId "com.gigamole.sample" - minSdkVersion 14 + minSdkVersion 11 targetSdkVersion 23 versionCode 1 versionName "1.0" diff --git a/app/src/main/java/com/gigamole/sample/screens/HorizontalPagerFragment.java b/app/src/main/java/com/gigamole/sample/screens/HorizontalPagerFragment.java index 066907b..75243ee 100644 --- a/app/src/main/java/com/gigamole/sample/screens/HorizontalPagerFragment.java +++ b/app/src/main/java/com/gigamole/sample/screens/HorizontalPagerFragment.java @@ -39,6 +39,7 @@ public void onViewCreated(final View view, @Nullable final Bundle savedInstanceS // horizontalInfiniteCycleViewPager.setMinPageScale(0.5F); // horizontalInfiniteCycleViewPager.setCenterPageScaleOffset(30.0F); // horizontalInfiniteCycleViewPager.setMinPageScaleOffset(5.0F); +// horizontalInfiniteCycleViewPager.setOnInfiniteCyclePageTransformListener(); // horizontalInfiniteCycleViewPager.setCurrentItem( // horizontalInfiniteCycleViewPager.getRealItem() + 1 diff --git a/app/src/main/java/com/gigamole/sample/screens/MainActivity.java b/app/src/main/java/com/gigamole/sample/screens/MainActivity.java index 8895130..2e48340 100644 --- a/app/src/main/java/com/gigamole/sample/screens/MainActivity.java +++ b/app/src/main/java/com/gigamole/sample/screens/MainActivity.java @@ -7,7 +7,6 @@ import com.gigamole.navigationtabstrip.NavigationTabStrip; import com.gigamole.sample.R; import com.gigamole.sample.adapters.MainPagerAdapter; -import com.stanko.tools.DeviceInfo; public class MainActivity extends AppCompatActivity { @@ -16,8 +15,6 @@ protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); - DeviceInfo.init(this); - final ViewPager viewPager = (ViewPager) findViewById(R.id.vp_main); viewPager.setAdapter(new MainPagerAdapter(getSupportFragmentManager())); viewPager.setOffscreenPageLimit(2); diff --git a/app/src/main/java/com/gigamole/sample/utils/TintSelectorImageView.java b/app/src/main/java/com/gigamole/sample/utils/TintSelectorImageView.java index f3babf1..30f2992 100644 --- a/app/src/main/java/com/gigamole/sample/utils/TintSelectorImageView.java +++ b/app/src/main/java/com/gigamole/sample/utils/TintSelectorImageView.java @@ -2,6 +2,7 @@ import android.content.Context; import android.graphics.Color; +import android.graphics.PorterDuff; import android.util.AttributeSet; import android.view.MotionEvent; import android.widget.ImageView; @@ -33,8 +34,8 @@ public boolean onTouchEvent(final MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: case MotionEvent.ACTION_MOVE: -// setColorFilter(TINT_SELECTOR_COLOR, PorterDuff.Mode.SRC_OVER); -// postInvalidate(); + setColorFilter(TINT_SELECTOR_COLOR, PorterDuff.Mode.SRC_OVER); + postInvalidate(); break; case MotionEvent.ACTION_UP: case MotionEvent.ACTION_CANCEL: diff --git a/infinitecycleviewpager/build.gradle b/infinitecycleviewpager/build.gradle index 385d814..0154536 100644 --- a/infinitecycleviewpager/build.gradle +++ b/infinitecycleviewpager/build.gradle @@ -26,7 +26,7 @@ android { buildToolsVersion "23.0.3" defaultConfig { - minSdkVersion 14 + minSdkVersion 11 targetSdkVersion 23 versionCode 1 versionName "1.0.0" diff --git a/infinitecycleviewpager/src/main/java/com/gigamole/infinitecycleviewpager/HorizontalInfiniteCycleViewPager.java b/infinitecycleviewpager/src/main/java/com/gigamole/infinitecycleviewpager/HorizontalInfiniteCycleViewPager.java index 9c542d4..071e9f6 100644 --- a/infinitecycleviewpager/src/main/java/com/gigamole/infinitecycleviewpager/HorizontalInfiniteCycleViewPager.java +++ b/infinitecycleviewpager/src/main/java/com/gigamole/infinitecycleviewpager/HorizontalInfiniteCycleViewPager.java @@ -90,6 +90,18 @@ public boolean isVertical() { return mInfiniteCycleManager != null && mInfiniteCycleManager.isVertical(); } + public OnInfiniteCyclePageTransformListener getOnInfiniteCyclePageTransformListener() { + return mInfiniteCycleManager == null ? + null : mInfiniteCycleManager.getOnInfiniteCyclePageTransformListener(); + } + + public void setOnInfiniteCyclePageTransformListener( + final OnInfiniteCyclePageTransformListener onInfiniteCyclePageTransformListener + ) { + if (mInfiniteCycleManager != null) + mInfiniteCycleManager.setOnInfiniteCyclePageTransformListener(onInfiniteCyclePageTransformListener); + } + @Override public void setPageTransformer(final boolean reverseDrawingOrder, final PageTransformer transformer) { super.setPageTransformer( diff --git a/infinitecycleviewpager/src/main/java/com/gigamole/infinitecycleviewpager/InfiniteCycleManager.java b/infinitecycleviewpager/src/main/java/com/gigamole/infinitecycleviewpager/InfiniteCycleManager.java index e9e331b..e22bab6 100644 --- a/infinitecycleviewpager/src/main/java/com/gigamole/infinitecycleviewpager/InfiniteCycleManager.java +++ b/infinitecycleviewpager/src/main/java/com/gigamole/infinitecycleviewpager/InfiniteCycleManager.java @@ -768,10 +768,4 @@ public float getInterpolation(final float input) { Math.sin((input - FACTOR / 4.0F) * (2.0F * Math.PI) / FACTOR) + 1.0F); } } - - public interface OnInfiniteCyclePageTransformListener { - void onPreTransform(final View page, final float position); - - void onPostTransform(final View page, final float position); - } } diff --git a/infinitecycleviewpager/src/main/java/com/gigamole/infinitecycleviewpager/OnInfiniteCyclePageTransformListener.java b/infinitecycleviewpager/src/main/java/com/gigamole/infinitecycleviewpager/OnInfiniteCyclePageTransformListener.java new file mode 100644 index 0000000..e4ebca8 --- /dev/null +++ b/infinitecycleviewpager/src/main/java/com/gigamole/infinitecycleviewpager/OnInfiniteCyclePageTransformListener.java @@ -0,0 +1,12 @@ +package com.gigamole.infinitecycleviewpager; + +import android.view.View; + +/** + * Created by GIGAMOLE on 7/27/16. + */ +public interface OnInfiniteCyclePageTransformListener { + void onPreTransform(final View page, final float position); + + void onPostTransform(final View page, final float position); +} \ No newline at end of file diff --git a/infinitecycleviewpager/src/main/java/com/gigamole/infinitecycleviewpager/VerticalInfiniteCycleViewPager.java b/infinitecycleviewpager/src/main/java/com/gigamole/infinitecycleviewpager/VerticalInfiniteCycleViewPager.java index 747fd5d..d0a772f 100644 --- a/infinitecycleviewpager/src/main/java/com/gigamole/infinitecycleviewpager/VerticalInfiniteCycleViewPager.java +++ b/infinitecycleviewpager/src/main/java/com/gigamole/infinitecycleviewpager/VerticalInfiniteCycleViewPager.java @@ -90,6 +90,18 @@ public boolean isVertical() { return mInfiniteCycleManager != null && mInfiniteCycleManager.isVertical(); } + public OnInfiniteCyclePageTransformListener getOnInfiniteCyclePageTransformListener() { + return mInfiniteCycleManager == null ? + null : mInfiniteCycleManager.getOnInfiniteCyclePageTransformListener(); + } + + public void setOnInfiniteCyclePageTransformListener( + final OnInfiniteCyclePageTransformListener onInfiniteCyclePageTransformListener + ) { + if (mInfiniteCycleManager != null) + mInfiniteCycleManager.setOnInfiniteCyclePageTransformListener(onInfiniteCyclePageTransformListener); + } + @Override public void setPageTransformer(final boolean reverseDrawingOrder, final ViewPager.PageTransformer transformer) { super.setPageTransformer( diff --git a/infinitecycleviewpager/src/main/java/com/gigamole/infinitecycleviewpager/ViewPageable.java b/infinitecycleviewpager/src/main/java/com/gigamole/infinitecycleviewpager/ViewPageable.java index 77e3fd5..179f7f3 100644 --- a/infinitecycleviewpager/src/main/java/com/gigamole/infinitecycleviewpager/ViewPageable.java +++ b/infinitecycleviewpager/src/main/java/com/gigamole/infinitecycleviewpager/ViewPageable.java @@ -6,6 +6,10 @@ import static android.support.v4.view.ViewPager.OnPageChangeListener; import static android.support.v4.view.ViewPager.PageTransformer; +/** + * Created by GIGAMOLE on 7/27/16. + */ + // Interface that duplicate methods of ViewPager for implements it in Horizontal and Vertical // InfiniteCycleViewPager for casting them to ViewPageable in InfiniteCycleManager interface ViewPageable {