Repository files navigation

MaterialViewPager

Build StatusAndroid ArsenalJoin the chat at https://gitter.im/florent37/MaterialViewPager

Material Design ViewPager easy to use library

Build screen

#Sample

You can find a sample APK : Link

And have a look on a sample Youtube Video : Youtube Link

Video

#Download

In your root build.gradle add

repositories {
maven {
url "http://dl.bintray.com/florent37/maven"
}
}

In your module Download

compile ('com.github.florent37:materialviewpager:1.0.1@aar'){
transitive =true
}

#Usage

Add MaterialViewPager to your activity's layout

<com.github.florent37.materialviewpager.MaterialViewPager
android:id="@+id/materialViewPager"android:layout_width="match_parent"android:layout_height="match_parent"app:viewpager_logo="@layout/header_logo"app:viewpager_logoMarginTop="100dp"app:viewpager_color="@color/colorPrimary"app:viewpager_headerHeight="200dp"app:viewpager_headerAlpha="1.0"app:viewpager_hideLogoWithFade="true"app:viewpager_hideToolbarAndTitle="true"app:viewpager_enableToolbarElevation="true"
/>

You will see on Android Studio Preview :

alt preview

Retrieve the MaterialViewPager

You can use MaterialViewPager as an usual Android View, and get it by findViewById

publicclassMainActivityextendsActionBarActivity {
privateMaterialViewPagermViewPager;
@OverrideprotectedvoidonCreate(BundlesavedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mViewPager = (MaterialViewPager) findViewById(R.id.materialViewPager);
}
}

#Customisation

First choose your color and height

<com.github.florent37.materialviewpager.MaterialViewPager
android:id="@+id/materialViewPager"android:layout_width="match_parent"android:layout_height="match_parent"
...
app:viewpager_color="@color/colorPrimary"app:viewpager_headerHeight="200dp"
...
/>

##Set your logo

<com.github.florent37.materialviewpager.MaterialViewPager
...
app:viewpager_logo="@layout/header_logo" <-- look custom logo layout
app:viewpager_logoMarginTop="100dp" <-- look at the preview
...
/>

###Titlebar Logo

Video

Your logo's layout must

  • layout_height="@dimen/materialviewpager_logoHeight"

header_logo.xml

<ImageViewxmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/logo_white"android:layout_width="200dp"android:layout_height="@dimen/materialviewpager_logoHeight"android:fitsSystemWindows="true"android:adjustViewBounds="true"android:layout_centerHorizontal="true"android:src="@drawable/logo_white" />
<com.github.florent37.materialviewpager.MaterialViewPager`
...
app:viewpager_hideLogoWithFade="false"
...
/>

###Fading Logo

Video

header_logo.xml

<FrameLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="80dp"android:layout_height="80dp"android:layout_centerHorizontal="true"android:background="@drawable/circle">
<ImageViewandroid:layout_width="30dp"android:layout_height="30dp"android:fitsSystemWindows="true"android:adjustViewBounds="true"android:layout_gravity="center"android:src="@drawable/flying" />
</FrameLayout>
<com.github.florent37.materialviewpager.MaterialViewPager`
...
app:viewpager_hideLogoWithFade="true"
...
/>

##Toolbar Animation

##Hide Logo and Toolbar

Video

<com.github.florent37.materialviewpager.MaterialViewPager`
...
app:hideToolbarAndTitle="true"
...
/>

###Sticky Toolbar

Video

<com.github.florent37.materialviewpager.MaterialViewPager`
...
app:hideToolbarAndTitle="false"
...
/>

##Custom Tab Bar

You can set you own tab bar, by default I provided 2 implementations

###Standard

Video

<com.github.florent37.materialviewpager.MaterialViewPager`
...
app:viewpager_pagerTitleStrip="@layout/material_view_pager_pagertitlestrip_standard"
...
/>

###News Stand

Video

<com.github.florent37.materialviewpager.MaterialViewPager`
...
app:viewpager_pagerTitleStrip="@layout/material_view_pager_pagertitlestrip_newstand"
...
/>

###Or create your own tab bar

Create your own layout using a PagerSlidingTabStrip

my_tabs.xml

<com.astuetz.PagerSlidingTabStrip
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"android:id="@id/materialviewpager_pagerTitleStrip"android:layout_width="match_parent"android:layout_height="match_parent"app:pstsPaddingMiddle="true"app:pstsDividerPadding="20dp"app:pstsIndicatorColor="#FFF"app:pstsIndicatorHeight="2dp"app:pstsShouldExpand="true"app:pstsTabPaddingLeftRight="10dp"app:pstsTextAllCaps="true"tools:background="#A333"
/>

Don't forget to give it id="@id/materialviewpager_pagerTitleStrip"

<com.github.florent37.materialviewpager.MaterialViewPager`
...
app:viewpager_pagerTitleStrip="@layout/my_tabs"
...
/>

#Animate Header

Video

Simply listen to the ViewPager Page Change and modify the header's color and image

//it's a sample ViewPagerAdaptermViewPager.setAdapter(newFragmentStatePagerAdapter(getSupportFragmentManager()) {
intoldPosition = -1;
@OverridepublicFragmentgetItem(intposition) {
returnRecyclerViewFragment.newInstance();
}
@OverridepublicintgetCount() {
return4;
}
@OverridepublicCharSequencegetPageTitle(intposition) {
return"Tab "+position;
}
//called when the current page has changed@OverridepublicvoidsetPrimaryItem(ViewGroupcontainer, intposition, Objectobject) {
super.setPrimaryItem(container, position, object);
//only if position changedif(position == oldPosition)
return;
oldPosition = position;
intcolor = 0;
StringimageUrl = "";
switch (position){
case0:
imageUrl = "http://cdn1.tnwcdn.com/wp-content/blogs.dir/1/files/2014/06/wallpaper_51.jpg";
color = getResources().getColor(R.color.blue);
break;
case1:
imageUrl = "https://fs01.androidpit.info/a/63/0e/android-l-wallpapers-630ea6-h900.jpg";
color = getResources().getColor(R.color.green);
break;
case2:
imageUrl = "http://www.droid-life.com/wp-content/uploads/2014/10/lollipop-wallpapers10.jpg";
color = getResources().getColor(R.color.cyan);
break;
case3:
imageUrl = "http://www.tothemobile.com/wp-content/uploads/2014/07/original.jpg";
color = getResources().getColor(R.color.red);
break;
}
finalintfadeDuration = 400;
//change header's color and imagemViewPager.setImageUrl(imageUrl,fadeDuration);
mViewPager.setColor(color,fadeDuration);
}
});

#Toolbar

Toolbartoolbar = mViewPager.getToolbar();
if (toolbar != null) {
setSupportActionBar(toolbar);
ActionBaractionBar = getSupportActionBar();
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setDisplayShowHomeEnabled(true);
actionBar.setDisplayShowTitleEnabled(true);
actionBar.setDisplayUseLogoEnabled(false);
actionBar.setHomeButtonEnabled(true);
}

#ViewPager

ViewPagerviewPager = mViewPager.getViewPager();
viewPage.setAdapter(...);
//After set an adapter to the ViewPagermViewPager.getPagerTitleStrip().setViewPager(mViewPager.getViewPager());

#Register your Scrollable

First thing, your fragment view and your scrollable must be transparent, so do not use android:backgound="..." Sample :

<android.support.v7.widget.RecyclerView
xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/recyclerView"android:layout_width="match_parent"android:layout_height="match_parent"
/>

##RecyclerView

From your fragment

mAdapter = newRecyclerViewMaterialAdapter(new ***Adapter(mList));
mRecyclerView.setAdapter(mAdapter);
MaterialViewPagerHelper.registerRecyclerView(getActivity(), mRecyclerView, null);

###ReyclerView.OnScrollListener

If you already use ReyclerView.OnScrollListener (maybe for load more, or anything else)

MaterialViewPagerHelper.registerRecyclerView(getActivity(), mRecyclerView, myRecyclerViewOnScrollListener);

So myRecyclerViewOnScrollListener will be still notified

##ScrollView

The ScrollView must be an ObservableScrollView

MaterialViewPagerHelper.registerScrollView(getActivity(), mScrollView, null);

###CallBacks If you already use ObservableScrollViewCallbacks (maybe for load more, or anything else)

MaterialViewPagerHelper.registerScrollView(getActivity(), mScrollView, myObservableScrollViewCallbacks);

So myObservableScrollViewCallbacks will be still notified

###Layout

And must include @layout/material_view_pager_placeholder as first child

<com.github.ksoichiro.android.observablescrollview.ObservableScrollView
xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"android:id="@+id/scrollView"android:layout_width="match_parent"android:layout_height="match_parent">
<LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical">
<includelayout="@layout/material_view_pager_placeholder"/>
...your content...
</LinearLayout>
</com.github.ksoichiro.android.observablescrollview.ObservableScrollView>

##[Killed for less...] WebView

The WebView must be an ObservableWebView

//must be called before loadUrl()MaterialViewPagerHelper.preLoadInjectHeader(mWebView);
//have to inject header when WebView page loadedmWebView.setWebViewClient(newWebViewClient() {
@OverridepublicvoidonPageFinished(WebViewview, Stringurl) {
MaterialViewPagerHelper.injectHeader(mWebView, true);
}
@OverridepublicbooleanshouldOverrideUrlLoading(WebViewview, Stringurl) {
view.loadUrl(url);
returntrue;
}
});
mWebView.loadUrl("http://...");
MaterialViewPagerHelper.registerWebView(getActivity(), mWebView, null);

##[Deprecated] ListView

Smoother if using RecyclerView !

The ListView must be an ObservableListView

mAdapter = newListViewMaterialAdapter(new ***Adapter(getActivity(),mList));
mListView.setAdapter(mAdapter);
MaterialViewPagerHelper.registerListView(getActivity(), mListView, null);

#TODO

  • Fix issue when scroll down & scroll up multiples time while hideToolbarAndTitle="true"
  • Header image does not load every time
  • Remove Webviews from Android SDK !!!

#Community

Looking for contributors, feel free to fork !

Tell me if you're using my library in your application, I'll share it in this README

#Dependencies

#Credits

Author: Florent Champigny

Follow me on Google+Follow me on TwitterFollow me on LinkedIn

License

Copyright 2015 florent37, Inc.
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.

About

A Material Design ViewPager easy to use library

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

MaterialViewPager

Build StatusAndroid ArsenalJoin the chat at https://gitter.im/florent37/MaterialViewPager

Material Design ViewPager easy to use library

Build screen

#Sample

You can find a sample APK : Link

And have a look on a sample Youtube Video : Youtube Link

Video

#Download

In your root build.gradle add

repositories {
maven {
url "http://dl.bintray.com/florent37/maven"
}
}

In your module Download

compile ('com.github.florent37:materialviewpager:1.0.1@aar'){
transitive =true
}

#Usage

Add MaterialViewPager to your activity's layout

<com.github.florent37.materialviewpager.MaterialViewPager
android:id="@+id/materialViewPager"android:layout_width="match_parent"android:layout_height="match_parent"app:viewpager_logo="@layout/header_logo"app:viewpager_logoMarginTop="100dp"app:viewpager_color="@color/colorPrimary"app:viewpager_headerHeight="200dp"app:viewpager_headerAlpha="1.0"app:viewpager_hideLogoWithFade="true"app:viewpager_hideToolbarAndTitle="true"app:viewpager_enableToolbarElevation="true"
/>

You will see on Android Studio Preview :

alt preview

Retrieve the MaterialViewPager

You can use MaterialViewPager as an usual Android View, and get it by findViewById

publicclassMainActivityextendsActionBarActivity {
privateMaterialViewPagermViewPager;
@OverrideprotectedvoidonCreate(BundlesavedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mViewPager = (MaterialViewPager) findViewById(R.id.materialViewPager);
}
}

#Customisation

First choose your color and height

<com.github.florent37.materialviewpager.MaterialViewPager
android:id="@+id/materialViewPager"android:layout_width="match_parent"android:layout_height="match_parent"
...
app:viewpager_color="@color/colorPrimary"app:viewpager_headerHeight="200dp"
...
/>

##Set your logo

<com.github.florent37.materialviewpager.MaterialViewPager
...
app:viewpager_logo="@layout/header_logo" <-- look custom logo layout
app:viewpager_logoMarginTop="100dp" <-- look at the preview
...
/>

###Titlebar Logo

Video

Your logo's layout must

  • layout_height="@dimen/materialviewpager_logoHeight"

header_logo.xml

<ImageViewxmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/logo_white"android:layout_width="200dp"android:layout_height="@dimen/materialviewpager_logoHeight"android:fitsSystemWindows="true"android:adjustViewBounds="true"android:layout_centerHorizontal="true"android:src="@drawable/logo_white" />
<com.github.florent37.materialviewpager.MaterialViewPager`
...
app:viewpager_hideLogoWithFade="false"
...
/>

