AppIntro es una biblioteca de Android que lo ayuda a construir una introducción genial de carrusel para su aplicación. Appintro tiene soporte para solicitar permisos y lo ayuda a crear una excelente experiencia de incorporación en solo un par de minutos.


Appintro se distribuye a través de JITPack.
Para usarlo, debe agregar la siguiente dependencia de Gradle a su archivo build.gradle del módulo donde desea usar Appintro (no el archivo root).
repositories {
maven { url " https://jitpack.io " }
}dependencies {
// AndroidX Capable version
implementation ' com.github.AppIntro:AppIntro:6.3.1 '
// *** OR ***
// Latest version compatible with the old Support Library
implementation ' com.github.AppIntro:AppIntro:4.2.3 '
}Tenga en cuenta que desde Appintro 5.x, la biblioteca admite Android X. Si aún no ha migrado, es probable que desee usar una versión anterior de la biblioteca que use los paquetes de la biblioteca de soporte antiguo (o pruebe el modo de inversión del jetificador).
Para usar Appintro, simplemente debe crear una nueva actividad que extienda Appintro como lo siguiente:
class MyCustomAppIntro : AppIntro () {
override fun onCreate ( savedInstanceState : Bundle ? ) {
super .onCreate(savedInstanceState)
// Make sure you don't call setContentView!
// Call addSlide passing your Fragments.
// You can use AppIntroFragment to use a pre-built fragment
addSlide( AppIntroFragment .createInstance(
title = " Welcome... " ,
description = " This is the first slide of the example "
))
addSlide( AppIntroFragment .createInstance(
title = " ...Let's get started! " ,
description = " This is the last slide, I won't annoy you more :) "
))
}
override fun onSkipPressed ( currentFragment : Fragment ? ) {
super .onSkipPressed(currentFragment)
// Decide what to do when the user clicks on "Skip"
finish()
}
override fun onDonePressed ( currentFragment : Fragment ? ) {
super .onDonePressed(currentFragment)
// Decide what to do when the user clicks on "Done"
finish()
}
} Tenga en cuenta que no debe llamar a SetContentView. La superclase AppIntro lo está cuidando por usted.
También confirme que está anulando onCreate con un solo parámetro ( Bundle ) y en su lugar no está utilizando otra anulación (como onCreate(Bundle, PersistableBundle) ).
Finalmente, declare la actividad en su manifiesto así:
< activity android : name = " com.example.MyCustomAppIntro "
android : label = " My Custom AppIntro " /> Sugerimos no declarar MyCustomAppIntro como su primera actividad a menos que desee que la introducción se inicie cada vez que comience su aplicación. Idealmente, debe mostrar la actividad de AppIntro solo una vez al usuario, y debe ocultarla una vez completado (puede usar un indicador en SharedPreferences ).
Puede encontrar muchos ejemplos en lenguaje Java en el directorio de ejemplos
Si está migrando de Appintro v5.x a v6.x , espere cambios de ruptura múltiples. Puede encontrar documentación sobre cómo actualizar su código en esta otra guía de migración.
No olvide verificar el ChangeLog para echar un vistazo a todos los cambios en la última versión de Appintro.
El punto de entrada para agregar una nueva diapositiva es la función addSlide(fragment: Fragment) en la clase AppIntro . Puede usarlo fácilmente para agregar un nuevo Fragment al carrusel.
La biblioteca viene con varias clases Util para ayudarlo a crear su diapositiva con solo un par de líneas:
AppIntroFragment Puede usar el AppIntroFragment si solo desea personalizar el título, la descripción, la imagen y los colores. Ese es el enfoque sugerido si desea crear una introducción rápida:
addSlide( AppIntroFragment .createInstance(
title = " The title of your slide " ,
description = " A description that will be shown on the bottom " ,
imageDrawable = R .drawable.the_central_icon,
backgroundDrawable = R .drawable.the_background_image,
titleColorRes = R .color.yellow,
descriptionColorRes = R .color.red,
backgroundColorRes = R .color.blue,
titleTypefaceFontRes = R .font.opensans_regular,
descriptionTypefaceFontRes = R .font.opensans_regular,
))Todos los parámetros son opcionales, por lo que puede personalizar su diapositiva como desee.
Si necesita crear mediante programación varias diapositivas, también puede usar la clase SliderPage . Esta clase se puede pasar a AppIntroFragment.createInstance(sliderPage: SliderPage) que creará una nueva diapositiva a partir de esa instancia.
AppIntroCustomLayoutFragment Si necesita más control sobre la personalización de su diapositiva, puede usar el AppIntroCustomLayoutFragment . Esto le permitirá aprobar su archivo de recursos de diseño personalizado:
AppIntroCustomLayoutFragment .newInstance( R .layout.intro_custom_layout1)Esto le permite lograr un diseño complejo e incluir su lógica personalizada en la introducción (ver también la política de diapositivas):

