Skip to content

Commit 77b3bfe

Browse files
committed
Fixes issue #9. Adds support for ViewPager2 along with the demo Activity.
1 parent f1e71ef commit 77b3bfe

File tree

10 files changed

+451
-4
lines changed

10 files changed

+451
-4
lines changed

app/src/main/AndroidManifest.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222
<activity android:name=".PokerCardDemoActivity"></activity>
2323
<activity android:name=".PictureGalleryDemoActivity">
2424
</activity>
25+
<activity android:name=".ViewPager2DemoActivity">
26+
</activity>
2527
</application>
2628

2729
</manifest>

app/src/main/java/com/wajahatkarim3/easyflipviewpager/demo/GalleryImageFragment.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ class GalleryImageFragment : Fragment() {
5757
R.drawable.books_snap -> startActivity(Intent(context, BookOnboardingActivity::class.java))
5858
R.drawable.gallery_snap -> startActivity(Intent(context, PictureGalleryDemoActivity::class.java))
5959
R.drawable.poker_snap -> startActivity(Intent(context, PokerCardDemoActivity::class.java))
60+
R.drawable.viewpager2_snap -> startActivity(Intent(context, ViewPager2DemoActivity::class.java))
6061
}
6162
}
6263

app/src/main/java/com/wajahatkarim3/easyflipviewpager/demo/MainActivity.kt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,13 +78,15 @@ class MainActivity : AppCompatActivity() {
7878
val titles = arrayOf(
7979
"Book Onboarding",
8080
"Poker Card",
81-
"Pakistan Gallery"
81+
"Pakistan Gallery",
82+
"ViewPager2 Demo"
8283
)
8384

8485
val imageIds = intArrayOf(
8586
R.drawable.books_snap,
8687
R.drawable.poker_snap,
87-
R.drawable.gallery_snap
88+
R.drawable.gallery_snap,
89+
R.drawable.viewpager2_snap
8890
)
8991

9092
for (i in 0 until imageIds.size)
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package com.wajahatkarim3.easyflipviewpager.demo
2+
3+
import android.view.LayoutInflater
4+
import android.view.View
5+
import android.view.ViewGroup
6+
import android.widget.TextView
7+
import androidx.recyclerview.widget.RecyclerView
8+
9+
class ScreenSlideRecyclerAdapter(val itemsList: ArrayList<Int>) : RecyclerView.Adapter<ScreenSlideRecyclerAdapter.ScreenSlideViewHolder>()
10+
{
11+
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ScreenSlideViewHolder {
12+
var view = LayoutInflater.from(parent.context).inflate(R.layout.fragment_dummy_layout, parent, false)
13+
return ScreenSlideViewHolder(view)
14+
}
15+
16+
override fun onBindViewHolder(holder: ScreenSlideViewHolder, position: Int) {
17+
holder.bind(itemsList[position], position)
18+
}
19+
20+
override fun getItemCount(): Int {
21+
return itemsList.size
22+
}
23+
24+
fun setItems(items: List<Int>)
25+
{
26+
itemsList.clear()
27+
itemsList.addAll(items)
28+
notifyDataSetChanged()
29+
}
30+
31+
inner class ScreenSlideViewHolder : RecyclerView.ViewHolder
32+
{
33+
var textView: TextView? = null
34+
constructor(view: View) : super(view) {
35+
textView = view.findViewById(R.id.textView)
36+
}
37+
38+
fun bind(color: Int, position: Int) {
39+
textView?.setBackgroundColor(color)
40+
textView?.setText(position.toString())
41+
}
42+
}
43+
}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package com.wajahatkarim3.easyflipviewpager.demo
2+
3+
import android.graphics.Color
4+
import android.os.Bundle
5+
import android.os.PersistableBundle
6+
import android.widget.RadioGroup
7+
import androidx.appcompat.app.AppCompatActivity
8+
import androidx.viewpager2.widget.MarginPageTransformer
9+
import androidx.viewpager2.widget.ViewPager2
10+
import com.wajahatkarim3.easyflipviewpager.BookFlipPageTransformer
11+
import com.wajahatkarim3.easyflipviewpager.BookFlipPageTransformer2
12+
import com.wajahatkarim3.easyflipviewpager.CardFlipPageTransformer2
13+
14+
class ViewPager2DemoActivity : AppCompatActivity() {
15+
16+
lateinit var viewPager: ViewPager2
17+
lateinit var rgOrientation: RadioGroup
18+
val itemsList = arrayListOf<Int>()
19+
var sliderAdapter = ScreenSlideRecyclerAdapter(itemsList)
20+
21+
override fun onCreate(savedInstanceState: Bundle?) {
22+
super.onCreate(savedInstanceState)
23+
setContentView(R.layout.activity_view_pager_2_demo)
24+
25+
setupViews()
26+
}
27+
28+
fun setupViews()
29+
{
30+
// Items
31+
val colors = intArrayOf(Color.RED, Color.BLUE, Color.GREEN, Color.CYAN)
32+
sliderAdapter.setItems(colors.toList())
33+
34+
// ViewPager
35+
viewPager = findViewById(R.id.viewPager2)
36+
viewPager.adapter = sliderAdapter
37+
38+
var bookTransformer = BookFlipPageTransformer2()
39+
viewPager.setPageTransformer(bookTransformer)
40+
viewPager.orientation = ViewPager2.ORIENTATION_HORIZONTAL
41+
42+
// RadioGroup
43+
rgOrientation = findViewById(R.id.rgOrientation)
44+
rgOrientation.setOnCheckedChangeListener { group, checkedId ->
45+
if (checkedId == R.id.radioHorizontal)
46+
viewPager.orientation = ViewPager2.ORIENTATION_HORIZONTAL
47+
else
48+
viewPager.orientation = ViewPager2.ORIENTATION_VERTICAL
49+
}
50+
}
51+
}
11.6 KB
Loading
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
3+
android:layout_width="match_parent"
4+
android:layout_height="match_parent"
5+
xmlns:app="http://schemas.android.com/apk/res-auto">
6+
7+
<androidx.viewpager2.widget.ViewPager2
8+
android:id="@+id/viewPager2"
9+
android:layout_width="match_parent"
10+
android:layout_height="0dp"
11+
app:layout_constraintTop_toTopOf="parent"
12+
app:layout_constraintBottom_toTopOf="@+id/rgOrientation"/>
13+
14+
<RadioGroup android:id="@+id/rgOrientation"
15+
android:layout_width="match_parent"
16+
android:layout_height="wrap_content"
17+
app:layout_constraintBottom_toBottomOf="parent">
18+
19+
<RadioButton android:id="@+id/radioHorizontal"
20+
android:layout_width="match_parent"
21+
android:layout_height="wrap_content"
22+
android:text="Horizontal"
23+
android:checked="true"/>
24+
25+
<RadioButton android:id="@+id/radioVertical"
26+
android:layout_width="match_parent"
27+
android:layout_height="wrap_content"
28+
android:text="Vertical"/>
29+
30+
</RadioGroup>
31+
32+
</androidx.constraintlayout.widget.ConstraintLayout>

easyflipviewpager/build.gradle

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ ext {
1111
libraryName = 'easyflipviewpager'
1212
artifact = 'easyflipviewpager'
1313

14-
libraryVersion = '1.2.0'
14+
libraryVersion = '2.0.0'
1515

1616
libraryDescription = 'The library for creating book and card flip animations in ViewPager in Android'
1717

@@ -51,8 +51,8 @@ android {
5151

5252
dependencies {
5353
implementation fileTree(dir: 'libs', include: ['*.jar'])
54-
5554
implementation 'androidx.appcompat:appcompat:1.0.0'
55+
implementation "androidx.viewpager2:viewpager2:1.0.0"
5656
testImplementation 'junit:junit:4.12'
5757
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
5858
androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.0'
Lines changed: 191 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,191 @@
1+
/*
2+
Copyright 2020 Wajahat Karim
3+
4+
Licensed under the Apache License, Version 2.0 (the "License");
5+
you may not use this file except in compliance with the License.
6+
You may obtain a copy of the License at
7+
8+
http://www.apache.org/licenses/LICENSE-2.0
9+
10+
Unless required by applicable law or agreed to in writing, software
11+
distributed under the License is distributed on an "AS IS" BASIS,
12+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
See the License for the specific language governing permissions and
14+
limitations under the License.
15+
*/
16+
17+
package com.wajahatkarim3.easyflipviewpager;
18+
19+
import android.view.View;
20+
import android.view.ViewParent;
21+
22+
import androidx.annotation.NonNull;
23+
import androidx.recyclerview.widget.RecyclerView;
24+
import androidx.viewpager2.widget.ViewPager2;
25+
26+
/**
27+
* A book based page flip animation PageTransformer implementation for ViewPager2
28+
*
29+
* Set the object of this transformer to any ViewPager object.
30+
* For example, myViewPager.setPageTransformer(true, new BookFlipPageTransformer2());
31+
*
32+
* @see <a href="http://github.com/wajahatkarim3/EasyFlipViewPager">EasyFlipViewPager</a>
33+
*
34+
* @author Wajahat Karim (http://wajahatkarim.com)
35+
*/
36+
public class BookFlipPageTransformer2 implements ViewPager2.PageTransformer {
37+
38+
private final int LEFT = -1;
39+
private final int RIGHT = 1;
40+
private final int CENTER = 0;
41+
42+
private float scaleAmountPercent = 5f;
43+
private boolean enableScale = true;
44+
45+
@Override
46+
public void transformPage(@NonNull View page, float position) {
47+
float percentage = 1 - Math.abs(position);
48+
ViewPager2 viewPager = requireViewPager(page);
49+
// Don't move pages once they are on left or right
50+
if (position > CENTER && position <= RIGHT)
51+
{
52+
if (viewPager.getOrientation() == ViewPager2.ORIENTATION_HORIZONTAL)
53+
{
54+
// This is behind page
55+
page.setTranslationX(-position * (page.getWidth()));
56+
page.setTranslationY(0);
57+
page.setTranslationZ(-1);
58+
page.setRotation(0);
59+
if (enableScale)
60+
{
61+
float amount = ((100 - scaleAmountPercent) + ( scaleAmountPercent * percentage)) / 100;
62+
setSize(page, position, amount);
63+
}
64+
}
65+
else
66+
{
67+
// This is behind page
68+
page.setTranslationY(-position * (page.getHeight()));
69+
page.setTranslationX(0);
70+
page.setTranslationZ(-1);
71+
page.setRotation(0);
72+
if (enableScale)
73+
{
74+
float amount = ((100 - scaleAmountPercent) + ( scaleAmountPercent * percentage)) / 100;
75+
setSize(page, position, amount);
76+
}
77+
}
78+
79+
}
80+
// Otherwise flip the current page
81+
else
82+
{
83+
page.setVisibility(View.VISIBLE);
84+
flipPage(page, position, percentage);
85+
}
86+
}
87+
88+
private void flipPage(View page, float position, float percentage)
89+
{
90+
91+
// Flip this page
92+
page.setCameraDistance(-30000);
93+
setVisibility(page, position);
94+
setTranslation(page);
95+
if (requireViewPager(page).getOrientation() == ViewPager2.ORIENTATION_HORIZONTAL)
96+
{
97+
setPivot(page, 0f, page.getHeight() * 0.5f);
98+
}
99+
else if (requireViewPager(page).getOrientation() == ViewPager2.ORIENTATION_VERTICAL)
100+
{
101+
setPivot(page, page.getWidth() * 0.5f, 0f);
102+
}
103+
104+
setRotation(page, position, percentage);
105+
}
106+
107+
private void setPivot(View page, float pivotX, float pivotY)
108+
{
109+
page.setPivotX(pivotX);
110+
page.setPivotY(pivotY);
111+
}
112+
113+
private void setVisibility(View page, float position) {
114+
if (position < 0.5 && position > -0.5) {
115+
page.setVisibility(View.VISIBLE);
116+
} else {
117+
page.setVisibility(View.INVISIBLE);
118+
}
119+
}
120+
121+
private void setTranslation(View page) {
122+
ViewPager2 viewPager = requireViewPager(page);
123+
if (viewPager.getOrientation() == ViewPager2.ORIENTATION_HORIZONTAL)
124+
{
125+
int scroll = viewPager.getScrollX() - page.getLeft();
126+
page.setTranslationX(scroll);
127+
}
128+
else if (viewPager.getOrientation() == ViewPager2.ORIENTATION_VERTICAL)
129+
{
130+
int scroll = viewPager.getScrollY() - page.getTop();
131+
page.setTranslationY(scroll);
132+
}
133+
page.setTranslationZ(1f);
134+
}
135+
136+
private void setSize(View page, float position, float percentage) {
137+
page.setScaleX((position != 0 && position != 1) ? percentage : 1);
138+
page.setScaleY((position != 0 && position != 1) ? percentage : 1);
139+
}
140+
141+
private void setRotation(View page, float position, float percentage) {
142+
ViewPager2 viewPager = requireViewPager(page);
143+
if (viewPager.getOrientation() == ViewPager2.ORIENTATION_HORIZONTAL)
144+
{
145+
if (position > 0) {
146+
page.setRotationY(-180 * (percentage + 1));
147+
} else {
148+
page.setRotationY(180 * (percentage + 1));
149+
}
150+
}
151+
else if (viewPager.getOrientation() == ViewPager2.ORIENTATION_VERTICAL)
152+
{
153+
if (position > 0) {
154+
page.setRotationX(180 * (percentage + 1));
155+
} else {
156+
page.setRotationX(-180 * (percentage + 1));
157+
}
158+
}
159+
}
160+
161+
private ViewPager2 requireViewPager(@NonNull View page) {
162+
ViewParent parent = page.getParent();
163+
ViewParent parentParent = parent.getParent();
164+
165+
if (parent instanceof RecyclerView && parentParent instanceof ViewPager2) {
166+
return (ViewPager2) parentParent;
167+
}
168+
169+
throw new IllegalStateException(
170+
"Expected the page view to be managed by a ViewPager2 instance.");
171+
}
172+
173+
//region Getters/Setters
174+
public float getScaleAmountPercent() {
175+
return scaleAmountPercent;
176+
}
177+
178+
public void setScaleAmountPercent(float scaleAmountPercent) {
179+
this.scaleAmountPercent = scaleAmountPercent;
180+
}
181+
182+
public boolean isEnableScale() {
183+
return enableScale;
184+
}
185+
186+
public void setEnableScale(boolean enableScale) {
187+
this.enableScale = enableScale;
188+
}
189+
190+
//endregion
191+
}

0 commit comments

Comments
 (0)