###Fading Logo

Video

header_logo.xml

<FrameLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="80dp"android:layout_height="80dp"android:layout_centerHorizontal="true"android:background="@drawable/circle">
<ImageViewandroid:layout_width="30dp"android:layout_height="30dp"android:fitsSystemWindows="true"android:adjustViewBounds="true"android:layout_gravity="center"android:src="@drawable/flying" />
</FrameLayout>
<com.github.florent37.materialviewpager.MaterialViewPager`
...
app:viewpager_hideLogoWithFade="true"
...
/>

##Toolbar Animation

##Hide Logo and Toolbar

Video

<com.github.florent37.materialviewpager.MaterialViewPager`
...
app:hideToolbarAndTitle="true"
...
/>

###Sticky Toolbar

Video

<com.github.florent37.materialviewpager.MaterialViewPager`
...
app:hideToolbarAndTitle="false"
...
/>

##Custom Tab Bar

You can set you own tab bar, by default I provided 2 implementations

###Standard

Video

<com.github.florent37.materialviewpager.MaterialViewPager`
...
app:viewpager_pagerTitleStrip="@layout/material_view_pager_pagertitlestrip_standard"
...
/>

###News Stand

Video

<com.github.florent37.materialviewpager.MaterialViewPager`
...
app:viewpager_pagerTitleStrip="@layout/material_view_pager_pagertitlestrip_newstand"
...
/>

###Or create your own tab bar

Create your own layout using a PagerSlidingTabStrip

my_tabs.xml

<com.astuetz.PagerSlidingTabStrip
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"android:id="@id/materialviewpager_pagerTitleStrip"android:layout_width="match_parent"android:layout_height="match_parent"app:pstsPaddingMiddle="true"app:pstsDividerPadding="20dp"app:pstsIndicatorColor="#FFF"app:pstsIndicatorHeight="2dp"app:pstsShouldExpand="true"app:pstsTabPaddingLeftRight="10dp"app:pstsTextAllCaps="true"tools:background="#A333"
/>

Don't forget to give it id="@id/materialviewpager_pagerTitleStrip"

<com.github.florent37.materialviewpager.MaterialViewPager`
...
app:viewpager_pagerTitleStrip="@layout/my_tabs"
...
/>

#Animate Header

Video

Simply listen to the ViewPager Page Change and modify the header's color and image

//it's a sample ViewPagerAdaptermViewPager.setAdapter(newFragmentStatePagerAdapter(getSupportFragmentManager()) {
intoldPosition = -1;
@OverridepublicFragmentgetItem(intposition) {
returnRecyclerViewFragment.newInstance();
}
@OverridepublicintgetCount() {
return4;
}
@OverridepublicCharSequencegetPageTitle(intposition) {
return"Tab "+position;
}
//called when the current page has changed@OverridepublicvoidsetPrimaryItem(ViewGroupcontainer, intposition, Objectobject) {
super.setPrimaryItem(container, position, object);
//only if position changedif(position == oldPosition)
return;
oldPosition = position;
intcolor = 0;
StringimageUrl = "";
switch (position){
case0:
imageUrl = "http://cdn1.tnwcdn.com/wp-content/blogs.dir/1/files/2014/06/wallpaper_51.jpg";
color = getResources().getColor(R.color.blue);
break;
case1:
imageUrl = "https://fs01.androidpit.info/a/63/0e/android-l-wallpapers-630ea6-h900.jpg";
color = getResources().getColor(R.color.green);
break;
case2:
imageUrl = "http://www.droid-life.com/wp-content/uploads/2014/10/lollipop-wallpapers10.jpg";
color = getResources().getColor(R.color.cyan);
break;
case3:
imageUrl = "http://www.tothemobile.com/wp-content/uploads/2014/07/original.jpg";
color = getResources().getColor(R.color.red);
break;
}
finalintfadeDuration = 400;
//change header's color and imagemViewPager.setImageUrl(imageUrl,fadeDuration);
mViewPager.setColor(color,fadeDuration);
}
});

#Toolbar

Toolbartoolbar = mViewPager.getToolbar();
if (toolbar != null) {
setSupportActionBar(toolbar);
ActionBaractionBar = getSupportActionBar();
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setDisplayShowHomeEnabled(true);
actionBar.setDisplayShowTitleEnabled(true);
actionBar.setDisplayUseLogoEnabled(false);
actionBar.setHomeButtonEnabled(true);
}

#ViewPager

ViewPagerviewPager = mViewPager.getViewPager();
viewPage.setAdapter(...);
//After set an adapter to the ViewPagermViewPager.getPagerTitleStrip().setViewPager(mViewPager.getViewPager());

#Register your Scrollable

First thing, your fragment view and your scrollable must be transparent, so do not use android:backgound="..." Sample :

<android.support.v7.widget.RecyclerView
xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/recyclerView"android:layout_width="match_parent"android:layout_height="match_parent"
/>

##RecyclerView

From your fragment

mAdapter = newRecyclerViewMaterialAdapter(new ***Adapter(mList));
mRecyclerView.setAdapter(mAdapter);
MaterialViewPagerHelper.registerRecyclerView(getActivity(), mRecyclerView, null);

###ReyclerView.OnScrollListener

If you already use ReyclerView.OnScrollListener (maybe for load more, or anything else)

MaterialViewPagerHelper.registerRecyclerView(getActivity(), mRecyclerView, myRecyclerViewOnScrollListener);

So myRecyclerViewOnScrollListener will be still notified

##ScrollView

The ScrollView must be an ObservableScrollView

MaterialViewPagerHelper.registerScrollView(getActivity(), mScrollView, null);

###CallBacks If you already use ObservableScrollViewCallbacks (maybe for load more, or anything else)

MaterialViewPagerHelper.registerScrollView(getActivity(), mScrollView, myObservableScrollViewCallbacks);

So myObservableScrollViewCallbacks will be still notified

###Layout

And must include @layout/material_view_pager_placeholder as first child

<com.github.ksoichiro.android.observablescrollview.ObservableScrollView
xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"android:id="@+id/scrollView"android:layout_width="match_parent"android:layout_height="match_parent">
<LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical">
<includelayout="@layout/material_view_pager_placeholder"/>
...your content...
</LinearLayout>
</com.github.ksoichiro.android.observablescrollview.ObservableScrollView>

##[Killed for less...] WebView

The WebView must be an ObservableWebView

//must be called before loadUrl()MaterialViewPagerHelper.preLoadInjectHeader(mWebView);
//have to inject header when WebView page loadedmWebView.setWebViewClient(newWebViewClient() {
@OverridepublicvoidonPageFinished(WebViewview, Stringurl) {
MaterialViewPagerHelper.injectHeader(mWebView, true);
}
@OverridepublicbooleanshouldOverrideUrlLoading(WebViewview, Stringurl) {
view.loadUrl(url);
returntrue;
}
});
mWebView.loadUrl("http://...");
MaterialViewPagerHelper.registerWebView(getActivity(), mWebView, null);

##[Deprecated] ListView

Smoother if using RecyclerView !

The ListView must be an ObservableListView

mAdapter = newListViewMaterialAdapter(new ***Adapter(getActivity(),mList));
mListView.setAdapter(mAdapter);
MaterialViewPagerHelper.registerListView(getActivity(), mListView, null);

#TODO

  • Fix issue when scroll down & scroll up multiples time while hideToolbarAndTitle="true"
  • Header image does not load every time
  • Remove Webviews from Android SDK !!!

#Community

Looking for contributors, feel free to fork !

Tell me if you're using my library in your application, I'll share it in this README

#Dependencies

#Credits

Author: Florent Champigny

Follow me on Google+Follow me on TwitterFollow me on LinkedIn

License

Copyright 2015 florent37, Inc.
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.

About

A Material Design ViewPager easy to use library

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