Appintro ofrece varias opciones de configuración para ayudarlo a personalizar su experiencia de incorporación.
Appintro viene con un conjunto de transformador de diapositivas que puede usar fuera de la caja para animar la transición de su diapositiva.
| Transformadores de diapositivas | Transformadores de diapositivas |
|---|---|
Desteñir ![]() | Zoom ![]() |
Fluir ![]() | Deslizarse ![]() |
Profundidad ![]() | Paralaje ![]() |
Simplemente puede llamar setTransformer() y pasar una de las subclase de la clase sellada AppIntroPageTransformerType :
setTransformer( AppIntroPageTransformerType . Fade )
setTransformer( AppIntroPageTransformerType . Zoom )
setTransformer( AppIntroPageTransformerType . Flow )
setTransformer( AppIntroPageTransformerType . SlideOver )
setTransformer( AppIntroPageTransformerType . Depth )
// You can customize your parallax parameters in the constructors.
setTransformer( AppIntroPageTransformerType . Parallax (
titleParallaxFactor = 1.0 ,
imageParallaxFactor = - 1.0 ,
descriptionParallaxFactor = 2.0
)) También puede proporcionar su transformador de diapositivas personalizado (implementando la interfaz ViewPager.PageTransformer ) con:
setCustomTransformer( ViewPager . PageTransformer )
Appintro ofrece la posibilidad de animar la transición de color entre dos tobogán. Esta función está deshabilitada de forma predeterminada y debe habilitarla en su Appintro con:
isColorTransitionsEnabled = true Una vez que lo habilite, el color se animará entre diapositivas con un gradiente. Asegúrese de proporcionar un parámetro backgroundColor en sus diapositivas.
Si proporciona fragmentos personalizados, puede permitirles admitir la transición de color implementando la interfaz SlideBackgroundColorHolder .
Appintro se envía con dos diseños de nivel superior que puede usar. El diseño predeterminado ( AppIntro ) tiene botones textuales, mientras que el diseño alternativo tiene botones con iconos.
Para cambiar el diseño de la ventana, simplemente puede cambiar su superclase a AppIntro2 . Los métodos para agregar y personalizar el Appintro no cambian.
class MyCustomAppIntro : AppIntro2 () {
// Same code as displayed in the `Basic Usage` section of this README
}| Página | AppIntro | AppIntro2 |
|---|---|---|
| página estándar | ![]() | ![]() |
| última página | ![]() | ![]() |
AppIntro admite dos indicadores fuera de la caja para mostrar el progreso de la experiencia de introducción al usuario:
DotIndicatorController representado con una lista de puntos (el valor predeterminado)ProgressIndicatorController representado con una barra de progreso. DotIndicator | ProgressIndicator |
|---|---|
![]() | ![]() |
Además, puede suministrar su propio indicador proporcionando una implementación de la interfaz IndicatorController .
Puede personalizar el indicador con la siguiente API en la clase AppIntro :
// Toggle Indicator Visibility
isIndicatorEnabled = true
// Change Indicator Color
setIndicatorColor(
selectedIndicatorColor = getColor( R .color.red),
unselectedIndicatorColor = getColor( R .color.blue)
)
// Switch from Dotted Indicator to Progress Indicator
setProgressIndicator()
// Supply your custom `IndicatorController` implementation
indicatorController = MyCustomIndicator ( /* initialize me */ ) Si no especifica ninguna personalización, se mostrará un DotIndicatorController .
AppIntro admite proporcionar comentarios de vibración háptica sobre los clics del botón. Tenga en cuenta que necesita especificar el permiso de vibración en su manifiesto de aplicación (la biblioteca no lo está haciendo). Si olvida especificar el permiso, la aplicación experimentará un bloqueo.
< uses-permission android : name = " android.permission.VIBRATE " />Puede habilitar y personalizar la vibración con:
// Enable vibration and set duration in ms
isVibrate = true
vibrateDuration = 50L

Appintro admite un modo de asistente donde el botón Skip se reemplazará con la flecha posterior. Esto es útil si está presentando un mago a sus usuarios con un conjunto de pasos que deben hacer, y con frecuencia podrían ir y venir.
Puedes habilitarlo con:
isWizardMode = true

