├── .gitignore ├── .idea ├── .name ├── codeStyles │ └── Project.xml ├── misc.xml ├── modules.xml ├── runConfigurations.xml └── vcs.xml ├── README.md ├── app ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── info │ │ └── androidhive │ │ └── viewpager2 │ │ └── ExampleInstrumentedTest.java │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── info │ │ │ └── androidhive │ │ │ └── viewpager2 │ │ │ ├── MainActivity.java │ │ │ ├── Utils.java │ │ │ ├── fragments │ │ │ ├── EventsFragment.java │ │ │ ├── FragmentViewPagerActivity.java │ │ │ ├── MoviesFragment.java │ │ │ └── TicketsFragment.java │ │ │ ├── transformers │ │ │ ├── AntiClockSpinTransformation.java │ │ │ ├── ClockSpinTransformation.java │ │ │ ├── CubeInDepthTransformation.java │ │ │ ├── CubeInRotationTransformation.java │ │ │ ├── CubeInScalingTransformation.java │ │ │ ├── CubeOutDepthTransformation.java │ │ │ ├── CubeOutRotationTransformation.java │ │ │ ├── CubeOutScalingTransformation.java │ │ │ ├── DepthPageTransformer.java │ │ │ ├── DepthTransformation.java │ │ │ ├── FadeOutTransformation.java │ │ │ ├── FanTransformation.java │ │ │ ├── FidgetSpinTransformation.java │ │ │ ├── GateTransformation.java │ │ │ ├── HingeTransformation.java │ │ │ ├── HorizontalFlipTransformation.java │ │ │ ├── PopTransformation.java │ │ │ ├── SimpleTransformation.java │ │ │ ├── SpinnerTransformation.java │ │ │ ├── TossTransformation.java │ │ │ ├── VerticalFlipTransformation.java │ │ │ ├── VerticalShutTransformation.java │ │ │ ├── ZoomInTransformer.java │ │ │ └── ZoomOutPageTransformer.java │ │ │ └── views │ │ │ └── ViewsSliderActivity.java │ └── res │ │ ├── drawable-hdpi │ │ ├── ic_discount.png │ │ ├── ic_food.png │ │ ├── ic_movie.png │ │ └── ic_travel.png │ │ ├── drawable-mdpi │ │ ├── ic_discount.png │ │ ├── ic_food.png │ │ ├── ic_movie.png │ │ └── ic_travel.png │ │ ├── drawable-v24 │ │ └── ic_launcher_foreground.xml │ │ ├── drawable-xhdpi │ │ ├── ic_discount.png │ │ ├── ic_food.png │ │ ├── ic_movie.png │ │ └── ic_travel.png │ │ ├── drawable-xxhdpi │ │ ├── ic_discount.png │ │ ├── ic_food.png │ │ ├── ic_movie.png │ │ └── ic_travel.png │ │ ├── drawable-xxxhdpi │ │ ├── ic_discount.png │ │ ├── ic_food.png │ │ ├── ic_movie.png │ │ └── ic_travel.png │ │ ├── drawable │ │ ├── ic_baseline_more_vert_24.xml │ │ └── ic_launcher_background.xml │ │ ├── layout │ │ ├── activity_fragment_view_pager.xml │ │ ├── activity_main.xml │ │ ├── activity_views_slider.xml │ │ ├── fragment_events.xml │ │ ├── fragment_movies.xml │ │ ├── fragment_tickets.xml │ │ ├── slide_four.xml │ │ ├── slide_one.xml │ │ ├── slide_three.xml │ │ └── slide_two.xml │ │ ├── menu │ │ └── pager_transformers.xml │ │ ├── mipmap-anydpi-v26 │ │ ├── ic_launcher.xml │ │ └── ic_launcher_round.xml │ │ ├── mipmap-hdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-mdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxxhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── navigation │ │ └── nav_graph.xml │ │ └── values │ │ ├── colors.xml │ │ ├── dimens.xml │ │ ├── strings.xml │ │ └── styles.xml │ └── test │ └── java │ └── info │ └── androidhive │ └── viewpager2 │ └── ExampleUnitTest.java ├── build.gradle ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | # Built application files 2 | *.apk 3 | *.ap_ 4 | 5 | # Files for the ART/Dalvik VM 6 | *.dex 7 | 8 | # Java class files 9 | *.class 10 | 11 | # Generated files 12 | bin/ 13 | gen/ 14 | out/ 15 | 16 | # Gradle files 17 | .gradle/ 18 | build/ 19 | 20 | # Local configuration file (sdk path, etc) 21 | local.properties 22 | 23 | # Proguard folder generated by Eclipse 24 | proguard/ 25 | 26 | # Log Files 27 | *.log 28 | 29 | # Android Studio Navigation editor temp files 30 | .navigation/ 31 | 32 | # Android Studio captures folder 33 | captures/ 34 | 35 | # IntelliJ 36 | *.iml 37 | .idea/workspace.xml 38 | .idea/tasks.xml 39 | .idea/gradle.xml 40 | .idea/assetWizardSettings.xml 41 | .idea/dictionaries 42 | .idea/libraries 43 | .idea/caches 44 | 45 | # Keystore files 46 | # Uncomment the following line if you do not want to check your keystore files in. 47 | #*.jks 48 | 49 | # External native build folder generated in Android Studio 2.2 and later 50 | .externalNativeBuild 51 | 52 | # Google Services (e.g. APIs or Firebase) 53 | google-services.json 54 | 55 | # Freeline 56 | freeline.py 57 | freeline/ 58 | freeline_project_description.json 59 | 60 | # fastlane 61 | fastlane/report.xml 62 | fastlane/Preview.html 63 | fastlane/screenshots 64 | fastlane/test_output 65 | <<<<<<< HEAD 66 | fastlane/readme.md 67 | ======= 68 | fastlane/readme.md 69 | >>>>>>> 33c4dad7336a49eb3cbcf06276c99e082417531c 70 | -------------------------------------------------------------------------------- /.idea/.name: -------------------------------------------------------------------------------- 1 | ViewPager 2 -------------------------------------------------------------------------------- /.idea/codeStyles/Project.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | xmlns:android 14 | 15 | ^$ 16 | 17 | 18 | 19 |
20 |
21 | 22 | 23 | 24 | xmlns:.* 25 | 26 | ^$ 27 | 28 | 29 | BY_NAME 30 | 31 |
32 |
33 | 34 | 35 | 36 | .*:id 37 | 38 | http://schemas.android.com/apk/res/android 39 | 40 | 41 | 42 |
43 |
44 | 45 | 46 | 47 | .*:name 48 | 49 | http://schemas.android.com/apk/res/android 50 | 51 | 52 | 53 |
54 |
55 | 56 | 57 | 58 | name 59 | 60 | ^$ 61 | 62 | 63 | 64 |
65 |
66 | 67 | 68 | 69 | style 70 | 71 | ^$ 72 | 73 | 74 | 75 |
76 |
77 | 78 | 79 | 80 | .* 81 | 82 | ^$ 83 | 84 | 85 | BY_NAME 86 | 87 |
88 |
89 | 90 | 91 | 92 | .* 93 | 94 | http://schemas.android.com/apk/res/android 95 | 96 | 97 | ANDROID_ATTRIBUTE_ORDER 98 | 99 |
100 |
101 | 102 | 103 | 104 | .* 105 | 106 | .* 107 | 108 | 109 | BY_NAME 110 | 111 |
112 |
113 |
114 |
115 |
116 |
-------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 9 | 10 | 11 | 12 | 13 | 1.8 14 | 15 | 20 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /.idea/runConfigurations.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Android ViewPager2 Examples 2 | =================== 3 | 4 | Tutorial: 5 | ----- 6 | Visit [this](https://www.androidhive.info/2020/01/android-working-with-viewpager2-tablayout/) link for detailed tutorial 7 | 8 | Video [Demo](https://www.youtube.com/embed/XEdmsUEynm0) 9 | 10 | Intro Slides using ViewPager2 11 | ------------- 12 | [Code](https://github.com/ravi8x/ViewPager2-Examples/blob/master/app/src/main/java/info/androidhive/viewpager2/views/ViewsSliderActivity.java) 13 | 14 | ![Intro Slider using ViewPager2](https://www.androidhive.info/wp-content/uploads/2020/01/android-viewpager-static-views.png) 15 | 16 | ViewPager2 with TabLayout and Fragments 17 | ------------- 18 | [Code](https://github.com/ravi8x/ViewPager2-Examples/tree/master/app/src/main/java/info/androidhive/viewpager2/fragments) 19 | 20 | ![ViewPager2 with TabLayout](https://www.androidhive.info/wp-content/uploads/2020/01/android-viewpager-tab-layout.png) 21 | 22 | ViewPager2 Page Transformations 23 | ------------- 24 | Here you can find [list](https://github.com/ravi8x/ViewPager2-Examples/tree/master/app/src/main/java/info/androidhive/viewpager2/transformers) of ViewPager2 transformations 25 | 26 | ![ViewPager2 Transformations](https://www.androidhive.info/wp-content/uploads/2020/01/viewpager-page-transformation-horizontal-flip.gif) 27 | 28 | ### Transformations References: 29 | [Viewpager-Transformation](https://github.com/dipanshukr/Viewpager-Transformation) 30 | [Loginworks](https://www.loginworks.com/blogs/how-to-make-awesome-transition-effects-using-pagetransformer-in-android/) -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | apply plugin: 'androidx.navigation.safeargs' 3 | 4 | android { 5 | compileSdkVersion 29 6 | buildToolsVersion "29.0.2" 7 | 8 | defaultConfig { 9 | applicationId "info.androidhive.viewpager2" 10 | minSdkVersion 16 11 | targetSdkVersion 29 12 | versionCode 1 13 | versionName "1.0" 14 | vectorDrawables.useSupportLibrary = true 15 | 16 | testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" 17 | } 18 | 19 | compileOptions { 20 | sourceCompatibility JavaVersion.VERSION_1_8 21 | targetCompatibility JavaVersion.VERSION_1_8 22 | } 23 | 24 | buildTypes { 25 | release { 26 | minifyEnabled false 27 | proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' 28 | } 29 | } 30 | 31 | viewBinding { 32 | enabled = true 33 | } 34 | } 35 | 36 | dependencies { 37 | implementation fileTree(dir: 'libs', include: ['*.jar']) 38 | 39 | implementation 'androidx.appcompat:appcompat:1.1.0' 40 | implementation 'androidx.constraintlayout:constraintlayout:1.1.3' 41 | implementation 'androidx.legacy:legacy-support-v4:1.0.0' 42 | implementation 'com.google.android.material:material:1.2.0-alpha01' 43 | implementation 'androidx.navigation:navigation-fragment:2.1.0' 44 | implementation 'androidx.navigation:navigation-ui:2.1.0' 45 | testImplementation 'junit:junit:4.12' 46 | androidTestImplementation 'androidx.test.ext:junit:1.1.1' 47 | androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' 48 | 49 | // ViewPager2 50 | implementation "androidx.viewpager2:viewpager2:1.0.0" 51 | } 52 | -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile 22 | -------------------------------------------------------------------------------- /app/src/androidTest/java/info/androidhive/viewpager2/ExampleInstrumentedTest.java: -------------------------------------------------------------------------------- 1 | package info.androidhive.viewpager2; 2 | 3 | import android.content.Context; 4 | 5 | import androidx.test.platform.app.InstrumentationRegistry; 6 | import androidx.test.ext.junit.runners.AndroidJUnit4; 7 | 8 | import org.junit.Test; 9 | import org.junit.runner.RunWith; 10 | 11 | import static org.junit.Assert.*; 12 | 13 | /** 14 | * Instrumented test, which will execute on an Android device. 15 | * 16 | * @see Testing documentation 17 | */ 18 | @RunWith(AndroidJUnit4.class) 19 | public class ExampleInstrumentedTest { 20 | @Test 21 | public void useAppContext() { 22 | // Context of the app under test. 23 | Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); 24 | 25 | assertEquals("info.androidhive.viewpager2", appContext.getPackageName()); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 12 | 14 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /app/src/main/java/info/androidhive/viewpager2/MainActivity.java: -------------------------------------------------------------------------------- 1 | package info.androidhive.viewpager2; 2 | 3 | import androidx.annotation.RequiresApi; 4 | import androidx.appcompat.app.AppCompatActivity; 5 | import androidx.viewpager2.widget.ViewPager2; 6 | 7 | import android.content.Intent; 8 | import android.os.Build; 9 | import android.os.Bundle; 10 | 11 | import info.androidhive.viewpager2.databinding.ActivityMainBinding; 12 | import info.androidhive.viewpager2.fragments.FragmentViewPagerActivity; 13 | import info.androidhive.viewpager2.transformers.CubeInDepthTransformation; 14 | import info.androidhive.viewpager2.transformers.DepthPageTransformer; 15 | import info.androidhive.viewpager2.transformers.GateTransformation; 16 | import info.androidhive.viewpager2.transformers.TossTransformation; 17 | import info.androidhive.viewpager2.transformers.ZoomOutPageTransformer; 18 | import info.androidhive.viewpager2.views.ViewsSliderActivity; 19 | 20 | public class MainActivity extends AppCompatActivity { 21 | private ActivityMainBinding binding; 22 | 23 | @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) 24 | @Override 25 | protected void onCreate(Bundle savedInstanceState) { 26 | super.onCreate(savedInstanceState); 27 | binding = ActivityMainBinding.inflate(getLayoutInflater()); 28 | setContentView(binding.getRoot()); 29 | 30 | binding.btnViewsDemo.setOnClickListener(view -> { 31 | startActivity(new Intent(MainActivity.this, ViewsSliderActivity.class)); 32 | }); 33 | 34 | binding.btnFragmentDemo.setOnClickListener(view -> { 35 | startActivity(new Intent(MainActivity.this, FragmentViewPagerActivity.class)); 36 | }); 37 | } 38 | } -------------------------------------------------------------------------------- /app/src/main/java/info/androidhive/viewpager2/Utils.java: -------------------------------------------------------------------------------- 1 | package info.androidhive.viewpager2; 2 | 3 | import android.annotation.SuppressLint; 4 | 5 | import androidx.viewpager2.widget.ViewPager2; 6 | 7 | import info.androidhive.viewpager2.transformers.AntiClockSpinTransformation; 8 | import info.androidhive.viewpager2.transformers.ClockSpinTransformation; 9 | import info.androidhive.viewpager2.transformers.CubeInDepthTransformation; 10 | import info.androidhive.viewpager2.transformers.CubeInRotationTransformation; 11 | import info.androidhive.viewpager2.transformers.CubeOutDepthTransformation; 12 | import info.androidhive.viewpager2.transformers.CubeOutRotationTransformation; 13 | import info.androidhive.viewpager2.transformers.CubeOutScalingTransformation; 14 | import info.androidhive.viewpager2.transformers.DepthPageTransformer; 15 | import info.androidhive.viewpager2.transformers.DepthTransformation; 16 | import info.androidhive.viewpager2.transformers.FadeOutTransformation; 17 | import info.androidhive.viewpager2.transformers.FanTransformation; 18 | import info.androidhive.viewpager2.transformers.GateTransformation; 19 | import info.androidhive.viewpager2.transformers.HingeTransformation; 20 | import info.androidhive.viewpager2.transformers.VerticalFlipTransformation; 21 | import info.androidhive.viewpager2.transformers.PopTransformation; 22 | import info.androidhive.viewpager2.transformers.SimpleTransformation; 23 | import info.androidhive.viewpager2.transformers.SpinnerTransformation; 24 | import info.androidhive.viewpager2.transformers.TossTransformation; 25 | import info.androidhive.viewpager2.transformers.HorizontalFlipTransformation; 26 | import info.androidhive.viewpager2.transformers.VerticalShutTransformation; 27 | import info.androidhive.viewpager2.transformers.ZoomOutPageTransformer; 28 | 29 | public class Utils { 30 | @SuppressLint("NewApi") 31 | public static ViewPager2.PageTransformer getTransformer(int id) { 32 | switch (id) { 33 | case R.id.action_anti_clock_spin: 34 | return new AntiClockSpinTransformation(); 35 | case R.id.action_clock_spin: 36 | return new ClockSpinTransformation(); 37 | case R.id.action_cube_in_depth: 38 | return new CubeInDepthTransformation(); 39 | case R.id.action_cube_in_rotate: 40 | return new CubeInRotationTransformation(); 41 | case R.id.action_cube_out_depth: 42 | return new CubeOutDepthTransformation(); 43 | case R.id.action_cube_out_rotate: 44 | return new CubeOutRotationTransformation(); 45 | case R.id.action_cube_out_scaling: 46 | return new CubeOutScalingTransformation(); 47 | case R.id.action_depth_page: 48 | return new DepthPageTransformer(); 49 | case R.id.action_depth: 50 | return new DepthTransformation(); 51 | case R.id.action_fade_out: 52 | return new FadeOutTransformation(); 53 | case R.id.action_fan: 54 | return new FanTransformation(); 55 | case R.id.action_gate: 56 | return new GateTransformation(); 57 | case R.id.action_hinge: 58 | return new HingeTransformation(); 59 | case R.id.action_horizontal_flip: 60 | return new VerticalFlipTransformation(); 61 | case R.id.action_pop: 62 | return new PopTransformation(); 63 | case R.id.action_simple_transformation: 64 | return new SimpleTransformation(); 65 | case R.id.action_spinner: 66 | return new SpinnerTransformation(); 67 | case R.id.action_toss: 68 | return new TossTransformation(); 69 | case R.id.action_vertical_flip: 70 | return new HorizontalFlipTransformation(); 71 | case R.id.action_vertical_shut: 72 | return new VerticalShutTransformation(); 73 | case R.id.action_zoom_out: 74 | return new ZoomOutPageTransformer(); 75 | } 76 | 77 | return null; 78 | } 79 | } 80 | -------------------------------------------------------------------------------- /app/src/main/java/info/androidhive/viewpager2/fragments/EventsFragment.java: -------------------------------------------------------------------------------- 1 | package info.androidhive.viewpager2.fragments; 2 | 3 | import android.os.Bundle; 4 | import android.view.LayoutInflater; 5 | import android.view.View; 6 | import android.view.ViewGroup; 7 | 8 | import androidx.fragment.app.Fragment; 9 | 10 | import info.androidhive.viewpager2.R; 11 | 12 | public class EventsFragment extends Fragment { 13 | 14 | @Override 15 | public View onCreateView( 16 | LayoutInflater inflater, ViewGroup container, 17 | Bundle savedInstanceState 18 | ) { 19 | // Inflate the layout for this fragment 20 | return inflater.inflate(R.layout.fragment_events, container, false); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /app/src/main/java/info/androidhive/viewpager2/fragments/FragmentViewPagerActivity.java: -------------------------------------------------------------------------------- 1 | package info.androidhive.viewpager2.fragments; 2 | 3 | import android.os.Bundle; 4 | 5 | import androidx.annotation.NonNull; 6 | import androidx.appcompat.app.AppCompatActivity; 7 | import androidx.fragment.app.Fragment; 8 | import androidx.fragment.app.FragmentActivity; 9 | import androidx.viewpager2.adapter.FragmentStateAdapter; 10 | 11 | import com.google.android.material.tabs.TabLayoutMediator; 12 | 13 | import info.androidhive.viewpager2.databinding.ActivityFragmentViewPagerBinding; 14 | 15 | public class FragmentViewPagerActivity extends AppCompatActivity { 16 | 17 | ActivityFragmentViewPagerBinding binding; 18 | 19 | // tab titles 20 | private String[] titles = new String[]{"Movies", "Events", "Tickets"}; 21 | 22 | @Override 23 | protected void onCreate(Bundle savedInstanceState) { 24 | super.onCreate(savedInstanceState); 25 | binding = ActivityFragmentViewPagerBinding.inflate(getLayoutInflater()); 26 | setContentView(binding.getRoot()); 27 | init(); 28 | } 29 | 30 | private void init() { 31 | // removing toolbar elevation 32 | getSupportActionBar().setElevation(0); 33 | 34 | binding.viewPager.setAdapter(new ViewPagerFragmentAdapter(this)); 35 | 36 | // attaching tab mediator 37 | new TabLayoutMediator(binding.tabLayout, binding.viewPager, 38 | (tab, position) -> tab.setText(titles[position])).attach(); 39 | } 40 | 41 | private class ViewPagerFragmentAdapter extends FragmentStateAdapter { 42 | 43 | public ViewPagerFragmentAdapter(@NonNull FragmentActivity fragmentActivity) { 44 | super(fragmentActivity); 45 | } 46 | 47 | @NonNull 48 | @Override 49 | public Fragment createFragment(int position) { 50 | switch (position) { 51 | case 0: 52 | return new MoviesFragment(); 53 | case 1: 54 | return new EventsFragment(); 55 | case 2: 56 | return new TicketsFragment(); 57 | } 58 | return new MoviesFragment(); 59 | } 60 | 61 | @Override 62 | public int getItemCount() { 63 | return titles.length; 64 | } 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /app/src/main/java/info/androidhive/viewpager2/fragments/MoviesFragment.java: -------------------------------------------------------------------------------- 1 | package info.androidhive.viewpager2.fragments; 2 | 3 | import android.os.Bundle; 4 | import android.view.LayoutInflater; 5 | import android.view.View; 6 | import android.view.ViewGroup; 7 | 8 | import androidx.fragment.app.Fragment; 9 | 10 | import info.androidhive.viewpager2.R; 11 | 12 | public class MoviesFragment extends Fragment { 13 | 14 | @Override 15 | public View onCreateView( 16 | LayoutInflater inflater, ViewGroup container, 17 | Bundle savedInstanceState 18 | ) { 19 | // Inflate the layout for this fragment 20 | return inflater.inflate(R.layout.fragment_movies, container, false); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /app/src/main/java/info/androidhive/viewpager2/fragments/TicketsFragment.java: -------------------------------------------------------------------------------- 1 | package info.androidhive.viewpager2.fragments; 2 | 3 | import android.os.Bundle; 4 | import android.view.LayoutInflater; 5 | import android.view.View; 6 | import android.view.ViewGroup; 7 | 8 | import androidx.fragment.app.Fragment; 9 | 10 | import info.androidhive.viewpager2.R; 11 | 12 | public class TicketsFragment extends Fragment { 13 | 14 | @Override 15 | public View onCreateView( 16 | LayoutInflater inflater, ViewGroup container, 17 | Bundle savedInstanceState 18 | ) { 19 | // Inflate the layout for this fragment 20 | return inflater.inflate(R.layout.fragment_tickets, container, false); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /app/src/main/java/info/androidhive/viewpager2/transformers/AntiClockSpinTransformation.java: -------------------------------------------------------------------------------- 1 | package info.androidhive.viewpager2.transformers; 2 | 3 | import android.view.View; 4 | 5 | import androidx.viewpager2.widget.ViewPager2; 6 | 7 | public class AntiClockSpinTransformation implements ViewPager2.PageTransformer { 8 | @Override 9 | public void transformPage(View page, float position) { 10 | 11 | page.setTranslationX(-position * page.getWidth()); 12 | 13 | if (Math.abs(position) < 0.5) { 14 | page.setVisibility(View.VISIBLE); 15 | page.setScaleX(1 - Math.abs(position)); 16 | page.setScaleY(1 - Math.abs(position)); 17 | } else if (Math.abs(position) > 0.5) { 18 | page.setVisibility(View.GONE); 19 | } 20 | 21 | if (position < -1) { // [-Infinity,-1) 22 | // This page is way off-screen to the left. 23 | page.setAlpha(0); 24 | 25 | } else if (position <= 0) { // [-1,0] 26 | page.setAlpha(1); 27 | page.setRotation(360 * (1 - Math.abs(position))); 28 | 29 | } else if (position <= 1) { // (0,1] 30 | page.setAlpha(1); 31 | page.setRotation(-360 * (1 - Math.abs(position))); 32 | 33 | } else { // (1,+Infinity] 34 | // This page is way off-screen to the right. 35 | page.setAlpha(0); 36 | } 37 | } 38 | } -------------------------------------------------------------------------------- /app/src/main/java/info/androidhive/viewpager2/transformers/ClockSpinTransformation.java: -------------------------------------------------------------------------------- 1 | package info.androidhive.viewpager2.transformers; 2 | 3 | import android.view.View; 4 | 5 | import androidx.viewpager2.widget.ViewPager2; 6 | 7 | public class ClockSpinTransformation implements ViewPager2.PageTransformer { 8 | @Override 9 | public void transformPage(View page, float position) { 10 | 11 | page.setTranslationX(-position * page.getWidth()); 12 | 13 | if (Math.abs(position) <= 0.5) { 14 | page.setVisibility(View.VISIBLE); 15 | page.setScaleX(1 - Math.abs(position)); 16 | page.setScaleY(1 - Math.abs(position)); 17 | } else if (Math.abs(position) > 0.5) { 18 | page.setVisibility(View.GONE); 19 | } 20 | 21 | 22 | if (position < -1){ // [-Infinity,-1) 23 | // This page is way off-screen to the left. 24 | page.setAlpha(0); 25 | 26 | } 27 | else if (position <= 0) { // [-1,0] 28 | page.setAlpha(1); 29 | page.setRotation(360 * Math.abs(position)); 30 | 31 | } 32 | else if (position <= 1) { // (0,1] 33 | page.setAlpha(1); 34 | page.setRotation(-360 * Math.abs(position)); 35 | 36 | } 37 | else { // (1,+Infinity] 38 | // This page is way off-screen to the right. 39 | page.setAlpha(0); 40 | 41 | } 42 | 43 | 44 | } 45 | } -------------------------------------------------------------------------------- /app/src/main/java/info/androidhive/viewpager2/transformers/CubeInDepthTransformation.java: -------------------------------------------------------------------------------- 1 | package info.androidhive.viewpager2.transformers; 2 | 3 | import android.view.View; 4 | 5 | import androidx.viewpager2.widget.ViewPager2; 6 | 7 | public class CubeInDepthTransformation implements ViewPager2.PageTransformer { 8 | @Override 9 | public void transformPage(View page, float position) { 10 | page.setCameraDistance(20000); 11 | 12 | 13 | if (position < -1){ 14 | page.setAlpha(0); 15 | } 16 | else if (position <= 0){ 17 | page.setAlpha(1); 18 | page.setPivotX(page.getWidth()); 19 | page.setRotationY(90*Math.abs(position)); 20 | } 21 | else if (position <= 1){ 22 | page.setAlpha(1); 23 | page.setPivotX(0); 24 | page.setRotationY(-90*Math.abs(position)); 25 | } 26 | else{ 27 | page.setAlpha(0); 28 | } 29 | 30 | 31 | float max = Math.max(.4f, 1 - Math.abs(position)); 32 | if (Math.abs(position) <= 0.5){ 33 | page.setScaleY(max); 34 | } 35 | else if (Math.abs(position) <= 1){ 36 | page.setScaleY(max); 37 | 38 | } 39 | 40 | 41 | } 42 | } -------------------------------------------------------------------------------- /app/src/main/java/info/androidhive/viewpager2/transformers/CubeInRotationTransformation.java: -------------------------------------------------------------------------------- 1 | package info.androidhive.viewpager2.transformers; 2 | 3 | import android.view.View; 4 | 5 | import androidx.viewpager2.widget.ViewPager2; 6 | 7 | public class CubeInRotationTransformation implements ViewPager2.PageTransformer{ 8 | @Override 9 | public void transformPage(View page, float position) { 10 | 11 | page.setCameraDistance(20000); 12 | 13 | 14 | if (position < -1){ // [-Infinity,-1) 15 | // This page is way off-screen to the left. 16 | page.setAlpha(0); 17 | 18 | } 19 | else if (position <= 0){ // [-1,0] 20 | page.setAlpha(1); 21 | page.setPivotX(page.getWidth()); 22 | page.setRotationY(90*Math.abs(position)); 23 | 24 | } 25 | else if (position <= 1){ // (0,1] 26 | page.setAlpha(1); 27 | page.setPivotX(0); 28 | page.setRotationY(-90*Math.abs(position)); 29 | 30 | } 31 | else{ // (1,+Infinity] 32 | // This page is way off-screen to the right. 33 | page.setAlpha(0); 34 | 35 | } 36 | 37 | 38 | } 39 | } -------------------------------------------------------------------------------- /app/src/main/java/info/androidhive/viewpager2/transformers/CubeInScalingTransformation.java: -------------------------------------------------------------------------------- 1 | package info.androidhive.viewpager2.transformers; 2 | 3 | import android.view.View; 4 | 5 | import androidx.viewpager.widget.ViewPager; 6 | 7 | public class CubeInScalingTransformation implements ViewPager.PageTransformer { 8 | @Override 9 | public void transformPage(View page, float position) { 10 | page.setCameraDistance(20000); 11 | 12 | 13 | if (position < -1){ // [-Infinity,-1) 14 | // This page is way off-screen to the left. 15 | page.setAlpha(0); 16 | 17 | } 18 | else if (position <= 0){ // [-1,0] 19 | page.setAlpha(1); 20 | page.setPivotX(page.getWidth()); 21 | page.setRotationY(90*Math.abs(position)); 22 | 23 | } 24 | else if (position <= 1){ // (0,1] 25 | page.setAlpha(1); 26 | page.setPivotX(0); 27 | page.setRotationY(-90*Math.abs(position)); 28 | 29 | } 30 | else{ // (1,+Infinity] 31 | // This page is way off-screen to the right. 32 | page.setAlpha(0); 33 | 34 | } 35 | 36 | 37 | 38 | if (Math.abs(position) <= 0.5){ 39 | page.setScaleY(Math.max(.4f,1-Math.abs(position))); 40 | } 41 | else if (Math.abs(position) <= 1){ 42 | page.setScaleY(Math.max(.4f,Math.abs(position))); 43 | 44 | } 45 | 46 | 47 | } 48 | } -------------------------------------------------------------------------------- /app/src/main/java/info/androidhive/viewpager2/transformers/CubeOutDepthTransformation.java: -------------------------------------------------------------------------------- 1 | package info.androidhive.viewpager2.transformers; 2 | 3 | import android.view.View; 4 | 5 | import androidx.viewpager2.widget.ViewPager2; 6 | 7 | public class CubeOutDepthTransformation implements ViewPager2.PageTransformer { 8 | @Override 9 | public void transformPage(View page, float position) { 10 | 11 | if (position < -1){ // [-Infinity,-1) 12 | // This page is way off-screen to the left. 13 | page.setAlpha(0); 14 | 15 | } 16 | else if (position <= 0) { // [-1,0] 17 | page.setAlpha(1); 18 | page.setPivotX(page.getWidth()); 19 | page.setRotationY(-90 * Math.abs(position)); 20 | 21 | } 22 | else if (position <= 1){ // (0,1] 23 | page.setAlpha(1); 24 | page.setPivotX(0); 25 | page.setRotationY(90 * Math.abs(position)); 26 | 27 | } 28 | else { // (1,+Infinity] 29 | // This page is way off-screen to the right. 30 | page.setAlpha(0); 31 | 32 | } 33 | 34 | 35 | 36 | if (Math.abs(position) <= 0.5){ 37 | page.setScaleY(Math.max(0.4f,1-Math.abs(position))); 38 | } 39 | else if (Math.abs(position) <= 1){ 40 | page.setScaleY(Math.max(0.4f,1-Math.abs(position))); 41 | } 42 | 43 | 44 | } 45 | } -------------------------------------------------------------------------------- /app/src/main/java/info/androidhive/viewpager2/transformers/CubeOutRotationTransformation.java: -------------------------------------------------------------------------------- 1 | package info.androidhive.viewpager2.transformers; 2 | 3 | import android.view.View; 4 | 5 | import androidx.viewpager.widget.ViewPager; 6 | import androidx.viewpager2.widget.ViewPager2; 7 | 8 | public class CubeOutRotationTransformation implements ViewPager2.PageTransformer { 9 | @Override 10 | public void transformPage(View page, float position) { 11 | 12 | if (position < -1) { // [-Infinity,-1) 13 | // This page is way off-screen to the left. 14 | page.setAlpha(0); 15 | 16 | } else if (position <= 0) { // [-1,0] 17 | page.setAlpha(1); 18 | page.setPivotX(page.getWidth()); 19 | page.setRotationY(-90 * Math.abs(position)); 20 | 21 | } else if (position <= 1) { // (0,1] 22 | page.setAlpha(1); 23 | page.setPivotX(0); 24 | page.setRotationY(90 * Math.abs(position)); 25 | 26 | } else { // (1,+Infinity] 27 | // This page is way off-screen to the right. 28 | page.setAlpha(0); 29 | } 30 | } 31 | } -------------------------------------------------------------------------------- /app/src/main/java/info/androidhive/viewpager2/transformers/CubeOutScalingTransformation.java: -------------------------------------------------------------------------------- 1 | package info.androidhive.viewpager2.transformers; 2 | 3 | import android.view.View; 4 | 5 | import androidx.viewpager2.widget.ViewPager2; 6 | 7 | public class CubeOutScalingTransformation implements ViewPager2.PageTransformer{ 8 | @Override 9 | public void transformPage(View page, float position) { 10 | 11 | if (position < -1){ // [-Infinity,-1) 12 | // This page is way off-screen to the left. 13 | page.setAlpha(0); 14 | 15 | } 16 | else if (position <= 0) { // [-1,0] 17 | page.setAlpha(1); 18 | page.setPivotX(page.getWidth()); 19 | page.setRotationY(-90 * Math.abs(position)); 20 | 21 | } 22 | else if (position <= 1){ // (0,1] 23 | page.setAlpha(1); 24 | page.setPivotX(0); 25 | page.setRotationY(90 * Math.abs(position)); 26 | 27 | } 28 | else { // (1,+Infinity] 29 | // This page is way off-screen to the right. 30 | page.setAlpha(0); 31 | 32 | } 33 | 34 | 35 | 36 | if (Math.abs(position) <= 0.5){ 37 | page.setScaleY(Math.max(0.4f,1-Math.abs(position))); 38 | } 39 | else if (Math.abs(position) <= 1){ 40 | page.setScaleY(Math.max(0.4f,Math.abs(position))); 41 | } 42 | 43 | 44 | } 45 | } -------------------------------------------------------------------------------- /app/src/main/java/info/androidhive/viewpager2/transformers/DepthPageTransformer.java: -------------------------------------------------------------------------------- 1 | package info.androidhive.viewpager2.transformers; 2 | 3 | import android.os.Build; 4 | import android.view.View; 5 | 6 | import androidx.annotation.RequiresApi; 7 | import androidx.viewpager2.widget.ViewPager2; 8 | 9 | @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) 10 | public class DepthPageTransformer implements ViewPager2.PageTransformer { 11 | private static final float MIN_SCALE = 0.75f; 12 | 13 | public void transformPage(View view, float position) { 14 | int pageWidth = view.getWidth(); 15 | 16 | if (position < -1) { // [-Infinity,-1) 17 | // This page is way off-screen to the left. 18 | view.setAlpha(0f); 19 | 20 | } else if (position <= 0) { // [-1,0] 21 | // Use the default slide transition when moving to the left page 22 | view.setAlpha(1f); 23 | view.setTranslationX(0f); 24 | view.setTranslationZ(0f); 25 | view.setScaleX(1f); 26 | view.setScaleY(1f); 27 | 28 | } else if (position <= 1) { // (0,1] 29 | // Fade the page out. 30 | view.setAlpha(1 - position); 31 | 32 | // Counteract the default slide transition 33 | view.setTranslationX(pageWidth * -position); 34 | // Move it behind the left page 35 | view.setTranslationZ(-1f); 36 | 37 | // Scale the page down (between MIN_SCALE and 1) 38 | float scaleFactor = MIN_SCALE 39 | + (1 - MIN_SCALE) * (1 - Math.abs(position)); 40 | view.setScaleX(scaleFactor); 41 | view.setScaleY(scaleFactor); 42 | 43 | } else { // (1,+Infinity] 44 | // This page is way off-screen to the right. 45 | view.setAlpha(0f); 46 | } 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /app/src/main/java/info/androidhive/viewpager2/transformers/DepthTransformation.java: -------------------------------------------------------------------------------- 1 | package info.androidhive.viewpager2.transformers; 2 | 3 | import android.view.View; 4 | 5 | import androidx.viewpager2.widget.ViewPager2; 6 | 7 | public class DepthTransformation implements ViewPager2.PageTransformer{ 8 | @Override 9 | public void transformPage(View page, float position) { 10 | 11 | if (position < -1){ // [-Infinity,-1) 12 | // This page is way off-screen to the left. 13 | page.setAlpha(0); 14 | 15 | } 16 | else if (position <= 0){ // [-1,0] 17 | page.setAlpha(1); 18 | page.setTranslationX(0); 19 | page.setScaleX(1); 20 | page.setScaleY(1); 21 | 22 | } 23 | else if (position <= 1){ // (0,1] 24 | page.setTranslationX(-position*page.getWidth()); 25 | page.setAlpha(1-Math.abs(position)); 26 | page.setScaleX(1-Math.abs(position)); 27 | page.setScaleY(1-Math.abs(position)); 28 | 29 | } 30 | else { // (1,+Infinity] 31 | // This page is way off-screen to the right. 32 | page.setAlpha(0); 33 | 34 | } 35 | 36 | 37 | } 38 | } -------------------------------------------------------------------------------- /app/src/main/java/info/androidhive/viewpager2/transformers/FadeOutTransformation.java: -------------------------------------------------------------------------------- 1 | package info.androidhive.viewpager2.transformers; 2 | 3 | import android.view.View; 4 | 5 | import androidx.viewpager2.widget.ViewPager2; 6 | 7 | public class FadeOutTransformation implements ViewPager2.PageTransformer{ 8 | @Override 9 | public void transformPage(View page, float position) { 10 | 11 | page.setTranslationX(-position*page.getWidth()); 12 | 13 | page.setAlpha(1-Math.abs(position)); 14 | 15 | 16 | } 17 | } -------------------------------------------------------------------------------- /app/src/main/java/info/androidhive/viewpager2/transformers/FanTransformation.java: -------------------------------------------------------------------------------- 1 | package info.androidhive.viewpager2.transformers; 2 | 3 | import android.view.View; 4 | 5 | import androidx.viewpager2.widget.ViewPager2; 6 | 7 | public class FanTransformation implements ViewPager2.PageTransformer{ 8 | @Override 9 | public void transformPage(View page, float position) { 10 | 11 | page.setTranslationX(-position*page.getWidth()); 12 | page.setPivotX(0); 13 | page.setPivotY(page.getHeight()/2); 14 | page.setCameraDistance(20000); 15 | 16 | if (position < -1){ // [-Infinity,-1) 17 | // This page is way off-screen to the left. 18 | page.setAlpha(0); 19 | 20 | } 21 | else if (position <= 0){ // [-1,0] 22 | page.setAlpha(1); 23 | page.setRotationY(-120*Math.abs(position)); 24 | } 25 | else if (position <= 1){ // (0,1] 26 | page.setAlpha(1); 27 | page.setRotationY(120*Math.abs(position)); 28 | 29 | } 30 | else { // (1,+Infinity] 31 | // This page is way off-screen to the right. 32 | page.setAlpha(0); 33 | 34 | } 35 | 36 | 37 | } 38 | } -------------------------------------------------------------------------------- /app/src/main/java/info/androidhive/viewpager2/transformers/FidgetSpinTransformation.java: -------------------------------------------------------------------------------- 1 | package info.androidhive.viewpager2.transformers; 2 | 3 | import android.view.View; 4 | 5 | import androidx.viewpager2.widget.ViewPager2; 6 | 7 | public class FidgetSpinTransformation implements ViewPager2.PageTransformer { 8 | @Override 9 | public void transformPage(View page, float position) { 10 | 11 | page.setTranslationX(-position * page.getWidth()); 12 | 13 | if (Math.abs(position) < 0.5) { 14 | page.setVisibility(View.VISIBLE); 15 | page.setScaleX(1 - Math.abs(position)); 16 | page.setScaleY(1 - Math.abs(position)); 17 | } else if (Math.abs(position) > 0.5) { 18 | page.setVisibility(View.GONE); 19 | } 20 | 21 | if (position < -1) { // [-Infinity,-1) 22 | // This page is way off-screen to the left. 23 | page.setAlpha(0); 24 | 25 | } else if (position <= 0) { // [-1,0] 26 | page.setAlpha(1); 27 | page.setRotation(36000 * (Math.abs(position) * Math.abs(position) * Math.abs(position) * Math.abs(position) * Math.abs(position) * Math.abs(position) * Math.abs(position))); 28 | 29 | } else if (position <= 1) { // (0,1] 30 | page.setAlpha(1); 31 | page.setRotation(-36000 * (Math.abs(position) * Math.abs(position) * Math.abs(position) * Math.abs(position) * Math.abs(position) * Math.abs(position) * Math.abs(position))); 32 | 33 | } else { // (1,+Infinity] 34 | // This page is way off-screen to the right. 35 | page.setAlpha(0); 36 | 37 | } 38 | 39 | 40 | } 41 | } -------------------------------------------------------------------------------- /app/src/main/java/info/androidhive/viewpager2/transformers/GateTransformation.java: -------------------------------------------------------------------------------- 1 | package info.androidhive.viewpager2.transformers; 2 | 3 | import android.view.View; 4 | 5 | import androidx.viewpager2.widget.ViewPager2; 6 | 7 | public class GateTransformation implements ViewPager2.PageTransformer{ 8 | 9 | private String TAG = "GateAnimationn"; 10 | @Override 11 | public void transformPage(View page, float position) { 12 | 13 | page.setTranslationX(-position*page.getWidth()); 14 | 15 | 16 | 17 | if (position<-1){ // [-Infinity,-1) 18 | // This page is way off-screen to the left. 19 | page.setAlpha(0); 20 | 21 | } 22 | else if (position<=0){ // [-1,0] 23 | page.setAlpha(1); 24 | page.setPivotX(0); 25 | page.setRotationY(90*Math.abs(position)); 26 | 27 | } 28 | else if (position <=1){ // (0,1] 29 | page.setAlpha(1); 30 | page.setPivotX(page.getWidth()); 31 | page.setRotationY(-90*Math.abs(position)); 32 | 33 | }else { // (1,+Infinity] 34 | // This page is way off-screen to the right. 35 | page.setAlpha(0); 36 | 37 | } 38 | 39 | 40 | } 41 | } -------------------------------------------------------------------------------- /app/src/main/java/info/androidhive/viewpager2/transformers/HingeTransformation.java: -------------------------------------------------------------------------------- 1 | package info.androidhive.viewpager2.transformers; 2 | 3 | import android.view.View; 4 | 5 | import androidx.viewpager2.widget.ViewPager2; 6 | 7 | public class HingeTransformation implements ViewPager2.PageTransformer{ 8 | @Override 9 | public void transformPage(View page, float position) { 10 | 11 | page.setTranslationX(-position*page.getWidth()); 12 | page.setPivotX(0); 13 | page.setPivotY(0); 14 | 15 | 16 | if (position < -1){ // [-Infinity,-1) 17 | // This page is way off-screen to the left. 18 | page.setAlpha(0); 19 | 20 | } 21 | else if (position <= 0){ // [-1,0] 22 | page.setRotation(90*Math.abs(position)); 23 | page.setAlpha(1-Math.abs(position)); 24 | 25 | } 26 | else if (position <= 1){ // (0,1] 27 | page.setRotation(0); 28 | page.setAlpha(1); 29 | 30 | } 31 | else { // (1,+Infinity] 32 | // This page is way off-screen to the right. 33 | page.setAlpha(0); 34 | 35 | } 36 | 37 | 38 | } 39 | } -------------------------------------------------------------------------------- /app/src/main/java/info/androidhive/viewpager2/transformers/HorizontalFlipTransformation.java: -------------------------------------------------------------------------------- 1 | package info.androidhive.viewpager2.transformers; 2 | 3 | import android.view.View; 4 | 5 | import androidx.viewpager2.widget.ViewPager2; 6 | 7 | public class HorizontalFlipTransformation implements ViewPager2.PageTransformer { 8 | @Override 9 | public void transformPage(View page, float position) { 10 | 11 | page.setTranslationX(-position * page.getWidth()); 12 | page.setCameraDistance(12000); 13 | 14 | if (position < 0.5 && position > -0.5) { 15 | page.setVisibility(View.VISIBLE); 16 | } else { 17 | page.setVisibility(View.INVISIBLE); 18 | } 19 | 20 | 21 | if (position < -1) { // [-Infinity,-1) 22 | page.setAlpha(0); 23 | 24 | } else if (position <= 0) { // [-1,0] 25 | page.setAlpha(1); 26 | page.setRotationY(180 * (1 - Math.abs(position) + 1)); 27 | 28 | } else if (position <= 1) { // (0,1] 29 | page.setAlpha(1); 30 | page.setRotationY(-180 * (1 - Math.abs(position) + 1)); 31 | 32 | } else { 33 | page.setAlpha(0); 34 | } 35 | } 36 | } -------------------------------------------------------------------------------- /app/src/main/java/info/androidhive/viewpager2/transformers/PopTransformation.java: -------------------------------------------------------------------------------- 1 | package info.androidhive.viewpager2.transformers; 2 | 3 | import android.view.View; 4 | 5 | import androidx.viewpager2.widget.ViewPager2; 6 | 7 | public class PopTransformation implements ViewPager2.PageTransformer { 8 | @Override 9 | public void transformPage(View page, float position) { 10 | 11 | page.setTranslationX(-position * page.getWidth()); 12 | 13 | if (Math.abs(position) < 0.5) { 14 | page.setVisibility(View.VISIBLE); 15 | page.setScaleX(1 - Math.abs(position)); 16 | page.setScaleY(1 - Math.abs(position)); 17 | } else if (Math.abs(position) > 0.5) { 18 | page.setVisibility(View.GONE); 19 | } 20 | 21 | 22 | } 23 | } -------------------------------------------------------------------------------- /app/src/main/java/info/androidhive/viewpager2/transformers/SimpleTransformation.java: -------------------------------------------------------------------------------- 1 | package info.androidhive.viewpager2.transformers; 2 | 3 | import android.view.View; 4 | 5 | import androidx.viewpager2.widget.ViewPager2; 6 | 7 | public class SimpleTransformation implements ViewPager2.PageTransformer { 8 | @Override 9 | public void transformPage(View page, float position) { 10 | 11 | } 12 | } -------------------------------------------------------------------------------- /app/src/main/java/info/androidhive/viewpager2/transformers/SpinnerTransformation.java: -------------------------------------------------------------------------------- 1 | package info.androidhive.viewpager2.transformers; 2 | 3 | import android.view.View; 4 | 5 | import androidx.viewpager2.widget.ViewPager2; 6 | 7 | public class SpinnerTransformation implements ViewPager2.PageTransformer { 8 | @Override 9 | public void transformPage(View page, float position) { 10 | 11 | page.setTranslationX(-position * page.getWidth()); 12 | page.setCameraDistance(12000); 13 | 14 | if (position < 0.5 && position > -0.5) { 15 | page.setVisibility(View.VISIBLE); 16 | } else { 17 | page.setVisibility(View.INVISIBLE); 18 | } 19 | 20 | 21 | 22 | if (position < -1){ // [-Infinity,-1) 23 | // This page is way off-screen to the left. 24 | page.setAlpha(0); 25 | 26 | } 27 | else if (position <= 0) { // [-1,0] 28 | page.setAlpha(1); 29 | page.setRotationY(900 *(1-Math.abs(position)+1)); 30 | 31 | } 32 | else if (position <= 1) { // (0,1] 33 | page.setAlpha(1); 34 | page.setRotationY(-900 *(1-Math.abs(position)+1)); 35 | 36 | } 37 | else { // (1,+Infinity] 38 | // This page is way off-screen to the right. 39 | page.setAlpha(0); 40 | 41 | } 42 | 43 | 44 | } 45 | } -------------------------------------------------------------------------------- /app/src/main/java/info/androidhive/viewpager2/transformers/TossTransformation.java: -------------------------------------------------------------------------------- 1 | package info.androidhive.viewpager2.transformers; 2 | 3 | import android.view.View; 4 | 5 | import androidx.viewpager2.widget.ViewPager2; 6 | 7 | public class TossTransformation implements ViewPager2.PageTransformer { 8 | @Override 9 | public void transformPage(View page, float position) { 10 | 11 | page.setTranslationX(-position * page.getWidth()); 12 | page.setCameraDistance(20000); 13 | 14 | 15 | if (position < 0.5 && position > -0.5) { 16 | page.setVisibility(View.VISIBLE); 17 | 18 | } else { 19 | page.setVisibility(View.INVISIBLE); 20 | 21 | } 22 | 23 | 24 | if (position < -1) { // [-Infinity,-1) 25 | // This page is way off-screen to the left. 26 | page.setAlpha(0); 27 | 28 | } 29 | else if (position <= 0) { // [-1,0] 30 | page.setAlpha(1); 31 | page.setScaleX(Math.max(0.4f, (1 - Math.abs(position)))); 32 | page.setScaleY(Math.max(0.4f, (1 - Math.abs(position)))); 33 | page.setRotationX(1080 * (1 - Math.abs(position) + 1)); 34 | page.setTranslationY(-1000*Math.abs(position)); 35 | 36 | } 37 | else if (position <= 1) { // (0,1] 38 | page.setAlpha(1); 39 | page.setScaleX(Math.max(0.4f, (1-Math.abs(position)))); 40 | page.setScaleY(Math.max(0.4f, (1-Math.abs(position)))); 41 | page.setRotationX(-1080 * (1 - Math.abs(position) + 1)); 42 | page.setTranslationY(-1000*Math.abs(position)); 43 | 44 | } 45 | else { // (1,+Infinity] 46 | // This page is way off-screen to the right. 47 | page.setAlpha(0); 48 | 49 | } 50 | } 51 | } -------------------------------------------------------------------------------- /app/src/main/java/info/androidhive/viewpager2/transformers/VerticalFlipTransformation.java: -------------------------------------------------------------------------------- 1 | package info.androidhive.viewpager2.transformers; 2 | 3 | import android.util.Log; 4 | import android.view.View; 5 | 6 | import androidx.viewpager2.widget.ViewPager2; 7 | 8 | public class VerticalFlipTransformation implements ViewPager2.PageTransformer { 9 | @Override 10 | public void transformPage(View page, float position) { 11 | 12 | page.setTranslationX(-position*page.getWidth()); 13 | page.setCameraDistance(20000); 14 | 15 | if (position < 0.5 && position > -0.5){ 16 | page.setVisibility(View.VISIBLE); 17 | } 18 | else { 19 | page.setVisibility(View.INVISIBLE); 20 | } 21 | 22 | 23 | 24 | if (position < -1){ // [-Infinity,-1) 25 | // This page is way off-screen to the left. 26 | page.setAlpha(0); 27 | 28 | } 29 | else if (position <= 0 ){ // [-1,0] 30 | page.setAlpha(1); 31 | page.setRotationX(180*(1-Math.abs(position)+1)); 32 | Log.e("HORIZONTAL", "position <= 0 " + (180 * (1 - Math.abs(position) + 1))); 33 | 34 | } 35 | else if (position <= 1){ // (0,1] 36 | page.setAlpha(1); 37 | page.setRotationX(-180*(1-Math.abs(position)+1)); 38 | Log.e("HORIZONTAL", "position <= 1 " + (-180 * (1 - Math.abs(position) + 1))); 39 | 40 | } 41 | else { // (1,+Infinity] 42 | // This page is way off-screen to the right. 43 | page.setAlpha(0); 44 | 45 | } 46 | 47 | 48 | } 49 | } -------------------------------------------------------------------------------- /app/src/main/java/info/androidhive/viewpager2/transformers/VerticalShutTransformation.java: -------------------------------------------------------------------------------- 1 | package info.androidhive.viewpager2.transformers; 2 | 3 | import android.view.View; 4 | 5 | import androidx.viewpager2.widget.ViewPager2; 6 | 7 | public class VerticalShutTransformation implements ViewPager2.PageTransformer{ 8 | @Override 9 | public void transformPage(View page, float position) { 10 | 11 | page.setTranslationX(-position*page.getWidth()); 12 | page.setCameraDistance(999999999); 13 | 14 | if (position < 0.5 && position > -0.5){ 15 | page.setVisibility(View.VISIBLE); 16 | } 17 | else { 18 | page.setVisibility(View.INVISIBLE); 19 | } 20 | 21 | 22 | 23 | if (position < -1){ // [-Infinity,-1) 24 | // This page is way off-screen to the left. 25 | page.setAlpha(0); 26 | 27 | } 28 | else if (position <= 0 ){ // [-1,0] 29 | page.setAlpha(1); 30 | page.setRotationX(180*(1-Math.abs(position)+1)); 31 | 32 | } 33 | else if (position <= 1){ // (0,1] 34 | page.setAlpha(1); 35 | page.setRotationX(-180*(1-Math.abs(position)+1)); 36 | 37 | } 38 | else { // (1,+Infinity] 39 | // This page is way off-screen to the right. 40 | page.setAlpha(0); 41 | 42 | } 43 | 44 | 45 | } 46 | } -------------------------------------------------------------------------------- /app/src/main/java/info/androidhive/viewpager2/transformers/ZoomInTransformer.java: -------------------------------------------------------------------------------- 1 | package info.androidhive.viewpager2.transformers; 2 | 3 | import android.view.View; 4 | 5 | import androidx.annotation.NonNull; 6 | import androidx.viewpager2.widget.ViewPager2; 7 | 8 | public class ZoomInTransformer implements ViewPager2.PageTransformer { 9 | public static final float MAX_ROTATION = 90.0f; 10 | 11 | @Override 12 | public void transformPage(@NonNull View page, float position) { 13 | final float scale = position < 0 ? position + 1f : Math.abs(1f - position); 14 | page.setScaleX(scale); 15 | page.setScaleY(scale); 16 | page.setPivotX(page.getWidth() * 0.5f); 17 | page.setPivotY(page.getHeight() * 0.5f); 18 | page.setAlpha(position < -1f || position > 1f ? 0f : 1f - (scale - 1f)); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /app/src/main/java/info/androidhive/viewpager2/transformers/ZoomOutPageTransformer.java: -------------------------------------------------------------------------------- 1 | package info.androidhive.viewpager2.transformers; 2 | 3 | import android.view.View; 4 | 5 | import androidx.viewpager2.widget.ViewPager2; 6 | 7 | public class ZoomOutPageTransformer implements ViewPager2.PageTransformer { 8 | private static final float MIN_SCALE = 0.85f; 9 | private static final float MIN_ALPHA = 0.5f; 10 | 11 | public void transformPage(View view, float position) { 12 | int pageWidth = view.getWidth(); 13 | int pageHeight = view.getHeight(); 14 | 15 | if (position < -1) { // [-Infinity,-1) 16 | // This page is way off-screen to the left. 17 | view.setAlpha(0f); 18 | 19 | } else if (position <= 1) { // [-1,1] 20 | // Modify the default slide transition to shrink the page as well 21 | float scaleFactor = Math.max(MIN_SCALE, 1 - Math.abs(position)); 22 | float vertMargin = pageHeight * (1 - scaleFactor) / 2; 23 | float horzMargin = pageWidth * (1 - scaleFactor) / 2; 24 | if (position < 0) { 25 | view.setTranslationX(horzMargin - vertMargin / 2); 26 | } else { 27 | view.setTranslationX(-horzMargin + vertMargin / 2); 28 | } 29 | 30 | // Scale the page down (between MIN_SCALE and 1) 31 | view.setScaleX(scaleFactor); 32 | view.setScaleY(scaleFactor); 33 | 34 | // Fade the page relative to its size. 35 | view.setAlpha(MIN_ALPHA + 36 | (scaleFactor - MIN_SCALE) / 37 | (1 - MIN_SCALE) * (1 - MIN_ALPHA)); 38 | 39 | } else { // (1,+Infinity] 40 | // This page is way off-screen to the right. 41 | view.setAlpha(0f); 42 | } 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /app/src/main/java/info/androidhive/viewpager2/views/ViewsSliderActivity.java: -------------------------------------------------------------------------------- 1 | package info.androidhive.viewpager2.views; 2 | 3 | import android.os.Bundle; 4 | import android.text.Html; 5 | import android.view.LayoutInflater; 6 | import android.view.MenuInflater; 7 | import android.view.View; 8 | import android.view.ViewGroup; 9 | import android.widget.TextView; 10 | import android.widget.Toast; 11 | 12 | import androidx.annotation.NonNull; 13 | import androidx.appcompat.app.AppCompatActivity; 14 | import androidx.appcompat.widget.PopupMenu; 15 | import androidx.recyclerview.widget.RecyclerView; 16 | import androidx.viewpager2.widget.ViewPager2; 17 | 18 | import info.androidhive.viewpager2.R; 19 | import info.androidhive.viewpager2.Utils; 20 | import info.androidhive.viewpager2.databinding.ActivityViewsSliderBinding; 21 | 22 | public class ViewsSliderActivity extends AppCompatActivity { 23 | private ViewsSliderAdapter mAdapter; 24 | private TextView[] dots; 25 | private int[] layouts; 26 | private ActivityViewsSliderBinding binding; 27 | 28 | @Override 29 | protected void onCreate(Bundle savedInstanceState) { 30 | super.onCreate(savedInstanceState); 31 | binding = ActivityViewsSliderBinding.inflate(getLayoutInflater()); 32 | setContentView(binding.getRoot()); 33 | init(); 34 | } 35 | 36 | private void init() { 37 | // layouts of all welcome sliders 38 | // add few more layouts if you want 39 | layouts = new int[]{ 40 | R.layout.slide_one, 41 | R.layout.slide_two, 42 | R.layout.slide_three, 43 | R.layout.slide_four}; 44 | 45 | mAdapter = new ViewsSliderAdapter(); 46 | binding.viewPager.setAdapter(mAdapter); 47 | binding.viewPager.registerOnPageChangeCallback(pageChangeCallback); 48 | 49 | binding.btnSkip.setOnClickListener(v -> launchHomeScreen()); 50 | 51 | binding.btnNext.setOnClickListener(v -> { 52 | // checking for last page 53 | // if last page home screen will be launched 54 | int current = getItem(+1); 55 | if (current < layouts.length) { 56 | // move to next screen 57 | binding.viewPager.setCurrentItem(current); 58 | } else { 59 | launchHomeScreen(); 60 | } 61 | }); 62 | 63 | binding.iconMore.setOnClickListener(view -> { 64 | showMenu(view); 65 | }); 66 | 67 | // adding bottom dots 68 | addBottomDots(0); 69 | } 70 | 71 | /* 72 | * Adds bottom dots indicator 73 | * */ 74 | private void addBottomDots(int currentPage) { 75 | dots = new TextView[layouts.length]; 76 | 77 | int[] colorsActive = getResources().getIntArray(R.array.array_dot_active); 78 | int[] colorsInactive = getResources().getIntArray(R.array.array_dot_inactive); 79 | 80 | binding.layoutDots.removeAllViews(); 81 | for (int i = 0; i < dots.length; i++) { 82 | dots[i] = new TextView(this); 83 | dots[i].setText(Html.fromHtml("•")); 84 | dots[i].setTextSize(35); 85 | dots[i].setTextColor(colorsInactive[currentPage]); 86 | binding.layoutDots.addView(dots[i]); 87 | } 88 | 89 | if (dots.length > 0) 90 | dots[currentPage].setTextColor(colorsActive[currentPage]); 91 | } 92 | 93 | private int getItem(int i) { 94 | return binding.viewPager.getCurrentItem() + i; 95 | } 96 | 97 | private void launchHomeScreen() { 98 | Toast.makeText(this, R.string.slides_ended, Toast.LENGTH_LONG).show(); 99 | finish(); 100 | } 101 | 102 | private void showMenu(View view) { 103 | PopupMenu popup = new PopupMenu(this, view); 104 | MenuInflater inflater = popup.getMenuInflater(); 105 | inflater.inflate(R.menu.pager_transformers, popup.getMenu()); 106 | popup.setOnMenuItemClickListener(item -> { 107 | if (item.getItemId() == R.id.action_orientation) { 108 | binding.viewPager.setOrientation(ViewPager2.ORIENTATION_VERTICAL); 109 | } else { 110 | binding.viewPager.setPageTransformer(Utils.getTransformer(item.getItemId())); 111 | binding.viewPager.setCurrentItem(0); 112 | binding.viewPager.getAdapter().notifyDataSetChanged(); 113 | } 114 | return false; 115 | }); 116 | popup.show(); 117 | } 118 | 119 | /* 120 | * ViewPager page change listener 121 | */ 122 | ViewPager2.OnPageChangeCallback pageChangeCallback = new ViewPager2.OnPageChangeCallback() { 123 | @Override 124 | public void onPageSelected(int position) { 125 | super.onPageSelected(position); 126 | addBottomDots(position); 127 | 128 | // changing the next button text 'NEXT' / 'GOT IT' 129 | if (position == layouts.length - 1) { 130 | // last page. make button text to GOT IT 131 | binding.btnNext.setText(getString(R.string.start)); 132 | binding.btnSkip.setVisibility(View.GONE); 133 | } else { 134 | // still pages are left 135 | binding.btnNext.setText(getString(R.string.next)); 136 | binding.btnSkip.setVisibility(View.VISIBLE); 137 | } 138 | } 139 | }; 140 | 141 | public class ViewsSliderAdapter extends RecyclerView.Adapter { 142 | 143 | public ViewsSliderAdapter() { 144 | } 145 | 146 | @NonNull 147 | @Override 148 | public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { 149 | View view = LayoutInflater.from(parent.getContext()) 150 | .inflate(viewType, parent, false); 151 | return new SliderViewHolder(view); 152 | } 153 | 154 | @Override 155 | public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) { 156 | 157 | } 158 | 159 | @Override 160 | public int getItemViewType(int position) { 161 | return layouts[position]; 162 | } 163 | 164 | @Override 165 | public int getItemCount() { 166 | return layouts.length; 167 | } 168 | 169 | public class SliderViewHolder extends RecyclerView.ViewHolder { 170 | public TextView title, year, genre; 171 | 172 | public SliderViewHolder(View view) { 173 | super(view); 174 | } 175 | } 176 | } 177 | } 178 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_discount.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ravi8x/ViewPager2-Examples/220a1ea8f65e93f1641b28f971b2c3740230953b/app/src/main/res/drawable-hdpi/ic_discount.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_food.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ravi8x/ViewPager2-Examples/220a1ea8f65e93f1641b28f971b2c3740230953b/app/src/main/res/drawable-hdpi/ic_food.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_movie.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ravi8x/ViewPager2-Examples/220a1ea8f65e93f1641b28f971b2c3740230953b/app/src/main/res/drawable-hdpi/ic_movie.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_travel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ravi8x/ViewPager2-Examples/220a1ea8f65e93f1641b28f971b2c3740230953b/app/src/main/res/drawable-hdpi/ic_travel.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_discount.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ravi8x/ViewPager2-Examples/220a1ea8f65e93f1641b28f971b2c3740230953b/app/src/main/res/drawable-mdpi/ic_discount.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_food.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ravi8x/ViewPager2-Examples/220a1ea8f65e93f1641b28f971b2c3740230953b/app/src/main/res/drawable-mdpi/ic_food.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_movie.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ravi8x/ViewPager2-Examples/220a1ea8f65e93f1641b28f971b2c3740230953b/app/src/main/res/drawable-mdpi/ic_movie.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_travel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ravi8x/ViewPager2-Examples/220a1ea8f65e93f1641b28f971b2c3740230953b/app/src/main/res/drawable-mdpi/ic_travel.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-v24/ic_launcher_foreground.xml: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | 15 | 18 | 21 | 22 | 23 | 24 | 30 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_discount.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ravi8x/ViewPager2-Examples/220a1ea8f65e93f1641b28f971b2c3740230953b/app/src/main/res/drawable-xhdpi/ic_discount.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_food.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ravi8x/ViewPager2-Examples/220a1ea8f65e93f1641b28f971b2c3740230953b/app/src/main/res/drawable-xhdpi/ic_food.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_movie.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ravi8x/ViewPager2-Examples/220a1ea8f65e93f1641b28f971b2c3740230953b/app/src/main/res/drawable-xhdpi/ic_movie.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_travel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ravi8x/ViewPager2-Examples/220a1ea8f65e93f1641b28f971b2c3740230953b/app/src/main/res/drawable-xhdpi/ic_travel.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_discount.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ravi8x/ViewPager2-Examples/220a1ea8f65e93f1641b28f971b2c3740230953b/app/src/main/res/drawable-xxhdpi/ic_discount.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_food.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ravi8x/ViewPager2-Examples/220a1ea8f65e93f1641b28f971b2c3740230953b/app/src/main/res/drawable-xxhdpi/ic_food.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_movie.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ravi8x/ViewPager2-Examples/220a1ea8f65e93f1641b28f971b2c3740230953b/app/src/main/res/drawable-xxhdpi/ic_movie.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_travel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ravi8x/ViewPager2-Examples/220a1ea8f65e93f1641b28f971b2c3740230953b/app/src/main/res/drawable-xxhdpi/ic_travel.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_discount.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ravi8x/ViewPager2-Examples/220a1ea8f65e93f1641b28f971b2c3740230953b/app/src/main/res/drawable-xxxhdpi/ic_discount.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_food.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ravi8x/ViewPager2-Examples/220a1ea8f65e93f1641b28f971b2c3740230953b/app/src/main/res/drawable-xxxhdpi/ic_food.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_movie.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ravi8x/ViewPager2-Examples/220a1ea8f65e93f1641b28f971b2c3740230953b/app/src/main/res/drawable-xxxhdpi/ic_movie.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_travel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ravi8x/ViewPager2-Examples/220a1ea8f65e93f1641b28f971b2c3740230953b/app/src/main/res/drawable-xxxhdpi/ic_travel.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_more_vert_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | 15 | 20 | 25 | 30 | 35 | 40 | 45 | 50 | 55 | 60 | 65 | 70 | 75 | 80 | 85 | 90 | 95 | 100 | 105 | 110 | 115 | 120 | 125 | 130 | 135 | 140 | 145 | 150 | 155 | 160 | 165 | 170 | 171 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_fragment_view_pager.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 15 | 16 | 21 | 22 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 10 | 11 | 17 | 18 | 24 | 25 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_views_slider.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 13 | 14 | 22 | 23 | 29 | 30 |