MaterialViewPager

Build StatusAndroid ArsenalJoin the chat at https://gitter.im/florent37/MaterialViewPager

Material Design ViewPager easy to use library

Build screen

#Sample

You can find a sample APK : Link

And have a look on a sample Youtube Video : Youtube Link

Video

#Download

In your root build.gradle add

repositories {
maven {
url "http://dl.bintray.com/florent37/maven"
}
}

In your module Download

compile ('com.github.florent37:materialviewpager:1.0.1@aar'){
transitive =true
}

#Usage

Add MaterialViewPager to your activity's layout

<com.github.florent37.materialviewpager.MaterialViewPager
android:id="@+id/materialViewPager"android:layout_width="match_parent"android:layout_height="match_parent"app:viewpager_logo="@layout/header_logo"app:viewpager_logoMarginTop="100dp"app:viewpager_color="@color/colorPrimary"app:viewpager_headerHeight="200dp"app:viewpager_headerAlpha="1.0"app:viewpager_hideLogoWithFade="true"app:viewpager_hideToolbarAndTitle="true"app:viewpager_enableToolbarElevation="true"
/>

You will see on Android Studio Preview :

alt preview

Retrieve the MaterialViewPager

You can use MaterialViewPager as an usual Android View, and get it by findViewById

publicclassMainActivityextendsActionBarActivity {
privateMaterialViewPagermViewPager;
@OverrideprotectedvoidonCreate(BundlesavedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mViewPager = (MaterialViewPager) findViewById(R.id.materialViewPager);
}
}

#Customisation

First choose your color and height

<com.github.florent37.materialviewpager.MaterialViewPager
android:id="@+id/materialViewPager"android:layout_width="match_parent"android:layout_height="match_parent"
...
app:viewpager_color="@color/colorPrimary"app:viewpager_headerHeight="200dp"
...
/>

##Set your logo

<com.github.florent37.materialviewpager.MaterialViewPager
...
app:viewpager_logo="@layout/header_logo" <-- look custom logo layout
app:viewpager_logoMarginTop="100dp" <-- look at the preview
...
/>

###Titlebar Logo

Video

Your logo's layout must

  • layout_height="@dimen/materialviewpager_logoHeight"

header_logo.xml

<ImageViewxmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/logo_white"android:layout_width="200dp"android:layout_height="@dimen/materialviewpager_logoHeight"android:fitsSystemWindows="true"android:adjustViewBounds="true"android:layout_centerHorizontal="true"android:src="@drawable/logo_white" />
<com.github.florent37.materialviewpager.MaterialViewPager`
...
app:viewpager_hideLogoWithFade="false"
...
/>

###Fading Logo

Video

header_logo.xml

<FrameLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="80dp"android:layout_height="80dp"android:layout_centerHorizontal="true"android:background="@drawable/circle">
<ImageViewandroid:layout_width="30dp"android:layout_height="30dp"android:fitsSystemWindows="true"android:adjustViewBounds="true"android:layout_gravity="center"android:src="@drawable/flying" />
</FrameLayout>
<com.github.florent37.materialviewpager.MaterialViewPager`
...
app:viewpager_hideLogoWithFade="true"
...
/>

##Toolbar Animation

##Hide Logo and Toolbar

Video

<com.github.florent37.materialviewpager.MaterialViewPager`
...
app:hideToolbarAndTitle="true"
...
/>

###Sticky Toolbar

Video

<com.github.florent37.materialviewpager.MaterialViewPager`
...
app:hideToolbarAndTitle="false"
...
/>

##Custom Tab Bar

You can set you own tab bar, by default I provided 2 implementations

###Standard

Video

<com.github.florent37.materialviewpager.MaterialViewPager`
...
app:viewpager_pagerTitleStrip="@layout/material_view_pager_pagertitlestrip_standard"
...
/>

###News Stand

Video

<com.github.florent37.materialviewpager.MaterialViewPager`
...
app:viewpager_pagerTitleStrip="@layout/material_view_pager_pagertitlestrip_newstand"
...
/>

###Or create your own tab bar

Create your own layout using a PagerSlidingTabStrip

my_tabs.xml

<com.astuetz.PagerSlidingTabStrip
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"android:id="@id/materialviewpager_pagerTitleStrip"android:layout_width="match_parent"android:layout_height="match_parent"app:pstsPaddingMiddle="true"app:pstsDividerPadding="20dp"app:pstsIndicatorColor="#FFF"app:pstsIndicatorHeight="2dp"app:pstsShouldExpand="true"app:pstsTabPaddingLeftRight="10dp"app:pstsTextAllCaps="true"tools:background="#A333"
/>

Don't forget to give it id="@id/materialviewpager_pagerTitleStrip"

<com.github.florent37.materialviewpager.MaterialViewPager`
...
app:viewpager_pagerTitleStrip="@layout/my_tabs"
...
/>

#Animate Header

Video

Simply listen to the ViewPager Page Change and modify the header's color and image

//it's a sample ViewPagerAdaptermViewPager.setAdapter(newFragmentStatePagerAdapter(getSupportFragmentManager()) {
intoldPosition = -1;
@OverridepublicFragmentgetItem(intposition) {
returnRecyclerViewFragment.newInstance();
}
@OverridepublicintgetCount() {
return4;
}
@OverridepublicCharSequencegetPageTitle(intposition) {
return"Tab "+position;
}
//called when the current page has changed@OverridepublicvoidsetPrimaryItem(ViewGroupcontainer, intposition, Objectobject) {
super.setPrimaryItem(container, position, object);
//only if position changedif(position == oldPosition)
return;
oldPosition = position;
intcolor = 0;
StringimageUrl = "";
switch (position){
case0:
imageUrl = "http://cdn1.tnwcdn.com/wp-content/blogs.dir/1/files/2014/06/wallpaper_51.jpg";
color = getResources().getColor(R.color.blue);
break;
case1:
imageUrl = "https://fs01.androidpit.info/a/63/0e/android-l-wallpapers-630ea6-h900.jpg";
color = getResources().getColor(R.color.green);
break;
case2:
imageUrl = "http://www.droid-life.com/wp-content/uploads/2014/10/lollipop-wallpapers10.jpg";
color = getResources().getColor(R.color.cyan);
break;
case3:
imageUrl = "http://www.tothemobile.com/wp-content/uploads/2014/07/original.jpg";
color = getResources().getColor(R.color.red);
break;
}
finalintfadeDuration = 400;
//change header's color and imagemViewPager.setImageUrl(imageUrl,fadeDuration);
mViewPager.setColor(color,fadeDuration);
}
});

#Toolbar

Toolbartoolbar = mViewPager.getToolbar();
if (toolbar != null) {
setSupportActionBar(toolbar);
ActionBaractionBar = getSupportActionBar();
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setDisplayShowHomeEnabled(true);
actionBar.setDisplayShowTitleEnabled(true);
actionBar.setDisplayUseLogoEnabled(false);
actionBar.setHomeButtonEnabled(true);
}

#ViewPager

ViewPagerviewPager = mViewPager.getViewPager();
viewPage.setAdapter(...);
//After set an adapter to the ViewPagermViewPager.getPagerTitleStrip().setViewPager(mViewPager.getViewPager());

#Register your Scrollable

First thing, your fragment view and your scrollable must be transparent, so do not use android:backgound="..." Sample :

<android.support.v7.widget.RecyclerView
xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/recyclerView"android:layout_width="match_parent"android:layout_height="match_parent"
/>

##RecyclerView

From your fragment

mAdapter = newRecyclerViewMaterialAdapter(new ***Adapter(mList));
mRecyclerView.setAdapter(mAdapter);
MaterialViewPagerHelper.registerRecyclerView(getActivity(), mRecyclerView, null);

###ReyclerView.OnScrollListener

If you already use ReyclerView.OnScrollListener (maybe for load more, or anything else)

MaterialViewPagerHelper.registerRecyclerView(getActivity(), mRecyclerView, myRecyclerViewOnScrollListener);

So myRecyclerViewOnScrollListener will be still notified

##ScrollView

The ScrollView must be an ObservableScrollView

MaterialViewPagerHelper.registerScrollView(getActivity(), mScrollView, null);

###CallBacks If you already use ObservableScrollViewCallbacks (maybe for load more, or anything else)

MaterialViewPagerHelper.registerScrollView(getActivity(), mScrollView, myObservableScrollViewCallbacks);

So myObservableScrollViewCallbacks will be still notified

###Layout

And must include @layout/material_view_pager_placeholder as first child

<com.github.ksoichiro.android.observablescrollview.ObservableScrollView
xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"android:id="@+id/scrollView"android:layout_width="match_parent"android:layout_height="match_parent">
<LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical">
<includelayout="@layout/material_view_pager_placeholder"/>
...your content...
</LinearLayout>
</com.github.ksoichiro.android.observablescrollview.ObservableScrollView>

##[Killed for less...] WebView

The WebView must be an ObservableWebView

//must be called before loadUrl()MaterialViewPagerHelper.preLoadInjectHeader(mWebView);
//have to inject header when WebView page loadedmWebView.setWebViewClient(newWebViewClient() {
@OverridepublicvoidonPageFinished(WebViewview, Stringurl) {
MaterialViewPagerHelper.injectHeader(mWebView, true);
}
@OverridepublicbooleanshouldOverrideUrlLoading(WebViewview, Stringurl) {
view.loadUrl(url);
returntrue;
}
});
mWebView.loadUrl("http://...");
MaterialViewPagerHelper.registerWebView(getActivity(), mWebView, null);

##[Deprecated] ListView

Smoother if using RecyclerView !

The ListView must be an ObservableListView

mAdapter = newListViewMaterialAdapter(new ***Adapter(getActivity(),mList));
mListView.setAdapter(mAdapter);
MaterialViewPagerHelper.registerListView(getActivity(), mListView, null);

#TODO

  • Fix issue when scroll down & scroll up multiples time while hideToolbarAndTitle="true"
  • Header image does not load every time
  • Remove Webviews from Android SDK !!!

#Community

Looking for contributors, feel free to fork !

Tell me if you're using my library in your application, I'll share it in this README

#Dependencies

#Credits

Author: Florent Champigny

Follow me on Google+Follow me on TwitterFollow me on LinkedIn

License

Copyright 2015 florent37, Inc.
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.

About

A Material Design ViewPager easy to use library

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

MaterialViewPager

Build StatusAndroid ArsenalJoin the chat at https://gitter.im/florent37/MaterialViewPager

Material Design ViewPager easy to use library

Build screen

#Sample

You can find a sample APK : Link

And have a look on a sample Youtube Video : Youtube Link

Video

#Download

In your root build.gradle add

repositories {
maven {
url "http://dl.bintray.com/florent37/maven"
}
}

In your module Download

compile ('com.github.florent37:materialviewpager:1.0.1@aar'){
transitive =true
}

#Usage

Add MaterialViewPager to your activity's layout

<com.github.florent37.materialviewpager.MaterialViewPager
android:id="@+id/materialViewPager"android:layout_width="match_parent"android:layout_height="match_parent"app:viewpager_logo="@layout/header_logo"app:viewpager_logoMarginTop="100dp"app:viewpager_color="@color/colorPrimary"app:viewpager_headerHeight="200dp"app:viewpager_headerAlpha="1.0"app:viewpager_hideLogoWithFade="true"app:viewpager_hideToolbarAndTitle="true"app:viewpager_enableToolbarElevation="true"
/>

You will see on Android Studio Preview :

alt preview

Retrieve the MaterialViewPager

You can use MaterialViewPager as an usual Android View, and get it by findViewById

publicclassMainActivityextendsActionBarActivity {
privateMaterialViewPagermViewPager;
@OverrideprotectedvoidonCreate(BundlesavedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mViewPager = (MaterialViewPager) findViewById(R.id.materialViewPager);
}
}

#Customisation

First choose your color and height

<com.github.florent37.materialviewpager.MaterialViewPager
android:id="@+id/materialViewPager"android:layout_width="match_parent"android:layout_height="match_parent"
...
app:viewpager_color="@color/colorPrimary"app:viewpager_headerHeight="200dp"
...
/>

##Set your logo

<com.github.florent37.materialviewpager.MaterialViewPager
...
app:viewpager_logo="@layout/header_logo" <-- look custom logo layout
app:viewpager_logoMarginTop="100dp" <-- look at the preview
...
/>

###Titlebar Logo

Video

Your logo's layout must

  • layout_height="@dimen/materialviewpager_logoHeight"

header_logo.xml

<ImageViewxmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/logo_white"android:layout_width="200dp"android:layout_height="@dimen/materialviewpager_logoHeight"android:fitsSystemWindows="true"android:adjustViewBounds="true"android:layout_centerHorizontal="true"android:src="@drawable/logo_white" />
<com.github.florent37.materialviewpager.MaterialViewPager`
...
app:viewpager_hideLogoWithFade="false"
...
/>

###Fading Logo

Video

header_logo.xml

<FrameLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="80dp"android:layout_height="80dp"android:layout_centerHorizontal="true"android:background="@drawable/circle">
<ImageViewandroid:layout_width="30dp"android:layout_height="30dp"android:fitsSystemWindows="true"android:adjustViewBounds="true"android:layout_gravity="center"android:src="@drawable/flying" />
</FrameLayout>
<com.github.florent37.materialviewpager.MaterialViewPager`
...
app:viewpager_hideLogoWithFade="true"
...
/>

##Toolbar Animation

##Hide Logo and Toolbar

Video

<com.github.florent37.materialviewpager.MaterialViewPager`
...
app:hideToolbarAndTitle="true"
...
/>

###Sticky Toolbar

Video

<com.github.florent37.materialviewpager.MaterialViewPager`
...
app:hideToolbarAndTitle="false"
...
/>

##Custom Tab Bar

You can set you own tab bar, by default I provided 2 implementations

###Standard

Video

<com.github.florent37.materialviewpager.MaterialViewPager`
...
app:viewpager_pagerTitleStrip="@layout/material_view_pager_pagertitlestrip_standard"
...
/>

###News Stand

Video

<com.github.florent37.materialviewpager.MaterialViewPager`
...
app:viewpager_pagerTitleStrip="@layout/material_view_pager_pagertitlestrip_newstand"
...
/>

###Or create your own tab bar

Create your own layout using a PagerSlidingTabStrip

my_tabs.xml

<com.astuetz.PagerSlidingTabStrip
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"android:id="@id/materialviewpager_pagerTitleStrip"android:layout_width="match_parent"android:layout_height="match_parent"app:pstsPaddingMiddle="true"app:pstsDividerPadding="20dp"app:pstsIndicatorColor="#FFF"app:pstsIndicatorHeight="2dp"app:pstsShouldExpand="true"app:pstsTabPaddingLeftRight="10dp"app:pstsTextAllCaps="true"tools:background="#A333"
/>

Don't forget to give it id="@id/materialviewpager_pagerTitleStrip"

<com.github.florent37.materialviewpager.MaterialViewPager`
...
app:viewpager_pagerTitleStrip="@layout/my_tabs"
...
/>

#Animate Header

Video

Simply listen to the ViewPager Page Change and modify the header's color and image

//it's a sample ViewPagerAdaptermViewPager.setAdapter(newFragmentStatePagerAdapter(getSupportFragmentManager()) {
intoldPosition = -1;
@OverridepublicFragmentgetItem(intposition) {
returnRecyclerViewFragment.newInstance();
}
@OverridepublicintgetCount() {
return4;
}
@OverridepublicCharSequencegetPageTitle(intposition) {
return"Tab "+position;
}
//called when the current page has changed@OverridepublicvoidsetPrimaryItem(ViewGroupcontainer, intposition, Objectobject) {
super.setPrimaryItem(container, position, object);
//only if position changedif(position == oldPosition)
return;
oldPosition = position;
intcolor = 0;
StringimageUrl = "";
switch (position){
case0:
imageUrl = "http://cdn1.tnwcdn.com/wp-content/blogs.dir/1/files/2014/06/wallpaper_51.jpg";
color = getResources().getColor(R.color.blue);
break;
case1:
imageUrl = "https://fs01.androidpit.info/a/63/0e/android-l-wallpapers-630ea6-h900.jpg";
color = getResources().getColor(R.color.green);
break;
case2:
imageUrl = "http://www.droid-life.com/wp-content/uploads/2014/10/lollipop-wallpapers10.jpg";
color = getResources().getColor(R.color.cyan);
break;
case3:
imageUrl = "http://www.tothemobile.com/wp-content/uploads/2014/07/original.jpg";
color = getResources().getColor(R.color.red);
break;
}
finalintfadeDuration = 400;
//change header's color and imagemViewPager.setImageUrl(imageUrl,fadeDuration);
mViewPager.setColor(color,fadeDuration);
}
});

#Toolbar

Toolbartoolbar = mViewPager.getToolbar();
if (toolbar != null) {
setSupportActionBar(toolbar);
ActionBaractionBar = getSupportActionBar();
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setDisplayShowHomeEnabled(true);
actionBar.setDisplayShowTitleEnabled(true);
actionBar.setDisplayUseLogoEnabled(false);
actionBar.setHomeButtonEnabled(true);
}

#ViewPager

ViewPagerviewPager = mViewPager.getViewPager();
viewPage.setAdapter(...);
//After set an adapter to the ViewPagermViewPager.getPagerTitleStrip().setViewPager(mViewPager.getViewPager());

#Register your Scrollable

First thing, your fragment view and your scrollable must be transparent, so do not use android:backgound="..." Sample :

<android.support.v7.widget.RecyclerView
xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/recyclerView"android:layout_width="match_parent"android:layout_height="match_parent"
/>

##RecyclerView

From your fragment

mAdapter = newRecyclerViewMaterialAdapter(new ***Adapter(mList));
mRecyclerView.setAdapter(mAdapter);
MaterialViewPagerHelper.registerRecyclerView(getActivity(), mRecyclerView, null);

###ReyclerView.OnScrollListener

If you already use ReyclerView.OnScrollListener (maybe for load more, or anything else)

MaterialViewPagerHelper.registerRecyclerView(getActivity(), mRecyclerView, myRecyclerViewOnScrollListener);

So myRecyclerViewOnScrollListener will be still notified

##ScrollView

The ScrollView must be an ObservableScrollView

MaterialViewPagerHelper.registerScrollView(getActivity(), mScrollView, null);

###CallBacks If you already use ObservableScrollViewCallbacks (maybe for load more, or anything else)

MaterialViewPagerHelper.registerScrollView(getActivity(), mScrollView, myObservableScrollViewCallbacks);

So myObservableScrollViewCallbacks will be still notified

###Layout

And must include @layout/material_view_pager_placeholder as first child

<com.github.ksoichiro.android.observablescrollview.ObservableScrollView
xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"android:id="@+id/scrollView"android:layout_width="match_parent"android:layout_height="match_parent">
<LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical">
<includelayout="@layout/material_view_pager_placeholder"/>
...your content...
</LinearLayout>
</com.github.ksoichiro.android.observablescrollview.ObservableScrollView>

##[Killed for less...] WebView

The WebView must be an ObservableWebView

//must be called before loadUrl()MaterialViewPagerHelper.preLoadInjectHeader(mWebView);
//have to inject header when WebView page loadedmWebView.setWebViewClient(newWebViewClient() {
@OverridepublicvoidonPageFinished(WebViewview, Stringurl) {
MaterialViewPagerHelper.injectHeader(mWebView, true);
}
@OverridepublicbooleanshouldOverrideUrlLoading(WebViewview, Stringurl) {
view.loadUrl(url);
returntrue;
}
});
mWebView.loadUrl("http://...");
MaterialViewPagerHelper.registerWebView(getActivity(), mWebView, null);

##[Deprecated] ListView

Smoother if using RecyclerView !

The ListView must be an ObservableListView

mAdapter = newListViewMaterialAdapter(new ***Adapter(getActivity(),mList));
mListView.setAdapter(mAdapter);
MaterialViewPagerHelper.registerListView(getActivity(), mListView, null);

#TODO

  • Fix issue when scroll down & scroll up multiples time while hideToolbarAndTitle="true"
  • Header image does not load every time
  • Remove Webviews from Android SDK !!!

#Community

Looking for contributors, feel free to fork !

Tell me if you're using my library in your application, I'll share it in this README

#Dependencies

#Credits

Author: Florent Champigny

Follow me on Google+Follow me on TwitterFollow me on LinkedIn

License

Copyright 2015 florent37, Inc.
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.

About

A Material Design ViewPager easy to use library

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

MaterialViewPager

Build StatusAndroid ArsenalJoin the chat at https://gitter.im/florent37/MaterialViewPager

Material Design ViewPager easy to use library

Build screen

#Sample

You can find a sample APK : Link

And have a look on a sample Youtube Video : Youtube Link

Video

#Download

In your root build.gradle add

repositories {
maven {
url "http://dl.bintray.com/florent37/maven"
}
}

In your module Download

compile ('com.github.florent37:materialviewpager:1.0.1@aar'){
transitive =true
}

#Usage

Add MaterialViewPager to your activity's layout

<com.github.florent37.materialviewpager.MaterialViewPager
android:id="@+id/materialViewPager"android:layout_width="match_parent"android:layout_height="match_parent"app:viewpager_logo="@layout/header_logo"app:viewpager_logoMarginTop="100dp"app:viewpager_color="@color/colorPrimary"app:viewpager_headerHeight="200dp"app:viewpager_headerAlpha="1.0"app:viewpager_hideLogoWithFade="true"app:viewpager_hideToolbarAndTitle="true"app:viewpager_enableToolbarElevation="true"
/>

You will see on Android Studio Preview :

alt preview

Retrieve the MaterialViewPager

You can use MaterialViewPager as an usual Android View, and get it by findViewById

publicclassMainActivityextendsActionBarActivity {
privateMaterialViewPagermViewPager;
@OverrideprotectedvoidonCreate(BundlesavedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mViewPager = (MaterialViewPager) findViewById(R.id.materialViewPager);
}
}

#Customisation

First choose your color and height

<com.github.florent37.materialviewpager.MaterialViewPager
android:id="@+id/materialViewPager"android:layout_width="match_parent"android:layout_height="match_parent"
...
app:viewpager_color="@color/colorPrimary"app:viewpager_headerHeight="200dp"
...
/>

##Set your logo

<com.github.florent37.materialviewpager.MaterialViewPager
...
app:viewpager_logo="@layout/header_logo" <-- look custom logo layout
app:viewpager_logoMarginTop="100dp" <-- look at the preview
...
/>

###Titlebar Logo

Video

Your logo's layout must

  • layout_height="@dimen/materialviewpager_logoHeight"

header_logo.xml

<ImageViewxmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/logo_white"android:layout_width="200dp"android:layout_height="@dimen/materialviewpager_logoHeight"android:fitsSystemWindows="true"android:adjustViewBounds="true"android:layout_centerHorizontal="true"android:src="@drawable/logo_white" />
<com.github.florent37.materialviewpager.MaterialViewPager`
...
app:viewpager_hideLogoWithFade="false"
...
/>

###Fading Logo

Video

header_logo.xml

<FrameLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="80dp"android:layout_height="80dp"android:layout_centerHorizontal="true"android:background="@drawable/circle">
<ImageViewandroid:layout_width="30dp"android:layout_height="30dp"android:fitsSystemWindows="true"android:adjustViewBounds="true"android:layout_gravity="center"android:src="@drawable/flying" />
</FrameLayout>
<com.github.florent37.materialviewpager.MaterialViewPager`
...
app:viewpager_hideLogoWithFade="true"
...
/>

##Toolbar Animation

##Hide Logo and Toolbar

Video

<com.github.florent37.materialviewpager.MaterialViewPager`
...
app:hideToolbarAndTitle="true"
...
/>

###Sticky Toolbar

Video

<com.github.florent37.materialviewpager.MaterialViewPager`
...
app:hideToolbarAndTitle="false"
...
/>

##Custom Tab Bar

You can set you own tab bar, by default I provided 2 implementations

###Standard

Video

<com.github.florent37.materialviewpager.MaterialViewPager`
...
app:viewpager_pagerTitleStrip="@layout/material_view_pager_pagertitlestrip_standard"
...
/>

###News Stand

Video

<com.github.florent37.materialviewpager.MaterialViewPager`
...
app:viewpager_pagerTitleStrip="@layout/material_view_pager_pagertitlestrip_newstand"
...
/>

###Or create your own tab bar

Create your own layout using a PagerSlidingTabStrip

my_tabs.xml

<com.astuetz.PagerSlidingTabStrip
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"android:id="@id/materialviewpager_pagerTitleStrip"android:layout_width="match_parent"android:layout_height="match_parent"app:pstsPaddingMiddle="true"app:pstsDividerPadding="20dp"app:pstsIndicatorColor="#FFF"app:pstsIndicatorHeight="2dp"app:pstsShouldExpand="true"app:pstsTabPaddingLeftRight="10dp"app:pstsTextAllCaps="true"tools:background="#A333"
/>

Don't forget to give it id="@id/materialviewpager_pagerTitleStrip"

<com.github.florent37.materialviewpager.MaterialViewPager`
...
app:viewpager_pagerTitleStrip="@layout/my_tabs"
...
/>

#Animate Header

Video

Simply listen to the ViewPager Page Change and modify the header's color and image

//it's a sample ViewPagerAdaptermViewPager.setAdapter(newFragmentStatePagerAdapter(getSupportFragmentManager()) {
intoldPosition = -1;
@OverridepublicFragmentgetItem(intposition) {
returnRecyclerViewFragment.newInstance();
}
@OverridepublicintgetCount() {
return4;
}
@OverridepublicCharSequencegetPageTitle(intposition) {
return"Tab "+position;
}
//called when the current page has changed@OverridepublicvoidsetPrimaryItem(ViewGroupcontainer, intposition, Objectobject) {
super.setPrimaryItem(container, position, object);
//only if position changedif(position == oldPosition)
return;
oldPosition = position;
intcolor = 0;
StringimageUrl = "";
switch (position){
case0:
imageUrl = "http://cdn1.tnwcdn.com/wp-content/blogs.dir/1/files/2014/06/wallpaper_51.jpg";
color = getResources().getColor(R.color.blue);
break;
case1:
imageUrl = "https://fs01.androidpit.info/a/63/0e/android-l-wallpapers-630ea6-h900.jpg";
color = getResources().getColor(R.color.green);
break;
case2:
imageUrl = "http://www.droid-life.com/wp-content/uploads/2014/10/lollipop-wallpapers10.jpg";
color = getResources().getColor(R.color.cyan);
break;
case3:
imageUrl = "http://www.tothemobile.com/wp-content/uploads/2014/07/original.jpg";
color = getResources().getColor(R.color.red);
break;
}
finalintfadeDuration = 400;
//change header's color and imagemViewPager.setImageUrl(imageUrl,fadeDuration);
mViewPager.setColor(color,fadeDuration);
}
});

#Toolbar

Toolbartoolbar = mViewPager.getToolbar();
if (toolbar != null) {
setSupportActionBar(toolbar);
ActionBaractionBar = getSupportActionBar();
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setDisplayShowHomeEnabled(true);
actionBar.setDisplayShowTitleEnabled(true);
actionBar.setDisplayUseLogoEnabled(false);
actionBar.setHomeButtonEnabled(true);
}

#ViewPager

ViewPagerviewPager = mViewPager.getViewPager();
viewPage.setAdapter(...);
//After set an adapter to the ViewPagermViewPager.getPagerTitleStrip().setViewPager(mViewPager.getViewPager());

#Register your Scrollable

First thing, your fragment view and your scrollable must be transparent, so do not use android:backgound="..." Sample :

<android.support.v7.widget.RecyclerView
xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/recyclerView"android:layout_width="match_parent"android:layout_height="match_parent"
/>

##RecyclerView

From your fragment

mAdapter = newRecyclerViewMaterialAdapter(new ***Adapter(mList));
mRecyclerView.setAdapter(mAdapter);
MaterialViewPagerHelper.registerRecyclerView(getActivity(), mRecyclerView, null);

###ReyclerView.OnScrollListener

If you already use ReyclerView.OnScrollListener (maybe for load more, or anything else)

MaterialViewPagerHelper.registerRecyclerView(getActivity(), mRecyclerView, myRecyclerViewOnScrollListener);

So myRecyclerViewOnScrollListener will be still notified

##ScrollView

The ScrollView must be an ObservableScrollView

MaterialViewPagerHelper.registerScrollView(getActivity(), mScrollView, null);

###CallBacks If you already use ObservableScrollViewCallbacks (maybe for load more, or anything else)

MaterialViewPagerHelper.registerScrollView(getActivity(), mScrollView, myObservableScrollViewCallbacks);

So myObservableScrollViewCallbacks will be still notified

###Layout

And must include @layout/material_view_pager_placeholder as first child

<com.github.ksoichiro.android.observablescrollview.ObservableScrollView
xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"android:id="@+id/scrollView"android:layout_width="match_parent"android:layout_height="match_parent">
<LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical">
<includelayout="@layout/material_view_pager_placeholder"/>
...your content...
</LinearLayout>
</com.github.ksoichiro.android.observablescrollview.ObservableScrollView>

##[Killed for less...] WebView

The WebView must be an ObservableWebView

//must be called before loadUrl()MaterialViewPagerHelper.preLoadInjectHeader(mWebView);
//have to inject header when WebView page loadedmWebView.setWebViewClient(newWebViewClient() {
@OverridepublicvoidonPageFinished(WebViewview, Stringurl) {
MaterialViewPagerHelper.injectHeader(mWebView, true);
}
@OverridepublicbooleanshouldOverrideUrlLoading(WebViewview, Stringurl) {
view.loadUrl(url);
returntrue;
}
});
mWebView.loadUrl("http://...");
MaterialViewPagerHelper.registerWebView(getActivity(), mWebView, null);

##[Deprecated] ListView

Smoother if using RecyclerView !

The ListView must be an ObservableListView

mAdapter = newListViewMaterialAdapter(new ***Adapter(getActivity(),mList));
mListView.setAdapter(mAdapter);
MaterialViewPagerHelper.registerListView(getActivity(), mListView, null);

#TODO

  • Fix issue when scroll down & scroll up multiples time while hideToolbarAndTitle="true"
  • Header image does not load every time
  • Remove Webviews from Android SDK !!!

#Community

Looking for contributors, feel free to fork !

Tell me if you're using my library in your application, I'll share it in this README

#Dependencies

#Credits

Author: Florent Champigny

Follow me on Google+Follow me on TwitterFollow me on LinkedIn

License

Copyright 2015 florent37, Inc.
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.

About

A Material Design ViewPager easy to use library

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

MaterialViewPager

Build StatusAndroid ArsenalJoin the chat at https://gitter.im/florent37/MaterialViewPager

Material Design ViewPager easy to use library

Build screen

#Sample

You can find a sample APK : Link

And have a look on a sample Youtube Video : Youtube Link

Video

#Download

In your root build.gradle add

repositories {
maven {
url "http://dl.bintray.com/florent37/maven"
}
}

In your module Download

compile ('com.github.florent37:materialviewpager:1.0.1@aar'){
transitive =true
}

#Usage

Add MaterialViewPager to your activity's layout

<com.github.florent37.materialviewpager.MaterialViewPager
android:id="@+id/materialViewPager"android:layout_width="match_parent"android:layout_height="match_parent"app:viewpager_logo="@layout/header_logo"app:viewpager_logoMarginTop="100dp"app:viewpager_color="@color/colorPrimary"app:viewpager_headerHeight="200dp"app:viewpager_headerAlpha="1.0"app:viewpager_hideLogoWithFade="true"app:viewpager_hideToolbarAndTitle="true"app:viewpager_enableToolbarElevation="true"
/>

You will see on Android Studio Preview :

alt preview

Retrieve the MaterialViewPager

You can use MaterialViewPager as an usual Android View, and get it by findViewById

publicclassMainActivityextendsActionBarActivity {
privateMaterialViewPagermViewPager;
@OverrideprotectedvoidonCreate(BundlesavedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mViewPager = (MaterialViewPager) findViewById(R.id.materialViewPager);
}
}

#Customisation

First choose your color and height

<com.github.florent37.materialviewpager.MaterialViewPager
android:id="@+id/materialViewPager"android:layout_width="match_parent"android:layout_height="match_parent"
...
app:viewpager_color="@color/colorPrimary"app:viewpager_headerHeight="200dp"
...
/>

##Set your logo

<com.github.florent37.materialviewpager.MaterialViewPager
...
app:viewpager_logo="@layout/header_logo" <-- look custom logo layout
app:viewpager_logoMarginTop="100dp" <-- look at the preview
...
/>

###Titlebar Logo

Video

Your logo's layout must

  • layout_height="@dimen/materialviewpager_logoHeight"

header_logo.xml

<ImageViewxmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/logo_white"android:layout_width="200dp"android:layout_height="@dimen/materialviewpager_logoHeight"android:fitsSystemWindows="true"android:adjustViewBounds="true"android:layout_centerHorizontal="true"android:src="@drawable/logo_white" />
<com.github.florent37.materialviewpager.MaterialViewPager`
...
app:viewpager_hideLogoWithFade="false"
...
/>

###Fading Logo

Video

header_logo.xml

<FrameLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="80dp"android:layout_height="80dp"android:layout_centerHorizontal="true"android:background="@drawable/circle">
<ImageViewandroid:layout_width="30dp"android:layout_height="30dp"android:fitsSystemWindows="true"android:adjustViewBounds="true"android:layout_gravity="center"android:src="@drawable/flying" />
</FrameLayout>
<com.github.florent37.materialviewpager.MaterialViewPager`
...
app:viewpager_hideLogoWithFade="true"
...
/>

##Toolbar Animation

##Hide Logo and Toolbar

Video

<com.github.florent37.materialviewpager.MaterialViewPager`
...
app:hideToolbarAndTitle="true"
...
/>

###Sticky Toolbar

Video

<com.github.florent37.materialviewpager.MaterialViewPager`
...
app:hideToolbarAndTitle="false"
...
/>

##Custom Tab Bar

You can set you own tab bar, by default I provided 2 implementations

###Standard

Video

<com.github.florent37.materialviewpager.MaterialViewPager`
...
app:viewpager_pagerTitleStrip="@layout/material_view_pager_pagertitlestrip_standard"
...
/>

###News Stand

Video

<com.github.florent37.materialviewpager.MaterialViewPager`
...
app:viewpager_pagerTitleStrip="@layout/material_view_pager_pagertitlestrip_newstand"
...
/>

###Or create your own tab bar

Create your own layout using a PagerSlidingTabStrip

my_tabs.xml

<com.astuetz.PagerSlidingTabStrip
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"android:id="@id/materialviewpager_pagerTitleStrip"android:layout_width="match_parent"android:layout_height="match_parent"app:pstsPaddingMiddle="true"app:pstsDividerPadding="20dp"app:pstsIndicatorColor="#FFF"app:pstsIndicatorHeight="2dp"app:pstsShouldExpand="true"app:pstsTabPaddingLeftRight="10dp"app:pstsTextAllCaps="true"tools:background="#A333"
/>

Don't forget to give it id="@id/materialviewpager_pagerTitleStrip"

<com.github.florent37.materialviewpager.MaterialViewPager`
...
app:viewpager_pagerTitleStrip="@layout/my_tabs"
...
/>

#Animate Header

Video

Simply listen to the ViewPager Page Change and modify the header's color and image

//it's a sample ViewPagerAdaptermViewPager.setAdapter(newFragmentStatePagerAdapter(getSupportFragmentManager()) {
intoldPosition = -1;
@OverridepublicFragmentgetItem(intposition) {
returnRecyclerViewFragment.newInstance();
}
@OverridepublicintgetCount() {
return4;
}
@OverridepublicCharSequencegetPageTitle(intposition) {
return"Tab "+position;
}
//called when the current page has changed@OverridepublicvoidsetPrimaryItem(ViewGroupcontainer, intposition, Objectobject) {
super.setPrimaryItem(container, position, object);
//only if position changedif(position == oldPosition)
return;
oldPosition = position;
intcolor = 0;
StringimageUrl = "";
switch (position){
case0:
imageUrl = "http://cdn1.tnwcdn.com/wp-content/blogs.dir/1/files/2014/06/wallpaper_51.jpg";
color = getResources().getColor(R.color.blue);
break;
case1:
imageUrl = "https://fs01.androidpit.info/a/63/0e/android-l-wallpapers-630ea6-h900.jpg";
color = getResources().getColor(R.color.green);
break;
case2:
imageUrl = "http://www.droid-life.com/wp-content/uploads/2014/10/lollipop-wallpapers10.jpg";
color = getResources().getColor(R.color.cyan);
break;
case3:
imageUrl = "http://www.tothemobile.com/wp-content/uploads/2014/07/original.jpg";
color = getResources().getColor(R.color.red);
break;
}
finalintfadeDuration = 400;
//change header's color and imagemViewPager.setImageUrl(imageUrl,fadeDuration);
mViewPager.setColor(color,fadeDuration);
}
});

#Toolbar

Toolbartoolbar = mViewPager.getToolbar();
if (toolbar != null) {
setSupportActionBar(toolbar);
ActionBaractionBar = getSupportActionBar();
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setDisplayShowHomeEnabled(true);
actionBar.setDisplayShowTitleEnabled(true);
actionBar.setDisplayUseLogoEnabled(false);
actionBar.setHomeButtonEnabled(true);
}

#ViewPager

ViewPagerviewPager = mViewPager.getViewPager();
viewPage.setAdapter(...);
//After set an adapter to the ViewPagermViewPager.getPagerTitleStrip().setViewPager(mViewPager.getViewPager());

#Register your Scrollable

First thing, your fragment view and your scrollable must be transparent, so do not use android:backgound="..." Sample :

<android.support.v7.widget.RecyclerView
xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/recyclerView"android:layout_width="match_parent"android:layout_height="match_parent"
/>

##RecyclerView

From your fragment

mAdapter = newRecyclerViewMaterialAdapter(new ***Adapter(mList));
mRecyclerView.setAdapter(mAdapter);
MaterialViewPagerHelper.registerRecyclerView(getActivity(), mRecyclerView, null);

###ReyclerView.OnScrollListener

If you already use ReyclerView.OnScrollListener (maybe for load more, or anything else)

MaterialViewPagerHelper.registerRecyclerView(getActivity(), mRecyclerView, myRecyclerViewOnScrollListener);

So myRecyclerViewOnScrollListener will be still notified

##ScrollView

The ScrollView must be an ObservableScrollView

MaterialViewPagerHelper.registerScrollView(getActivity(), mScrollView, null);

###CallBacks If you already use ObservableScrollViewCallbacks (maybe for load more, or anything else)

MaterialViewPagerHelper.registerScrollView(getActivity(), mScrollView, myObservableScrollViewCallbacks);

So myObservableScrollViewCallbacks will be still notified

###Layout

And must include @layout/material_view_pager_placeholder as first child

<com.github.ksoichiro.android.observablescrollview.ObservableScrollView
xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"android:id="@+id/scrollView"android:layout_width="match_parent"android:layout_height="match_parent">
<LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical">
<includelayout="@layout/material_view_pager_placeholder"/>
...your content...
</LinearLayout>
</com.github.ksoichiro.android.observablescrollview.ObservableScrollView>

##[Killed for less...] WebView

The WebView must be an ObservableWebView

//must be called before loadUrl()MaterialViewPagerHelper.preLoadInjectHeader(mWebView);
//have to inject header when WebView page loadedmWebView.setWebViewClient(newWebViewClient() {
@OverridepublicvoidonPageFinished(WebViewview, Stringurl) {
MaterialViewPagerHelper.injectHeader(mWebView, true);
}
@OverridepublicbooleanshouldOverrideUrlLoading(WebViewview, Stringurl) {
view.loadUrl(url);
returntrue;
}
});
mWebView.loadUrl("http://...");
MaterialViewPagerHelper.registerWebView(getActivity(), mWebView, null);

##[Deprecated] ListView

Smoother if using RecyclerView !

The ListView must be an ObservableListView

mAdapter = newListViewMaterialAdapter(new ***Adapter(getActivity(),mList));
mListView.setAdapter(mAdapter);
MaterialViewPagerHelper.registerListView(getActivity(), mListView, null);

#TODO

  • Fix issue when scroll down & scroll up multiples time while hideToolbarAndTitle="true"
  • Header image does not load every time
  • Remove Webviews from Android SDK !!!

#Community

Looking for contributors, feel free to fork !

Tell me if you're using my library in your application, I'll share it in this README

#Dependencies

#Credits

Author: Florent Champigny

Follow me on Google+Follow me on TwitterFollow me on LinkedIn

License

Copyright 2015 florent37, Inc.
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.

About

A Material Design ViewPager easy to use library

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

