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 application@label 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
Weather-app - Making Weather application using retrofit from api

weather-app Motivasyon Hava Durumu uygulamasını api'den retrofit kullanarak yapm

İsa Kulaksız 0 Nov 2, 2022
An Open-Source repository that contains all the Android Dev and Kotlin concepts and several projects on android ranging in difficulty making this repo completely beginner-friendly.

An Open-Source repository that contains all the Android Dev and Kotlin concepts and several projects on android ranging in difficulty making this repo completely beginner-friendly. The main aim of this repository is to help students who are learning Android Development or preparing for an Android Developer role-based job.

Mimo Patra 15 Dec 29, 2022
Fyu didn't release his Keystrokes v5, so I'm making Keystrokes v69 :)

OneConfigExampleMod Example mod implementing OneConfig. How to use Copy the template either by using GitHub's "Use this template" feature or downloadi

Tellinq 2 Nov 5, 2022
The example Android project of animated menu items in toolbar

Android Animated Menu Items The example Android project of animated menu items in toolbar. Thanks Srikant Shetty for idea of this animation. Cut: Copy

Ilya Fomenko 922 Nov 23, 2022
Animated dark mode toggle button with Android & Pure Java. ☕

Dark-Toggle-Button Animated dark mode toggle button for Android Java. ☕ converted from kotlin to Java 201 lines: DarkToggleButton.java Android Demo In

knziha 2 Mar 13, 2022
Android TicWatch E-3 API 28 in Kotlin Animated Watch

AndroidTicWatchE3 -WEAR OS API 28 in Kotlin Android Studio- [CODE SNIPPETS] TicWatch E-3 Virtual Star Pet Features: Daily Background Change Holiday Mo

Sarah Bass 3 Aug 16, 2022
An Animated Scrolling View for React Native applications, supported on both iOS and Android

react-native-focused-scroll An Animated Scrolling View for React Native applications, supported on both iOS and Android Preview react-native-focus-scr

Fatemeh Marzoughi (Saba) 3 Aug 12, 2022
Source code of JekyllEx Android App which can manage your Jekyll blog directly from your Android device!

JekyllEx Android App Built with ❤︎ by Gourav Khunger ?? Introduction JekyllEx is an Android App that allows you to manage a Jekyll Blog directly from

JekyllEx 24 Nov 8, 2022
Taskify - An app to manage your daily tasks and boost your productivity. Taskify is built using kotlin and follows all modern android Development practices and hence is a good learning resource for beginners

Taskify Taskify is an app to manage your daily tasks and boost your productivity Video Introduction ?? This is a small introduction video about Taskif

Vaibhav Jaiswal 101 Jan 4, 2023
Vaibhav Jaiswal 57 Jan 3, 2023
ICSx⁵ is an Android app to subscribe to remote or local iCalendar files (like time tables of your school/university or event files of your sports team).

ICSx⁵ ICSx⁵ is an Android app to subscribe to remote Webcal feeds / iCalendar files (like time tables of your school/university or event files of your

bitfire web engineering 60 Dec 28, 2022
Candash - A simple Android app that turns your phone into an instrument cluster for your Tesla Model 3 and Y

What is CANdash? CANdash is an Android app that turns your Android device into a

Nick Nguyen 31 Nov 5, 2022
Easy app for managing your files without ads, respecting your privacy & security

Simple File Manager Can also be used for browsing root files and SD card content. You can easily rename, copy, move, delete and share anything you wis

Simple Mobile Tools 1.2k Dec 30, 2022
when you use restful api and network get disconnect you have to store your data local for make your app faster and work on ofline mode

AppArchitectureOflineMode when you use restful api and network get disconnect you have to store your data local for make your app faster and work on o

Kareem-Mansy 3 Jun 20, 2021
Alkatraz is an app that helps you to Reach your goals by managing your Habits .

Alkatraz - Build healthy habits for healthy life Alkatraz is an app that helps you to Reach your goals by managing your Habits . It's makes your life

Nishant Kumar 11 Nov 28, 2022
With this simple app, you can keep track of your favourite cryptocurrency on your wrist.

Capstone project crypto Tracker ?? Final Product (05-06) V1.1 "somebody toucha my spaghet" feature set State Note Track the current price of a crypto

Stefan de Kraker 2 Aug 20, 2022
Manage your torrents from your Android device with Transdroid.

All popular clients are supported: µTorrent, Transmission, rTorrent, Vuze, Deluge, BitTorrent 6, qBittorrent, and many more. You can view and manage running torrents and individual files. Adding is easy via the integrated search or RSS feeds (full version required). Monitor progress using the home screen widget or background alarm service.

Eric Kok 1.1k Jan 5, 2023
Tournant is a Gourmand/Gourmet recipe parser which serves your dishes on your Android device

Tournant Gourmand/Gourmet recipe parser Website: tournant.zimbelstern.eu Tournant serves your favorite dishes on your Android device! With Tournant, y

null 5 Dec 23, 2022