Si desea mostrar su introducción con una experiencia de pantalla completa, puede habilitar el modo inmersivo . Esto ocultará tanto la barra de estado como la barra de navegación y el usuario tendrá que desplazarse desde la parte superior de la pantalla para mostrarlos nuevamente.
Esto le permite tener más espacio para su contenido de introducción y gráficos.
Puedes habilitarlo con:
setImmersiveMode()Puede bloquear el botón de retroceso del sistema si no desea que su usuario regrese de la introducción. Esto podría ser útil si necesita solicitar permiso y la experiencia de introducción no es opcional.
Si este es el caso, configure en True el siguiente indicador:
isSystemBackButtonLocked = true
Puede personalizar la barra de estado y la visibilidad y el color de la barra de navegación con los siguientes métodos:
// Hide/Show the status Bar
showStatusBar( true )
// Control the status bar color
setStatusBarColor( Color . GREEN )
setStatusBarColorRes( R .color.green)
// Control the navigation bar color
setNavBarColor( Color . RED )
setNavBarColorRes( R .color.red) De manera predeterminada, las diapositivas usan el tamaño completo disponible en la pantalla, por lo que puede suceder que la barra inferior se superponga al contenido de la diapositiva si ha establecido el color de fondo en uno no transparente. Si desea asegurarse de que la barra no se superponga al contenido, use la función setBarMargin de la siguiente manera:
setBarMargin( true )
Appintro simplifica el proceso de solicitar permisos de tiempo de ejecución a su usuario. Puede integrar una o más solicitud de permiso dentro de una diapositiva con el método askForPermissions dentro de su actividad.
Tenga en cuenta que:
slideNumber está en una numeración basada (comienza desde 1) // Ask for required CAMERA permission on the second slide.
askForPermissions(
permissions = arrayOf( Manifest .permission. CAMERA ),
slideNumber = 2 ,
required = true )
// Ask for both optional ACCESS_FINE_LOCATION and WRITE_EXTERNAL_STORAGE
// permission on the third slide.
askForPermissions(
permissions = arrayOf(
Manifest .permission. ACCESS_FINE_LOCATION ,
Manifest .permission. WRITE_EXTERNAL_STORAGE
),
slideNumber = 3 ,
required = false ) Si necesita más control sobre la solicitud de permiso, puede anular esos dos métodos en la clase AppIntro :
override fun onUserDeniedPermission ( permissionName : String ) {
// User pressed "Deny" on the permission dialog
}
override fun onUserDisabledPermission ( permissionName : String ) {
// User pressed "Deny" + "Don't ask again" on the permission dialog
} Si desea restringir la navegación entre sus diapositivas (es decir, el usuario debe alternar una casilla de verificación para continuar), la función SlidePolicy podría ayudarlo.
Todo lo que tiene que hacer es implementar SlidePolicy en sus diapositivas.
Esta interfaz contiene la propiedad isPolicyRespected y el método onUserIllegallyRequestedNextPage que debe implementar con su lógica personalizada
class MyFragment : Fragment (), SlidePolicy {
// If user should be allowed to leave this slide
override val isPolicyRespected : Boolean
get() = false // Your custom logic here.
override fun onUserIllegallyRequestedNextPage () {
// User illegally requested next slide.
// Show a toast or an informative message to the user.
}
} Puede encontrar un ejemplo de trabajo completo de SlidePolicy en la aplicación Ejemplo - CustomSlidePolicyFragment.kt
Appintro viene con una aplicación de muestra llena de ejemplos y casos de uso que puede usar como inspiración para su proyecto. Puede encontrarlo dentro de la carpeta /Ejemplo.
Puede obtener un APK de depuración de la aplicación de muestra del trabajo de acciones previas a la fusión de GitHub como un artefacto de salida aquí.

¿Quieres ayudar a Appintro a convertirse en internacional? ¡Estamos más que felices! Appintro actualmente admite los siguientes idiomas.
Para agregar una nueva traducción, simplemente agregue una solicitud de extracción con un nuevo archivo strings.xml dentro de una carpeta values-xx (donde xx es un código de idioma ISO 639-1 de dos letras).
Para proporcionar la traducción, su archivo debe contener las siguientes cadenas:
<? xml version = " 1.0 " encoding = " utf-8 " ?>
< resources xmlns : tools = " http://schemas.android.com/tools " >
< string name = " app_intro_skip_button " >[Translation for SKIP]</ string >
< string name = " app_intro_next_button " >[Translation for NEXT]</ string >
< string name = " app_intro_back_button " >[Translation for BACK]</ string >
< string name = " app_intro_done_button " >[Translation for DONE]</ string >
< string name = " app_intro_image_content_description " >[Translation for "graphics"]</ string >
</ resources >Una versión actualizada de la traducción de versión en inglés está disponible aquí.
Si una traducción en su idioma ya está disponible, verifíquela y eventualmente arreglársela (todas las cadenas deben estar enumeradas, no solo un subconjunto).
El desarrollo de Appintro ocurre en la rama principal. Puede obtener versiones SNAPSHOT directamente de jitpack si es necesario.
repositories {
maven { url " https://jitpack.io " }
} dependencies {
implementation " com.github.AppIntro:AppIntro:main-SNAPSHOT "
}Estamos ofreciendo soporte para Appintro en el canal #Appintro en Kotlinlang Slack. Ven y únete a la conversación allí. Si no tiene acceso a Kotlinlang Slack, puede solicitar acceso aquí.
¡Estamos buscando contribuyentes! No seas tímido. ? No dude en abrir las solicitudes de problemas/extracción para ayudarme a mejorar este proyecto.
APPINTRO está actualmente desarrollado y mantenido por la Org de GitHub de Appintro. Al enviar un nuevo PR, por favor ping uno de:
Appintro no depende de ninguna biblioteca de terceros que no sea la de Androidx:
androidx.appcompat:appcompatandroidx.annotation:annotationandroidx.constraintlayout:constraintlayout Copyright (C) 2015-2020 AppIntro Developers
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
Si está utilizando Appintro en su aplicación y desea que se enumere aquí, abra una solicitud de extracción y estaremos más que felices de incluirlo: