Android Library for making animated tutorials inside your app

Overview

##SlidingTutorial Awesome Header image

Cleveroad introduces Sliding Tutorial Library for Android

Hey guys, hope you haven’t started developing a tutorial for your Android app yet, as we have already completed a part of your job. Don’t worry, we act from good motives only. Our aim is to help you create a sliding tutorial in a fast and simple manner. So we’ve done some work and voila!. A simple Android Sliding Tutorial library is at your service.

Demo image

Also you can watch the animation of the Sliding Tutorial for Android on YouTube in HD quality.

The invention is going to ease the problem of structural design but not to limit a stretch of your imagination at the same time. We took care of the suitability aspect. So, your app is not going to look alien among other Android elements.

Read our Case Study: Sliding tutorial for Android by Cleveroad to make sure that you don’t miss a detail:

Article image

Applied parallax effects will make your product presentation look like Google apps tutorial.

All you need to do is:
1. Create background designs for each screen of your tutorial (assistance with mobile design)
2. Create icons for each screen of your tutorial
3. Follow the instructions below

Awesome

Full Documentation

Setup

To include this library to your project add dependency in build.gradle file:

    dependencies {
        implementation "com.cleveroad:slidingtutorial:1.0.9"
    }

Quick Start

Migrations

See all migration manuals.

Changelog

See changelog history.

Support

If you have any questions regarding the use of this tutorial, please contact us for support at [email protected] (email subject: «Sliding Tutorial: Android. Support request.»)
or
Use our contacts:
Cleveroad.com
Facebook account
Twitter account
Google+ account

License

    The MIT License (MIT)

    Copyright (c) 2015-2016 Cleveroad

    Permission is hereby granted, free of charge, to any person obtaining a copy
    of this software and associated documentation files (the "Software"), to deal
    in the Software without restriction, including without limitation the rights
    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
    copies of the Software, and to permit persons to whom the Software is
    furnished to do so, subject to the following conditions:

    The above copyright notice and this permission notice shall be included in all
    copies or substantial portions of the Software.

    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
    SOFTWARE.
Comments
  • java.lang.IndexOutOfBoundsException: Invalid index 2, size is 2

    java.lang.IndexOutOfBoundsException: Invalid index 2, size is 2

    I am using Android studio 2.3, Sliding Tutuorial 1.0.8. The following exception occurs if slide fast.

    java.lang.IndexOutOfBoundsException: Invalid index 2, size is 2
                                                         at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
                                                         at java.util.ArrayList.get(ArrayList.java:308)
                                                         at android.support.v4.view.ViewPager.getChildDrawingOrder(ViewPager.java:828)
                                                         at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2166)
                                                         at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2553)
                                                         at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2197)
                                                         at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2553)
                                                         at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2197)
                                                         at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2553)
                                                         at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2197)
                                                         at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2553)
                                                         at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2197)
                                                         at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2553)
                                                         at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2197)
                                                         at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2553)
                                                         at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2197)
                                                         at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2553)
                                                         at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2197)
                                                         at com.android.internal.policy.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2403)
                                                         at com.android.internal.policy.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1737)
                                                         at android.app.Activity.dispatchTouchEvent(Activity.java:2771)
                                                         at android.support.v7.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:71)
                                                         at com.android.internal.policy.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2364)
                                                         at android.view.View.dispatchPointerEvent(View.java:9520)
                                                         at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:4238)
                                                         at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4104)
                                                         at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3650)
                                                         at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3703)
                                                         at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3669)
                                                         at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3795)
                                                         at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3677)
                                                         at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3852)
                                                         at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3650)
                                                         at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3703)
                                                         at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3669)
                                                         at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3677)
                                                         at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3650)
                                                         at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:5932)
                                                         at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:5906)
                                                         at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:5867)
                                                         at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:6035)
                                                         at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185)
                                                         at android.os.MessageQueue.nativePollOnce(Native Method)
                                                         at android.os.MessageQueue.next(MessageQueue.java:323)
                                                         at android.os.Looper.loop(Looper.java:135)
                                                         at android.app.ActivityThread.main(ActivityThread.java:5422)
                                                         at java.lang.reflect.Method.invoke(Native Method)
                                                         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
                                                         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
    
    
    opened by louisyonge 9
  • How to solve manifest merger failed

    How to solve manifest merger failed

    the error info :

    Error:Execution failed for task ':lib:processDebugAndroidTestManifest'. java.lang.RuntimeException: Manifest merger failed : Attribute [email protected] value=(@string/app_name) from [debug] AndroidManifest.xml:11:9-41 is also present at [com.cleveroad:slidingtutorial:0.9.4] AndroidManifest.xml:13:9-44 value=(@string/st_app_name). Suggestion: add 'tools:replace="android:label"' to element at manifestMerger41941130476540702.xml:7:5-9:19 to override.

    but I had add tools:replace="android:label to my application tag

    opened by Andecy 8
  • Change indicator color?

    Change indicator color?

    I simply want to change the non-selected and selected colors but i seems i need to set some sort of renderer before it will draw them? If i don't specify one the indicator is now invisible, can i not use the "default" renderer?

    bug 
    opened by broakenmedia 6
  • addOnTutorialPageChangeListener giving a nullPointerException

    addOnTutorialPageChangeListener giving a nullPointerException

    I have implemented this tutorial directly in my tutorial activity using this code:

    private void replaceTutorialFragment() {
        final IndicatorOptions indicatorOptions = IndicatorOptions.newBuilder(this)
                .build();
        final TutorialOptions tutorialOptions = TutorialFragment.newTutorialOptionsBuilder(this)
                .setUseAutoRemoveTutorialFragment(false)
                .setUseInfiniteScroll(false)
                .setPagesColors(mPagesColors)
                .setPagesCount(TOTAL_PAGES)
                .setIndicatorOptions(indicatorOptions)
                .setTutorialPageProvider(new TutorialPagesProvider())
                .setOnSkipClickListener(new OnSkipClickListener(this))
                .build();
        final TutorialFragment tutorialFragment = TutorialFragment.newInstance(tutorialOptions);
        getFragmentManager()
                .beginTransaction()
                .replace(R.id.container, tutorialFragment)
                .commit();    
    }
    

    Just like you've done in your MainActivity.java inside the Sample dir.

    I also added the following code in the above block:

    tutorialFragment.addOnTutorialPageChangeListener(new OnTutorialPageChangeListener() {
            @Override
            public void onPageChanged(int position) {
                Log.d("TAGG","Position: " + position);
            }
        });
    

    to listen to page changes but this is giving me a NullPointerException.

    Caused by: java.lang.NullPointerException
        at com.cleveroad.slidingtutorial.TutorialFragment.addOnTutorialPageChangeListener(TutorialFragment.java:199)
        at spoonmoon.com.m******21.TutorialActivity.replaceTutorialFragment(TutorialActivity.java:73)
    

    Also to mention. Without the pageChangeListener the tutorial is working fine.

    Am I doing anything wrong?

    opened by srujanb 5
  • What happens when they get to the end of the tutorial?

    What happens when they get to the end of the tutorial?

    On the last slide, how do i get the "Complete" button to appear? There appears to be no way to close the tutorial other than pressing Skip, which is un-intuitive to the user

    opened by broakenmedia 5
  • java.lang.NullPointerException

    java.lang.NullPointerException

    Hi I am getting this error.

    Exception in MessageQueue callback: handleReceiveCallback
    java.lang.NullPointerException: Attempt to read from field 'int android.view.View.mViewFlags' on a null object reference
         at android.view.ViewGroup.canViewReceivePointerEvents(ViewGroup.java:2317)
         at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2035)
         at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2406)
         at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2050)
         at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2406)
         at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2050)
         at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2406)
         at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2050)
         at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2406)
         at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2050)
         at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2406)
         at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2050)
         at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2406)
         at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2050)
         at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2625)
         at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1770)
         at android.app.Activity.dispatchTouchEvent(Activity.java:2742)
         at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2586)
         at android.view.View.dispatchPointerEvent(View.java:8675)
         at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:4129)
         at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:3995)
         at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3550)
         at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3603)
         at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3569)
         at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3686)
         at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3577)
         at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3743)
         at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3550)
         at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3603)
         at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3569)
         at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3577)
         at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3550)
         at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:5813)
         at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:5787)
         at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:5758)
         at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:5903)
         at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185)
         at android.os.MessageQueue.nativePollOnce(Native Method)
         at android.os.MessageQueue.next(MessageQueue.java:143)
         at android.os.Looper.loop(Looper.java:122)
         at android.app.ActivityThread.main(ActivityThread.java:5294)
         at java.lang.reflect.Method.invoke(Native Method)
         at java.lang.reflect.Method.invoke(Method.java:372)
         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904)
         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:699)
    
    opened by rafa19 4
  • First of all Nice work... I have one problem, How can i make fragment images Clickable? I want to change the fragment on click of any image aslo. For that do i have to modify

    First of all Nice work... I have one problem, How can i make fragment images Clickable? I want to change the fragment on click of any image aslo. For that do i have to modify "PageFragment.java" ? Thank you.

    First of all Nice work... I have one problem, How can i make fragment images Clickable? I want to change the fragment on click of any image aslo. For that do i have to modify "PageFragment.java" ? Thanks you.

    question 
    opened by VishalDalve 4
  • suggestion

    suggestion

    In my APP,I want go to next activity when selecting the last page . This is my code: setUseAutoRemoveTutorialFragment(true) I find the activity,include Tutirual,perform an empty page,rather than liking the skip click events.

    question 
    opened by MissMyDearBear 4
  • Page indicator position

    Page indicator position

    I didn't find an ability to place indicator on arbitrary place on screen. For example I need to put indicator to top of screen. Please add an ability of layout_gravity for indicators

    opened by paul-ovchinnikov 4
  • Add findViewById in fragment method of library

    Add findViewById in fragment method of library

    Hello, I want to call the findViewById of an UI Component of my fragment xml... But the tutorialOptions instance return getActivity and getView in null... And I dont have the possibillity of call the findViewById. If you need more information for understand the problem please tell me...

    I hope that you can help me.

    Thanks.

    Example

     public void replaceTutorialFragment() {
            final IndicatorOptions indicatorOptions = IndicatorOptions.newBuilder(this)
                    .build();
            final TutorialOptions tutorialOptions = TutorialFragment.newTutorialOptionsBuilder(this)
                    .setUseAutoRemoveTutorialFragment(true)
                    .setUseInfiniteScroll(true)
                    .setPagesColors(mPagesColors)
                    .setPagesCount(TOTAL_PAGES)
                    .setIndicatorOptions(indicatorOptions)
                    .setTutorialPageProvider(new TutorialPagesProvider())
                    .setOnSkipClickListener(new OnSkipClickListener(this))
                    .build();
            final TutorialFragment tutorialFragment = TutorialFragment.newInstance(tutorialOptions);
            getFragmentManager()
                    .beginTransaction()
                    .replace(R.id.container, tutorialFragment)
                    .commit();
    
    
    
    //This is the test, but tutorialOptions return any options in null
    (ImageView) imgView = (ImageView)tutorialOptions.getActivity().findViewById(R.id.img_view_test);
    
    if(imgView != null){
    
    } 
    }
    
    opened by fabian7593 3
  • TutorialSupportFragment.newInstance returns TutorialFragment instead of TutorialSupportFragment

    TutorialSupportFragment.newInstance returns TutorialFragment instead of TutorialSupportFragment

    final TutorialSupportFragment tutorialFragment = TutorialSupportFragment.newInstance(tutorialOptions);

    The compiler throws up an error when using this code

    opened by smabbasdev 3
  • AndroidX?

    AndroidX?

    opened by jacobmattsson 2
  • Using the library

    Using the library

    Couldn't understand how to use it in my own app (creating the tutorial using the lib)... can someone make a video or explain it to a kinda beginner (hi) please? sorry for bothering and thanks in advance!

    opened by NiDaAppDev 0
  • Attempt to invoke virtual method isMoveOnlyForward() on a null object reference

    Attempt to invoke virtual method isMoveOnlyForward() on a null object reference

    Getting this issue. How to fix this? I am implementing Custom Support Fragment. I am using AndroidX.

    java.lang.NullPointerException: Attempt to invoke virtual method 'boolean com.cleveroad.slidingtutorial.TutorialOptions.isMoveOnlyForward()' on a null object reference

    opened by malwinder-s 0
  • RTL, Intferface when the user finished the tutorial & completed button

    RTL, Intferface when the user finished the tutorial & completed button

    Added an almost full support in RTL, an Hebrew translation, "Done" button in the last slide & an interface which is called when the user slide the last slide.

    Thanks for making this library, it helped me a lot!

    opened by Frayo44 0
Owner
Cleveroad
Professional web and mobile development company. Full-cycle IT development!
Cleveroad
An Android library that allows you to easily create applications with slide-in menus. You may use it in your Android apps provided that you cite this project and include the license in your app. Thanks!

SlidingMenu (Play Store Demo) SlidingMenu is an Open Source Android library that allows developers to easily create applications with sliding menus li

Jeremy Feinstein 11.1k Nov 21, 2022
The flexible, easy to use, all in one drawer library for your Android project. Now brand new with material 2 design.

MaterialDrawer ... the flexible, easy to use, all in one drawer library for your Android project. What's included ?? • Setup ??️ • Migration Guide ??

Mike Penz 11.6k Dec 1, 2022
A flexible, easy to use, unique drawer library for your Android project.

Duo Navigation Drawer This Android library provides an easy way to create an alternative navigation drawer for android. Instead of a drawer that slide

PSD 1.1k Nov 17, 2022
Alligator is a modern Android navigation library that will help to organize your navigation code in clean and testable way.

Alligator Alligator is a modern Android navigation library that will help to organize your navigation code in clean and testable way. Features Any app

Artur Artikov 291 Nov 24, 2022
Navigation Component: THE BEST WAY to create navigation flows for your app

LIVE #017 - Navigation Component: A MELHOR FORMA de criar fluxos de navegação para o seu app! Código fonte do projeto criado na live #017, ensinando c