MaterialViewPager

Build StatusAndroid ArsenalJoin the chat at https://gitter.im/florent37/MaterialViewPager

Material Design ViewPager easy to use library

Build screen

#Sample

You can find a sample APK : Link

And have a look on a sample Youtube Video : Youtube Link

Video

#Download

In your root build.gradle add

repositories {
maven {
url "http://dl.bintray.com/florent37/maven"
}
}

In your module Download

compile ('com.github.florent37:materialviewpager:1.0.1@aar'){
transitive =true
}

#Usage

Add MaterialViewPager to your activity's layout

<com.github.florent37.materialviewpager.MaterialViewPager
android:id="@+id/materialViewPager"android:layout_width="match_parent"android:layout_height="match_parent"app:viewpager_logo="@layout/header_logo"app:viewpager_logoMarginTop="100dp"app:viewpager_color="@color/colorPrimary"app:viewpager_headerHeight="200dp"app:viewpager_headerAlpha="1.0"app:viewpager_hideLogoWithFade="true"app:viewpager_hideToolbarAndTitle="true"app:viewpager_enableToolbarElevation="true"
/>

You will see on Android Studio Preview :

alt preview

Retrieve the MaterialViewPager

You can use MaterialViewPager as an usual Android View, and get it by findViewById

publicclassMainActivityextendsActionBarActivity {
privateMaterialViewPagermViewPager;
@OverrideprotectedvoidonCreate(BundlesavedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mViewPager = (MaterialViewPager) findViewById(R.id.materialViewPager);
}
}

#Customisation

First choose your color and height

<com.github.florent37.materialviewpager.MaterialViewPager
android:id="@+id/materialViewPager"android:layout_width="match_parent"android:layout_height="match_parent"
...
app:viewpager_color="@color/colorPrimary"app:viewpager_headerHeight="200dp"
...
/>

##Set your logo

<com.github.florent37.materialviewpager.MaterialViewPager
...
app:viewpager_logo="@layout/header_logo" <-- look custom logo layout
app:viewpager_logoMarginTop="100dp" <-- look at the preview
...
/>

###Titlebar Logo

Video

Your logo's layout must

  • layout_height="@dimen/materialviewpager_logoHeight"

header_logo.xml

<ImageViewxmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/logo_white"android:layout_width="200dp"android:layout_height="@dimen/materialviewpager_logoHeight"android:fitsSystemWindows="true"android:adjustViewBounds="true"android:layout_centerHorizontal="true"android:src="@drawable/logo_white" />
<com.github.florent37.materialviewpager.MaterialViewPager`
...
app:viewpager_hideLogoWithFade="false"
...
/>

###Fading Logo

Video

header_logo.xml

<FrameLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="80dp"android:layout_height="80dp"android:layout_centerHorizontal="true"android:background="@drawable/circle">
<ImageViewandroid:layout_width="30dp"android:layout_height="30dp"android:fitsSystemWindows="true"android:adjustViewBounds="true"android:layout_gravity="center"android:src="@drawable/flying" />
</FrameLayout>
<com.github.florent37.materialviewpager.MaterialViewPager`
...
app:viewpager_hideLogoWithFade="true"
...
/>

##Toolbar Animation

##Hide Logo and Toolbar

Video

<com.github.florent37.materialviewpager.MaterialViewPager`
...
app:hideToolbarAndTitle="true"
...
/>

###Sticky Toolbar

Video

<com.github.florent37.materialviewpager.MaterialViewPager`
...
app:hideToolbarAndTitle="false"
...
/>

##Custom Tab Bar

You can set you own tab bar, by default I provided 2 implementations

###Standard

Video

<com.github.florent37.materialviewpager.MaterialViewPager`
...
app:viewpager_pagerTitleStrip="@layout/material_view_pager_pagertitlestrip_standard"
...
/>

###News Stand

Video

<com.github.florent37.materialviewpager.MaterialViewPager`
...
app:viewpager_pagerTitleStrip="@layout/material_view_pager_pagertitlestrip_newstand"
...
/>

###Or create your own tab bar

Create your own layout using a PagerSlidingTabStrip

my_tabs.xml

<com.astuetz.PagerSlidingTabStrip
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"android:id="@id/materialviewpager_pagerTitleStrip"android:layout_width="match_parent"android:layout_height="match_parent"app:pstsPaddingMiddle="true"app:pstsDividerPadding="20dp"app:pstsIndicatorColor="#FFF"app:pstsIndicatorHeight="2dp"app:pstsShouldExpand="true"app:pstsTabPaddingLeftRight="10dp"app:pstsTextAllCaps="true"tools:background="#A333"
/>

Don't forget to give it id="@id/materialviewpager_pagerTitleStrip"

<com.github.florent37.materialviewpager.MaterialViewPager`
...
app:viewpager_pagerTitleStrip="@layout/my_tabs"
...
/>

#Animate Header

Video

Simply listen to the ViewPager Page Change and modify the header's color and image

//it's a sample ViewPagerAdaptermViewPager.setAdapter(newFragmentStatePagerAdapter(getSupportFragmentManager()) {
intoldPosition = -1;
@OverridepublicFragmentgetItem(intposition) {
returnRecyclerViewFragment.newInstance();
}
@OverridepublicintgetCount() {
return4;
}
@OverridepublicCharSequencegetPageTitle(intposition) {
return"Tab "+position;
}
//called when the current page has changed@OverridepublicvoidsetPrimaryItem(ViewGroupcontainer, intposition, Objectobject) {
super.setPrimaryItem(container, position, object);
//only if position changedif(position == oldPosition)
return;
oldPosition = position;
intcolor = 0;
StringimageUrl = "";
switch (position){
case0:
imageUrl = "http://cdn1.tnwcdn.com/wp-content/blogs.dir/1/files/2014/06/wallpaper_51.jpg";
color = getResources().getColor(R.color.blue);
break;
case1:
imageUrl = "https://fs01.androidpit.info/a/63/0e/android-l-wallpapers-630ea6-h900.jpg";
color = getResources().getColor(R.color.green);
break;
case2:
imageUrl = "http://www.droid-life.com/wp-content/uploads/2014/10/lollipop-wallpapers10.jpg";
color = getResources().getColor(R.color.cyan);
break;
case3:
imageUrl = "http://www.tothemobile.com/wp-content/uploads/2014/07/original.jpg";
color = getResources().getColor(R.color.red);
break;
}
finalintfadeDuration = 400;
//change header's color and imagemViewPager.setImageUrl(imageUrl,fadeDuration);
mViewPager.setColor(color,fadeDuration);
}
});

#Toolbar

Toolbartoolbar = mViewPager.getToolbar();
if (toolbar != null) {
setSupportActionBar(toolbar);
ActionBaractionBar = getSupportActionBar();
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setDisplayShowHomeEnabled(true);
actionBar.setDisplayShowTitleEnabled(true);
actionBar.setDisplayUseLogoEnabled(false);
actionBar.setHomeButtonEnabled(true);
}

#ViewPager

ViewPagerviewPager = mViewPager.getViewPager();
viewPage.setAdapter(...);
//After set an adapter to the ViewPagermViewPager.getPagerTitleStrip().setViewPager(mViewPager.getViewPager());

#Register your Scrollable

First thing, your fragment view and your scrollable must be transparent, so do not use android:backgound="..." Sample :

<android.support.v7.widget.RecyclerView
xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/recyclerView"android:layout_width="match_parent"android:layout_height="match_parent"
/>

##RecyclerView

From your fragment

mAdapter = newRecyclerViewMaterialAdapter(new ***Adapter(mList));
mRecyclerView.setAdapter(mAdapter);
MaterialViewPagerHelper.registerRecyclerView(getActivity(), mRecyclerView, null);

###ReyclerView.OnScrollListener

If you already use ReyclerView.OnScrollListener (maybe for load more, or anything else)

MaterialViewPagerHelper.registerRecyclerView(getActivity(), mRecyclerView, myRecyclerViewOnScrollListener);

So myRecyclerViewOnScrollListener will be still notified

##ScrollView

The ScrollView must be an ObservableScrollView

MaterialViewPagerHelper.registerScrollView(getActivity(), mScrollView, null);

###CallBacks If you already use ObservableScrollViewCallbacks (maybe for load more, or anything else)

MaterialViewPagerHelper.registerScrollView(getActivity(), mScrollView, myObservableScrollViewCallbacks);

So myObservableScrollViewCallbacks will be still notified

###Layout

And must include @layout/material_view_pager_placeholder as first child

<com.github.ksoichiro.android.observablescrollview.ObservableScrollView
xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"android:id="@+id/scrollView"android:layout_width="match_parent"android:layout_height="match_parent">
<LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical">
<includelayout="@layout/material_view_pager_placeholder"/>
...your content...
</LinearLayout>
</com.github.ksoichiro.android.observablescrollview.ObservableScrollView>

##[Killed for less...] WebView

The WebView must be an ObservableWebView

//must be called before loadUrl()MaterialViewPagerHelper.preLoadInjectHeader(mWebView);
//have to inject header when WebView page loadedmWebView.setWebViewClient(newWebViewClient() {
@OverridepublicvoidonPageFinished(WebViewview, Stringurl) {
MaterialViewPagerHelper.injectHeader(mWebView, true);
}
@OverridepublicbooleanshouldOverrideUrlLoading(WebViewview, Stringurl) {
view.loadUrl(url);
returntrue;
}
});
mWebView.loadUrl("http://...");
MaterialViewPagerHelper.registerWebView(getActivity(), mWebView, null);

##[Deprecated] ListView

Smoother if using RecyclerView !

The ListView must be an ObservableListView

mAdapter = newListViewMaterialAdapter(new ***Adapter(getActivity(),mList));
mListView.setAdapter(mAdapter);
MaterialViewPagerHelper.registerListView(getActivity(), mListView, null);

#TODO

  • Fix issue when scroll down & scroll up multiples time while hideToolbarAndTitle="true"
  • Header image does not load every time
  • Remove Webviews from Android SDK !!!

#Community

Looking for contributors, feel free to fork !

Tell me if you're using my library in your application, I'll share it in this README

#Dependencies

#Credits

Author: Florent Champigny

Follow me on Google+Follow me on TwitterFollow me on LinkedIn

License

Copyright 2015 florent37, Inc.
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.

About

A Material Design ViewPager easy to use library

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

MaterialViewPager

Build StatusAndroid ArsenalJoin the chat at https://gitter.im/florent37/MaterialViewPager

Material Design ViewPager easy to use library

Build screen

#Sample

You can find a sample APK : Link

And have a look on a sample Youtube Video : Youtube Link

Video

#Download

In your root build.gradle add

repositories {
maven {
url "http://dl.bintray.com/florent37/maven"
}
}

In your module Download

compile ('com.github.florent37:materialviewpager:1.0.1@aar'){
transitive =true
}

#Usage

Add MaterialViewPager to your activity's layout

<com.github.florent37.materialviewpager.MaterialViewPager
android:id="@+id/materialViewPager"android:layout_width="match_parent"android:layout_height="match_parent"app:viewpager_logo="@layout/header_logo"app:viewpager_logoMarginTop="100dp"app:viewpager_color="@color/colorPrimary"app:viewpager_headerHeight="200dp"app:viewpager_headerAlpha="1.0"app:viewpager_hideLogoWithFade="true"app:viewpager_hideToolbarAndTitle="true"app:viewpager_enableToolbarElevation="true"
/>

You will see on Android Studio Preview :

alt preview

Retrieve the MaterialViewPager

You can use MaterialViewPager as an usual Android View, and get it by findViewById

publicclassMainActivityextendsActionBarActivity {
privateMaterialViewPagermViewPager;
@OverrideprotectedvoidonCreate(BundlesavedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mViewPager = (MaterialViewPager) findViewById(R.id.materialViewPager);
}
}

#Customisation

First choose your color and height

<com.github.florent37.materialviewpager.MaterialViewPager
android:id="@+id/materialViewPager"android:layout_width="match_parent"android:layout_height="match_parent"
...
app:viewpager_color="@color/colorPrimary"app:viewpager_headerHeight="200dp"
...
/>

##Set your logo

<com.github.florent37.materialviewpager.MaterialViewPager
...
app:viewpager_logo="@layout/header_logo" <-- look custom logo layout
app:viewpager_logoMarginTop="100dp" <-- look at the preview
...
/>

###Titlebar Logo

Video

Your logo's layout must

  • layout_height="@dimen/materialviewpager_logoHeight"

header_logo.xml

<ImageViewxmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/logo_white"android:layout_width="200dp"android:layout_height="@dimen/materialviewpager_logoHeight"android:fitsSystemWindows="true"android:adjustViewBounds="true"android:layout_centerHorizontal="true"android:src="@drawable/logo_white" />
<com.github.florent37.materialviewpager.MaterialViewPager`
...
app:viewpager_hideLogoWithFade="false"
...
/>

###Fading Logo

Video

header_logo.xml

<FrameLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="80dp"android:layout_height="80dp"android:layout_centerHorizontal="true"android:background="@drawable/circle">
<ImageViewandroid:layout_width="30dp"android:layout_height="30dp"android:fitsSystemWindows="true"android:adjustViewBounds="true"android:layout_gravity="center"android:src="@drawable/flying" />
</FrameLayout>
<com.github.florent37.materialviewpager.MaterialViewPager`
...
app:viewpager_hideLogoWithFade="true"
...
/>

##Toolbar Animation

##Hide Logo and Toolbar

Video

<com.github.florent37.materialviewpager.MaterialViewPager`
...
app:hideToolbarAndTitle="true"
...
/>

###Sticky Toolbar

Video

<com.github.florent37.materialviewpager.MaterialViewPager`
...
app:hideToolbarAndTitle="false"
...
/>

##Custom Tab Bar

You can set you own tab bar, by default I provided 2 implementations

###Standard

Video

<com.github.florent37.materialviewpager.MaterialViewPager`
...
app:viewpager_pagerTitleStrip="@layout/material_view_pager_pagertitlestrip_standard"
...
/>

###News Stand

Video

<com.github.florent37.materialviewpager.MaterialViewPager`
...
app:viewpager_pagerTitleStrip="@layout/material_view_pager_pagertitlestrip_newstand"
...
/>

###Or create your own tab bar

Create your own layout using a PagerSlidingTabStrip

my_tabs.xml

<com.astuetz.PagerSlidingTabStrip
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"android:id="@id/materialviewpager_pagerTitleStrip"android:layout_width="match_parent"android:layout_height="match_parent"app:pstsPaddingMiddle="true"app:pstsDividerPadding="20dp"app:pstsIndicatorColor="#FFF"app:pstsIndicatorHeight="2dp"app:pstsShouldExpand="true"app:pstsTabPaddingLeftRight="10dp"app:pstsTextAllCaps="true"tools:background="#A333"
/>

Don't forget to give it id="@id/materialviewpager_pagerTitleStrip"

<com.github.florent37.materialviewpager.MaterialViewPager`
...
app:viewpager_pagerTitleStrip="@layout/my_tabs"
...
/>

#Animate Header

Video

Simply listen to the ViewPager Page Change and modify the header's color and image

//it's a sample ViewPagerAdaptermViewPager.setAdapter(newFragmentStatePagerAdapter(getSupportFragmentManager()) {
intoldPosition = -1;
@OverridepublicFragmentgetItem(intposition) {
returnRecyclerViewFragment.newInstance();
}
@OverridepublicintgetCount() {
return4;
}
@OverridepublicCharSequencegetPageTitle(intposition) {
return"Tab "+position;
}
//called when the current page has changed@OverridepublicvoidsetPrimaryItem(ViewGroupcontainer, intposition, Objectobject) {
super.setPrimaryItem(container, position, object);
//only if position changedif(position == oldPosition)
return;
oldPosition = position;
intcolor = 0;
StringimageUrl = "";
switch (position){
case0:
imageUrl = "http://cdn1.tnwcdn.com/wp-content/blogs.dir/1/files/2014/06/wallpaper_51.jpg";
color = getResources().getColor(R.color.blue);
break;
case1:
imageUrl = "https://fs01.androidpit.info/a/63/0e/android-l-wallpapers-630ea6-h900.jpg";
color = getResources().getColor(R.color.green);
break;
case2:
imageUrl = "http://www.droid-life.com/wp-content/uploads/2014/10/lollipop-wallpapers10.jpg";
color = getResources().getColor(R.color.cyan);
break;
case3:
imageUrl = "http://www.tothemobile.com/wp-content/uploads/2014/07/original.jpg";
color = getResources().getColor(R.color.red);
break;
}
finalintfadeDuration = 400;
//change header's color and imagemViewPager.setImageUrl(imageUrl,fadeDuration);
mViewPager.setColor(color,fadeDuration);
}
});

#Toolbar

Toolbartoolbar = mViewPager.getToolbar();
if (toolbar != null) {
setSupportActionBar(toolbar);
ActionBaractionBar = getSupportActionBar();
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setDisplayShowHomeEnabled(true);
actionBar.setDisplayShowTitleEnabled(true);
actionBar.setDisplayUseLogoEnabled(false);
actionBar.setHomeButtonEnabled(true);
}

#ViewPager

ViewPagerviewPager = mViewPager.getViewPager();
viewPage.setAdapter(...);
//After set an adapter to the ViewPagermViewPager.getPagerTitleStrip().setViewPager(mViewPager.getViewPager());

#Register your Scrollable

First thing, your fragment view and your scrollable must be transparent, so do not use android:backgound="..." Sample :

<android.support.v7.widget.RecyclerView
xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/recyclerView"android:layout_width="match_parent"android:layout_height="match_parent"
/>

##RecyclerView

From your fragment

mAdapter = newRecyclerViewMaterialAdapter(new ***Adapter(mList));
mRecyclerView.setAdapter(mAdapter);
MaterialViewPagerHelper.registerRecyclerView(getActivity(), mRecyclerView, null);

###ReyclerView.OnScrollListener

If you already use ReyclerView.OnScrollListener (maybe for load more, or anything else)

MaterialViewPagerHelper.registerRecyclerView(getActivity(), mRecyclerView, myRecyclerViewOnScrollListener);

So myRecyclerViewOnScrollListener will be still notified

##ScrollView

The ScrollView must be an ObservableScrollView

MaterialViewPagerHelper.registerScrollView(getActivity(), mScrollView, null);

###CallBacks If you already use ObservableScrollViewCallbacks (maybe for load more, or anything else)

MaterialViewPagerHelper.registerScrollView(getActivity(), mScrollView, myObservableScrollViewCallbacks);

So myObservableScrollViewCallbacks will be still notified

###Layout

And must include @layout/material_view_pager_placeholder as first child

<com.github.ksoichiro.android.observablescrollview.ObservableScrollView
xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"android:id="@+id/scrollView"android:layout_width="match_parent"android:layout_height="match_parent">
<LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical">
<includelayout="@layout/material_view_pager_placeholder"/>
...your content...
</LinearLayout>
</com.github.ksoichiro.android.observablescrollview.ObservableScrollView>

##[Killed for less...] WebView

The WebView must be an ObservableWebView

//must be called before loadUrl()MaterialViewPagerHelper.preLoadInjectHeader(mWebView);
//have to inject header when WebView page loadedmWebView.setWebViewClient(newWebViewClient() {
@OverridepublicvoidonPageFinished(WebViewview, Stringurl) {
MaterialViewPagerHelper.injectHeader(mWebView, true);
}
@OverridepublicbooleanshouldOverrideUrlLoading(WebViewview, Stringurl) {
view.loadUrl(url);
returntrue;
}
});
mWebView.loadUrl("http://...");
MaterialViewPagerHelper.registerWebView(getActivity(), mWebView, null);

##[Deprecated] ListView

Smoother if using RecyclerView !

The ListView must be an ObservableListView

mAdapter = newListViewMaterialAdapter(new ***Adapter(getActivity(),mList));
mListView.setAdapter(mAdapter);
MaterialViewPagerHelper.registerListView(getActivity(), mListView, null);

#TODO

  • Fix issue when scroll down & scroll up multiples time while hideToolbarAndTitle="true"
  • Header image does not load every time
  • Remove Webviews from Android SDK !!!

#Community

Looking for contributors, feel free to fork !

Tell me if you're using my library in your application, I'll share it in this README

#Dependencies

#Credits

Author: Florent Champigny

Follow me on Google+Follow me on TwitterFollow me on LinkedIn

License

Copyright 2015 florent37, Inc.
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.

About

A Material Design ViewPager easy to use library

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages