Create amazing view pager using wowo view pager in android studio
view pager
wowo
android studio
- By Code solution
- Jan 20th, 2021
- 0 comments
- 1
Create amazing view pager using wowo view pager in the Android application.
Creating New Project
- Create a new project in Android Studio from File ⇒ New Project. When selecting Empty Activity and proceed.
- Add WoWoViewPager dependency to your build.gradle and rebuild the project.
dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation 'com.android.support:appcompat-v7:27.1.1' implementation 'com.android.support:design:27.+' implementation 'com.android.support.constraint:constraint-layout:1.1.0' testImplementation 'junit:junit:4.12' androidTestImplementation 'com.android.support.test:runner:1.0.1' androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1' implementation 'com.android.support.constraint:constraint-layout:1.0.2' implementation 'com.nightonke:wowoviewpager:2.0.0' }
Choosing the Colors
- Open colors.xml located under res ⇒ values and add the below color values.
colors.XML
<?xml version="1.0" encoding="utf-8"?> <resources> <color name="colorPrimary">#3F51B5</color> <color name="colorPrimaryDark">#303F9F</color> <color name="colorAccent">#FF4081</color> <color name="rocket_fire">#EFC75E</color> <color name="blue_1">#eae9fe</color> <color name="blue_2">#ccc8fc</color> <color name="blue_3">#ada8fb</color> <color name="blue_4">#8f87f9</color> <color name="blue_5">#7067f8</color> </resources>
- Open Style.xml located under res ⇒ values and add the below values.
<resources> <!-- Base application theme. --> <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> <!-- Customize your theme here. --> <item name="colorPrimary">@color/colorPrimary</item> <item name="colorPrimaryDark">@color/colorPrimaryDark</item> <item name="colorAccent">@color/colorAccent</item> </style> <style name="AppTheme.hide" parent="Theme.AppCompat.Light.DarkActionBar"> <!-- Customize your theme here. --> <item name="colorPrimary">@color/colorPrimary</item> <item name="colorPrimaryDark">@color/colorPrimaryDark</item> <item name="colorAccent">@color/colorAccent</item> <item name="windowActionBar">false</item> <item name="windowNoTitle">true</item> </style> <style name="AppTheme.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar" /> <style name="AppTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Light" /> <style name="AppTheme.hide.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar" /> <style name="AppTheme.hide.PopupOverlay" parent="ThemeOverlay.AppCompat.Light" /> </resources>
- Create background_corner.xml located under res ⇒ drawable and add the below values.
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" > <corners android:radius="5dp"/> <solid android:color="#05502f"/> </shape>
- Create background_gray_black_circle .xml located under res ⇒ drawable and add the below values.
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval" > <solid android:color="#f9dc0a"/> </shape>
Create four XML layouts named activity_intro.xml under res ⇒ layouts.
<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/base" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_gravity="center" tools:context=".IntroActivity"> <com.nightonke.wowoviewpager.WoWoViewPager android:id="@+id/wowo_viewpager" android:layout_width="match_parent" android:layout_height="match_parent" /> <View android:id="@+id/circle" android:layout_width="10dp" android:layout_height="10dp" android:layout_gravity="center_horizontal" android:layout_marginTop="-20dp" android:background="@drawable/background_gray_black_circle" /> <FrameLayout android:id="@+id/login_layout" android:layout_width="250dp" android:layout_height="300dp" android:layout_marginTop="50dp" android:background="@drawable/background_corner" android:layout_gravity="center"> <EditText android:id="@+id/username" android:layout_width="200dp" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:layout_marginTop="40dp" android:hint="Username"/> <EditText android:id="@+id/password" android:layout_width="200dp" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:layout_marginTop="100dp" android:hint="Password"/> <Button android:id="@+id/button" android:layout_width="200dp" android:layout_height="wrap_content" android:text="Sign In" android:layout_marginBottom="20dp" android:layout_gravity="bottom|center_horizontal"/> </FrameLayout> <TextView android:id="@+id/text" android:layout_width="200dp" android:layout_height="wrap_content" android:maxLines="1" android:gravity="center" android:textColor="#05502f" android:layout_gravity="center" android:textSize="20sp" android:layout_marginTop="100dp"/> <ImageView android:id="@+id/planet_target" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/planet_target" tools:ignore="ContentDescription" android:visibility="invisible"/> <ImageView android:id="@+id/meteor" android:layout_width="100dp" android:layout_height="100dp" android:src="@drawable/meteor" android:layout_marginLeft="-100dp" tools:ignore="ContentDescription" /> <ImageView android:id="@+id/planet_0" android:layout_width="150dp" android:layout_height="150dp" android:src="@drawable/planet_0" android:layout_marginTop="-150dp" tools:ignore="ContentDescription" /> <ImageView android:id="@+id/planet_1" android:layout_width="150dp" android:layout_height="150dp" android:src="@drawable/planet_1" android:layout_gravity="center_vertical|right" android:layout_marginRight="-150dp" tools:ignore="ContentDescription" /> <ImageView android:id="@+id/earth" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/earth" tools:ignore="ContentDescription" android:visibility="invisible"/> <com.nightonke.wowoviewpager.WoWoPathView android:id="@+id/path_view" android:layout_width="match_parent" android:layout_height="match_parent" app:wowo_pathColor="@color/rocket_fire" app:wowo_pathWidth="2dp" app:wowo_dynamicPath="true" app:wowo_headImageSrc="@drawable/rocket" app:wowo_headImageWidth="60dp" /> <ImageView android:id="@+id/cloud_red" android:layout_width="150dp" android:layout_height="150dp" android:layout_marginLeft="40dp" android:layout_marginTop="130dp" android:src="@drawable/cloud_red" tools:ignore="ContentDescription" /> <ImageView android:id="@+id/cloud_yellow" android:layout_width="150dp" android:layout_height="150dp" android:src="@drawable/cloud_yellow" android:layout_marginLeft="100dp" android:layout_marginTop="50dp" tools:ignore="ContentDescription" /> <ImageView android:id="@+id/cloud_blue" android:layout_width="150dp" android:layout_height="150dp" android:src="@drawable/cloud_blue" android:layout_marginLeft="200dp" android:layout_marginTop="150dp" android:visibility="invisible" tools:ignore="ContentDescription" /> </FrameLayout>
- Create WoWoActivity.java and modify the code as below.
package com.wapptech.waytofeed; import android.os.Bundle; import android.support.v4.content.ContextCompat; import android.support.v4.view.ViewPager; import android.support.v7.app.AppCompatActivity; import android.view.Window; import android.view.WindowManager; import android.widget.TextView; import com.nightonke.wowoviewpager.Enum.Ease; import com.nightonke.wowoviewpager.WoWoViewPager; import com.nightonke.wowoviewpager.WoWoViewPagerAdapter; public abstract class WoWoActivity extends AppCompatActivity { protected WoWoViewPager wowo; protected int ease = Ease.Linear; protected boolean useSameEaseTypeBack = true; protected TextView pageNumber; protected abstract int contentViewRes(); protected int fragmentNumber() { return 5; } protected Integer[] fragmentColorsRes() { return new Integer[]{ R.color.blue_1, R.color.blue_2, R.color.blue_3, R.color.blue_4, R.color.blue_5 }; } protected int screenW; protected int screenH; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getWindow().requestFeature(Window.FEATURE_ACTION_BAR); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); setContentView(contentViewRes()); init(); wowo = (WoWoViewPager)findViewById(R.id.wowo_viewpager); wowo.setAdapter(WoWoViewPagerAdapter.builder() .fragmentManager(getSupportFragmentManager()) .count(fragmentNumber()) // Fragment Count .colorsRes(fragmentColorsRes()) // Colors of fragments .build()); setPageTV(wowo); // pageNumber = (TextView) findViewById(R.id.page); screenW = WoWoUtil.getScreenWidth(this); screenH = WoWoUtil.getScreenHeight(this); } protected int color(int colorRes) { return ContextCompat.getColor(this, colorRes); } private void setPageTV(WoWoViewPager wowo) { wowo.addOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { @Override public void onPageSelected(int position) { super.onPageSelected(position); if (pageNumber != null) pageNumber.setText(String.valueOf(position)); } }); } private void init() { useSameEaseTypeBack = getIntent().getBooleanExtra("useSameEaseTypeBack", true); int easeEnumNumber = getIntent().getIntExtra("easeType", -1); switch (easeEnumNumber) { case 0: ease = Ease.Linear; break; case 1: ease = Ease.InSine; break; case 2: ease = Ease.OutSine; break; case 3: ease = Ease.InOutSine; break; case 4: ease = Ease.InQuad; break; case 5: ease = Ease.OutQuad; break; case 6: ease = Ease.InOutQuad; break; case 7: ease = Ease.InCubic; break; case 8: ease = Ease.OutCubic; break; case 9: ease = Ease.InOutCubic; break; case 10: ease = Ease.InQuart; break; case 11: ease = Ease.OutQuart; break; case 12: ease = Ease.InOutQuart; break; case 13: ease = Ease.InQuint; break; case 14: ease = Ease.OutQuint; break; case 15: ease = Ease.InOutQuint; break; case 16: ease = Ease.InExpo; break; case 17: ease = Ease.OutExpo; break; case 18: ease = Ease.InOutExpo; break; case 19: ease = Ease.InCirc; break; case 20: ease = Ease.OutCirc; break; case 21: ease = Ease.InOutCirc; break; case 22: ease = Ease.InBack; break; case 23: ease = Ease.OutBack; break; case 24: ease = Ease.InOutBack; break; case 25: ease = Ease.InElastic; break; case 26: ease = Ease.OutElastic; break; case 27: ease = Ease.InOutElastic; break; case 28: ease = Ease.InBounce; break; case 29: ease = Ease.OutBounce; break; case 30: ease = Ease.InOutBounce; break; } } protected int dp2px(float dp) { return WoWoUtil.dp2px((int) dp, this); } protected int dp2px(double dp) { return WoWoUtil.dp2px((int) dp, this); } }
- Create WoWoUtil.java and modify the code as below.
package com.wapptech.waytofeed; import android.app.Activity; import android.content.Context; import android.graphics.Point; import android.util.DisplayMetrics; import android.view.Display; class WoWoUtil { private static int screenWidth = -1; private static int screenHeight = -1; /** * get the screen width in pixels * @param context * @return */ public static int getScreenWidth(Context context) { if (screenWidth == -1) { Display display = ((Activity)context).getWindowManager().getDefaultDisplay(); Point size = new Point(); display.getSize(size); screenWidth = size.x; } return screenWidth; } /** * get the screen height in pixels * @param context * @return */ public static int getScreenHeight(Context context) { if (screenHeight == -1) { Display display = ((Activity)context).getWindowManager().getDefaultDisplay(); Point size = new Point(); display.getSize(size); screenHeight = size.y; } return screenHeight; } /** * dp to px * @param dp * @param mContext * @return */ public static int dp2px(int dp, Context mContext) { DisplayMetrics displayMetrics = mContext.getResources().getDisplayMetrics(); int px = Math.round(dp * (displayMetrics.xdpi / DisplayMetrics.DENSITY_DEFAULT)); return px; } private static WoWoUtil ourInstance = new WoWoUtil(); public static WoWoUtil getInstance() { return ourInstance; } private WoWoUtil() { } }
- Create IntroActivity.java and modify the code as below.
package com.wapptech.waytofeed; import android.graphics.Color; import android.os.Build; import android.support.v4.view.ViewPager; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.ImageView; import com.nightonke.wowoviewpager.Animation.WoWoAlphaAnimation; import com.nightonke.wowoviewpager.Animation.WoWoElevationAnimation; import com.nightonke.wowoviewpager.Animation.WoWoPathAnimation; import com.nightonke.wowoviewpager.Animation.WoWoRotationAnimation; import com.nightonke.wowoviewpager.Animation.WoWoScaleAnimation; import com.nightonke.wowoviewpager.Animation.WoWoShapeColorAnimation; import com.nightonke.wowoviewpager.Animation.WoWoTextViewColorAnimation; import com.nightonke.wowoviewpager.Animation.WoWoTextViewTextAnimation; import com.nightonke.wowoviewpager.Animation.WoWoTranslationAnimation; import com.nightonke.wowoviewpager.Enum.Ease; import com.nightonke.wowoviewpager.WoWoPathView; public class IntroActivity extends WoWoActivity { private int r; private boolean animationAdded = false; private ImageView targetPlanet; private View loginLayout; @Override protected int contentViewRes() { return R.layout.activity_intro; } @Override protected int fragmentNumber() { return 4; } @Override protected Integer[] fragmentColorsRes() { return new Integer[]{ R.color.white, R.color.white, R.color.white, R.color.white, }; } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); r = (int)Math.sqrt(screenW * screenW + screenH * screenH) + 10; ImageView earth = (ImageView) findViewById(R.id.earth); targetPlanet = (ImageView) findViewById(R.id.planet_target); loginLayout = findViewById(R.id.login_layout); earth.setY(screenH / 2); targetPlanet.setY(-screenH / 2 - screenW / 2); targetPlanet.setScaleX(0.25f); targetPlanet.setScaleY(0.25f); wowo.addTemporarilyInvisibleViews(0, earth, findViewById(R.id.cloud_blue), findViewById(R.id.cloud_red)); wowo.addTemporarilyInvisibleViews(0, targetPlanet); wowo.addTemporarilyInvisibleViews(2, loginLayout, findViewById(R.id.button)); } @Override public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); addAnimations(); } private void addAnimations() { if (animationAdded) return; animationAdded = true; addEarthAnimation(); addCloudAnimation(); addTextAnimation(); addRocketAnimation(); addCircleAnimation(); addMeteorAnimation(); addPlanetAnimation(); addPlanetTargetAnimation(); addLoginLayoutAnimation(); addButtonAnimation(); addEditTextAnimation(); wowo.ready(); // Do this the prevent the edit-text and button views on login layout // to intercept the drag event. wowo.addOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { super.onPageScrolled(position, positionOffset, positionOffsetPixels); loginLayout.setEnabled(position == 3); loginLayout.setVisibility(position + positionOffset <= 2 ? View.INVISIBLE : View.VISIBLE); } }); } private void addEarthAnimation() { View earth = findViewById(R.id.earth); wowo.addAnimation(earth) .add(WoWoRotationAnimation.builder().page(0).keepX(0).keepY(0).fromZ(0).toZ(180).ease(Ease.OutBack).build()) .add(WoWoRotationAnimation.builder().page(1).keepX(0).keepY(0).fromZ(180).toZ(720).ease(Ease.OutBack).build()) .add(WoWoRotationAnimation.builder().page(2).keepX(0).keepY(0).fromZ(720).toZ(1260).ease(Ease.OutBack).build()) .add(WoWoScaleAnimation.builder().page(1).fromXY(1).toXY(0.5).ease(Ease.OutBack).build()) .add(WoWoScaleAnimation.builder().page(2).fromXY(0.5).toXY(0.25).ease(Ease.OutBack).build()); } private void addCloudAnimation() { wowo.addAnimation(findViewById(R.id.cloud_blue)) .add(WoWoTranslationAnimation.builder().page(0).fromX(screenW).toX(0).keepY(0).ease(Ease.OutBack).sameEaseBack(false).build()) .add(WoWoTranslationAnimation.builder().page(1).fromX(0).toX(screenW).keepY(0).ease(Ease.InBack).sameEaseBack(false).build()); wowo.addAnimation(findViewById(R.id.cloud_red)) .add(WoWoTranslationAnimation.builder().page(0).fromX(-screenW).toX(0).keepY(0).ease(Ease.OutBack).sameEaseBack(false).build()) .add(WoWoTranslationAnimation.builder().page(1).fromX(0).toX(-screenW).keepY(0).ease(Ease.InBack).sameEaseBack(false).build()); wowo.addAnimation(findViewById(R.id.cloud_yellow)) .add(WoWoTranslationAnimation.builder().page(0).keepX(0).fromY(0).toY(dp2px(50)).ease(Ease.OutBack).sameEaseBack(false).build()) .add(WoWoTranslationAnimation.builder().page(1).fromX(0).toX(-screenW).keepY(dp2px(50)).ease(Ease.InBack).sameEaseBack(false).build()); } private void addTextAnimation() { View text = findViewById(R.id.text); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) text.setZ(50); String[] texts = new String[]{ "HOME?", "OR SKY?", "OR UNIVERSE?", "Let's Discover More!", }; wowo.addAnimation(text) .add(WoWoTextViewTextAnimation.builder().page(0).from(texts[0]).to(texts[1]).build()) .add(WoWoTextViewTextAnimation.builder().page(1).from(texts[1]).to(texts[2]).build()) .add(WoWoTextViewTextAnimation.builder().page(2).from(texts[2]).to(texts[3]).build()) .add(WoWoTextViewColorAnimation.builder().page(1).from("#05502f").to(Color.WHITE).build()); } private void addRocketAnimation() { WoWoPathView pathView = (WoWoPathView) findViewById(R.id.path_view); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) pathView.setZ(50); // For different screen size, try to adjust the scale values to see the airplane. float xScale = 1; float yScale = 1; pathView.newPath() .pathMoveTo(xScale * (-100), screenH - 100) .pathCubicTo(screenW / 2, screenH - 100, screenW / 2, screenH - 100, screenW / 2, yScale * (-100)); wowo.addAnimation(pathView) .add(WoWoPathAnimation.builder().page(0).from(0).to(0.50).path(pathView).build()) .add(WoWoPathAnimation.builder().page(1).from(0.50).to(0.75).path(pathView).build()) .add(WoWoPathAnimation.builder().page(2).from(0.75).to(1).path(pathView).build()) .add(WoWoAlphaAnimation.builder().page(2).from(1).to(0).build()); } private void addCircleAnimation() { View circle = findViewById(R.id.circle); wowo.addAnimation(circle) .add(WoWoScaleAnimation.builder().page(1).fromXY(1).toXY(r * 2 / circle.getWidth()).build()) .add(WoWoShapeColorAnimation.builder().page(1).from("#f9dc0a").to("#05502f").build()); } private void addMeteorAnimation() { View meteor = findViewById(R.id.meteor); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) meteor.setZ(50); float fullOffset = screenW + meteor.getWidth(); float offset = fullOffset / 2; wowo.addAnimation(meteor) .add(WoWoTranslationAnimation.builder().page(1) .fromX(0).fromY(0) .toX(offset).toY(offset).ease(Ease.OutBack).sameEaseBack(false).build()) .add(WoWoTranslationAnimation.builder().page(2) .fromX(offset).fromY(offset) .toX(fullOffset).toY(fullOffset).ease(Ease.InBack).sameEaseBack(false).build()); } private void addPlanetAnimation() { View planet0 = findViewById(R.id.planet_0); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) planet0.setZ(50); wowo.addAnimation(planet0) .add(WoWoTranslationAnimation.builder().page(1) .keepX(0) .fromY(0).toY(planet0.getHeight() + 200) .ease(Ease.OutBack).sameEaseBack(false).build()) .add(WoWoTranslationAnimation.builder().page(2) .fromX(0).toX(screenW) .keepY(planet0.getHeight() + 200) .ease(Ease.InBack).sameEaseBack(false).build()); View planet1 = findViewById(R.id.planet_1); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) planet1.setZ(50); wowo.addAnimation(planet1) .add(WoWoTranslationAnimation.builder().page(1) .fromX(0).toX(-planet1.getWidth()) .keepY(0) .ease(Ease.OutBack).sameEaseBack(false).build()) .add(WoWoTranslationAnimation.builder().page(2) .fromX(-planet1.getWidth()).toX(-screenW - planet1.getWidth()) .keepY(0) .ease(Ease.InBack).sameEaseBack(false).build()); } private void addPlanetTargetAnimation() { wowo.addAnimation(targetPlanet) .add(WoWoRotationAnimation.builder().page(1).keepX(0).keepY(0).fromZ(0).toZ(180).ease(Ease.OutBack).build()) .add(WoWoRotationAnimation.builder().page(2).keepX(0).keepY(0).fromZ(180).toZ(360).ease(Ease.OutBack).build()) .add(WoWoTranslationAnimation.builder().page(0).keepX(0) .fromY(-screenH / 2 - screenW / 2) .toY(-screenH / 2).ease(Ease.OutBack).sameEaseBack(false).build()) .add(WoWoScaleAnimation.builder().page(1).fromXY(0.25).toXY(0.5).ease(Ease.OutBack).build()) .add(WoWoScaleAnimation.builder().page(2).fromXY(0.5).toXY(1).ease(Ease.OutBack).build()); } private void addLoginLayoutAnimation() { View layout = findViewById(R.id.login_layout); wowo.addAnimation(layout) .add(WoWoAlphaAnimation.builder().page(1).start(1).end(1).from(0).to(1).build()) .add(WoWoShapeColorAnimation.builder().page(2).from("#05502f").to("#0aa05f").build()) .add(WoWoElevationAnimation.builder().page(2).from(0).to(40).build()); } private void addButtonAnimation() { View button = findViewById(R.id.button); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) button.setZ(50); wowo.addAnimation(button) .add(WoWoAlphaAnimation.builder().page(2).from(0).to(1).build()); } private void addEditTextAnimation() { wowo.addAnimation(findViewById(R.id.username)) .add(WoWoAlphaAnimation.builder().page(2).from(0).to(1).build()); wowo.addAnimation(findViewById(R.id.password)) .add(WoWoAlphaAnimation.builder().page(2).from(0).to(1).build()); } }
- After Finally open AndroidManifest.XML and make IntroActivity as launcher activity.
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.wapptech.menu"> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@android:style/Theme.Light.NoTitleBar"> <activity android:name=".IntroActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>