Kaique Ocanha 4 Jun 15, 2022
Dismiss your keyboard by tapping anywhere outside it.

Keyboard Dismisser What is this? Keyboard Dismisser is a simple library that allows you to dismiss keyboard by tapping anywhere outside it. Currently

Gabriel Samojło 49 Nov 28, 2021
Xdimen - Support multiple screen sizes easily by scaling your dimensions

Support multiple screen sizes easily by scaling your dimensions. How does Xdimen work? When you have a UI design with a specific dimension, and

Islam Khaled 37 Nov 21, 2022
🎉 [Android Library] A light-weight library to easily make beautiful Navigation Bar with ton of 🎨 customization option.

Bubble Navigation ?? A light-weight library to easily make beautiful Navigation Bars with a ton of ?? customization options. Demos FloatingTopBarActiv

Gaurav Kumar 1.6k Nov 28, 2022
Bottom-App-Bar-with-Bottom-Navigation-in-Jetpack-compose-Android - Bottom App Bar with Bottom Navigation in Jetpack compose

Bottom-App-Bar-with-Bottom-Navigation-in-Jetpack-compose-Android This is simple

Shruti Patel 1 Jul 11, 2022
The Words app is a simple dictionary app, with a list of letters, words for each letter, and the ability to look up definitions of each word in the browser.

Words App This folder contains the source code for the Words app codelab. Introduction Words app allows you to select a letter and use Intents to navi

Lynne Munini 2 Oct 11, 2022
Paging indicator widgets compatible with the ViewPager from the Android Support Library and ActionBarSherlock.

Android ViewPagerIndicator Paging indicator widgets that are compatible with the ViewPager from the Android Support Library to improve discoverability

Jake Wharton 10.2k Nov 25, 2022
An Android library for managing multiple stacks of fragments

FragNav Android library for managing multiple stacks of fragments (e.g., Bottom Navigation , Navigation Drawer). This library does NOT include the UI

Nic Capdevila 1.5k Nov 15, 2022
A sleek, out of the box, easy to understand and use, swipe gesture based Navigational Library for android.

Facilis Swipe gesture based navigational library for Android. Watch Demo Video: Getting Started To get this project into your build: Gradle Add it in

Prem Suman 35 Feb 15, 2022
Memory efficient android library for managing individual fragment backstack.

fragstack : Android library for managing individual fragment backstack. An Easy to use library for managing individual fragment back stack as Instagra

Abhishesh 21 Feb 6, 2021
A small navigation library for Android to ease the use of fragment transactions & handling backstack (also available for Jetpack Compose).

A small navigation library for Android to ease the use of fragment transactions & handling backstack (also available for Jetpack Compose).

Kaustubh Patange 87 Oct 28, 2022
A simple navigation library for Android 🗺️

Enro ??️ A simple navigation library for Android "The novices’ eyes followed the wriggling path up from the well as it swept a great meandering arc ar

Isaac Udy 215 Nov 17, 2022
AndroidBriefActions - Android library for sending and observing non persistent actions such as showing a message; nice readable way to call navigation actions from ViewModel or Activity/Fragment.

implementation "com.vladmarkovic.briefactions:briefactions:$briefActionsVersion" Benefits Why use brief-actions library pattern: Prevent short-term ac

null 1 Jul 25, 2021
🧛 Fragula is a swipe-to-dismiss extension for navigation component library for Android

Fragula is a swipe-to-dismiss extension for navigation component library for Android.

Dmitry Rubtsov 192 Nov 20, 2022
An efficient TabLayout library implemented with RecyclerView.

RecyclerTabLayout An efficient TabLayout library implemented with RecyclerView. Features Efficient when having many tabs Easy setup with ViewPager (sa

Shinichi Nishimura 1.3k Nov 6, 2022