O Appintro é uma biblioteca Android que ajuda a criar uma introdução legal para o seu aplicativo. O Appintro tem suporte para solicitar permissões e ajuda a criar uma ótima experiência de integração em apenas alguns minutos.


O Appintro é distribuído através do Jitpack.
Para usá -lo, você precisa adicionar a seguinte dependência gradle ao seu arquivo build.gradle do módulo, onde deseja usar o Appintro (não o arquivo 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 '
}Observe que, como o Appintro 5.x, a biblioteca suporta o Android X. Se você ainda não migrou, provavelmente deseja usar uma versão anterior da biblioteca que use os pacotes antigos da biblioteca de suporte (ou tente o modo reverso de jetifier).
Para usar o Appintro, você simplesmente precisa criar uma nova atividade que estenda o AppIntro como o seguinte:
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()
}
} Observe que você não deve ligar para o setContentView. A AppIntro Superclass está cuidando disso para você.
Confirme também que você está substituindo onCreate com um único parâmetro ( Bundle ) e não está usando outra substituição (como onCreate(Bundle, PersistableBundle) ).
Finalmente, declare a atividade em seu manifesto assim:
< activity android : name = " com.example.MyCustomAppIntro "
android : label = " My Custom AppIntro " /> Sugerimos não declarar MyCustomAppIntro como sua primeira atividade, a menos que você queira que a introdução seja lançada toda vez que seu aplicativo iniciar. Idealmente, você deve mostrar a atividade do Appintro apenas uma vez ao usuário e deve ocultá -lo uma vez concluído (você pode usar um sinalizador nas SharedPreferences ).
Você pode encontrar muitos exemplos no idioma java no diretório de exemplos
Se você estiver migrando do appintro v5.x para v6.x , espere várias alterações de ruptura. Você pode encontrar documentação sobre como atualizar seu código neste outro guia de migração.
Não se esqueça de verificar o Changelog para dar uma olhada em todas as mudanças na versão mais recente do AppIntro.
O ponto de entrada para adicionar um novo slide é a função addSlide(fragment: Fragment) na classe AppIntro . Você pode usá -lo facilmente para adicionar um novo Fragment ao carrossel.
A biblioteca vem com várias aulas Util para ajudá -lo a criar seu slide com apenas algumas linhas:
AppIntroFragment Você pode usar o AppIntroFragment se deseja apenas personalizar o título, a descrição, a imagem e as cores. Essa é a abordagem sugerida se você deseja criar uma introdução 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 os parâmetros são opcionais, então você é livre para personalizar seu slide como desejar.
Se você precisar criar programaticamente vários slides, também pode usar a classe SliderPage . Esta classe pode ser passada para AppIntroFragment.createInstance(sliderPage: SliderPage) que criará um novo slide a partir dessa instância.
AppIntroCustomLayoutFragment Se você precisar de mais controle sobre a personalização do seu slide, poderá usar o AppIntroCustomLayoutFragment . Isso permitirá que você passe seu arquivo de recurso de layout personalizado:
AppIntroCustomLayoutFragment .newInstance( R .layout.intro_custom_layout1)Isso permite que você alcance layout complexo e inclua sua lógica personalizada na introdução (consulte também a política de slides):

O Appintro oferece várias opções de configuração para ajudá -lo a personalizar sua experiência de integração.
O Appintro vem com um conjunto de transformadores de slide que você pode usar fora da caixa para animar sua transição de slide.
| Transformadores de slides | Transformadores de slides |
|---|---|
Desaparecer ![]() | Zoom ![]() |
Fluxo ![]() | Deslize ![]() |
Profundidade ![]() | Paralaxe ![]() |
Você pode simplesmente ligar para setTransformer() e passar uma das subclasse da classe selada 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
)) Você também pode fornecer seu transformador de slides personalizado (implementando a interface ViewPager.PageTransformer ) com:
setCustomTransformer( ViewPager . PageTransformer )
O Appintro oferece a possibilidade de animar a transição colorida entre dois slides. Esse recurso está desativado por padrão e você precisa habilitá -lo no seu Appintro com:
isColorTransitionsEnabled = true Depois de habilitá -lo, a cor será animada entre os slides com um gradiente. Certifique -se de fornecer um parâmetro backgroundColor em seus slides.
Se você estiver fornecendo fragmentos personalizados, pode deixá -los suportar a transição de cores implementando a interface SlideBackgroundColorHolder .
O Appintro é enviado com dois layouts de nível superior que você pode usar. O layout padrão ( AppIntro ) possui botões textuais, enquanto o layout alternativo possui botões com ícones.
Para alterar o layout da janela, você pode simplesmente alterar sua superclasse para AppIntro2 . Os métodos para adicionar e personalizar o Appintro são inalterados.
class MyCustomAppIntro : AppIntro2 () {
// Same code as displayed in the `Basic Usage` section of this README
}| Página | AppIntro | AppIntro2 |
|---|---|---|
| página padrão | ![]() | ![]() |
| última página | ![]() | ![]() |
O Appintro suporta dois indicadores prontos para mostrar o progresso da experiência de introdução ao usuário:
DotIndicatorController representado com uma lista de pontos (o padrão)ProgressIndicatorController representado com uma barra de progresso. DotIndicator | ProgressIndicator |
|---|---|
![]() | ![]() |
Além disso, você pode fornecer seu próprio indicador, fornecendo uma implementação da interface IndicatorController .
Você pode personalizar o indicador com a seguinte API na classe 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 */ ) Se você não especificar nenhuma personalização, um DotIndicatorController será mostrado.
O Appintro suporta fornecer feedback de vibração háptica sobre os cliques do botão. Observe que você precisa especificar a permissão de vibração no manifesto do seu aplicativo (a biblioteca não está fazendo isso). Se você esquecer de especificar a permissão, o aplicativo experimentará uma falha.
< uses-permission android : name = " android.permission.VIBRATE " />Você pode ativar e personalizar a vibração com:
// Enable vibration and set duration in ms
isVibrate = true
vibrateDuration = 50L

O Appintro suporta um modo assistente onde o botão Skip será substituído pela seta traseira. Isso é útil se você estiver apresentando um mago aos seus usuários com um conjunto de etapas que eles precisam fazer, e eles podem frequentemente voltar e voltar.
Você pode ativá -lo com:
isWizardMode = true

Se você deseja exibir sua introdução com uma experiência em tela cheia, pode ativar o modo imersivo . Isso ocultará a barra de status e a barra de navegação e o usuário terá que rolar da parte superior da tela para mostrá -los novamente.
Isso permite que você tenha mais espaço para o seu conteúdo de introdução e gráficos.
Você pode ativá -lo com:
setImmersiveMode()Você pode bloquear o botão de volta do sistema se não quiser que seu usuário volte da introdução. Isso pode ser útil se você precisar solicitar permissão e a experiência de introdução não for opcional.
Se for esse o caso, defina como true a seguinte sinalizadora:
isSystemBackButtonLocked = true
Você pode personalizar a barra de status e a visibilidade e a cor da barra de navegação com os seguintes 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) Por padrão, os slides usam todo o tamanho disponível na tela; portanto, pode acontecer que a barra inferior se sobreponda ao conteúdo do slide se você definir a cor de fundo para uma não transparente. Se você deseja garantir que a barra não se sobreponda ao conteúdo, use a função setBarMargin da seguinte forma:
setBarMargin( true )
O Appintro simplifica o processo de solicitação de permissões de tempo de execução ao seu usuário. Você pode integrar uma ou mais solicitações de permissão dentro de um slide com o método askForPermissions dentro de sua atividade.
Observe que:
slideNumber está em uma numeração única (ele começa em 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 ) Se você precisar de um controle adicional sobre a solicitação de permissão, você poderá substituir esses dois métodos na classe 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
} Se você deseja restringir a navegação entre os slides (ou seja, o usuário precisa alternar uma caixa de seleção para continuar), o recurso SlidePolicy pode ajudá -lo.
Tudo o que você precisa fazer é implementar SlidePolicy em seus slides.
Esta interface contém a propriedade isPolicyRespected e o método de onUserIllegallyRequestedNextPage que você deve implementar com sua 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.
}
} Você pode encontrar um exemplo de trabalho completo de SlidePolicy no exemplo de aplicativo - customslidepolicyfragment.kt
O Appintro vem com um aplicativo de amostra cheio de exemplos e um caso de uso que você pode usar como inspiração para o seu projeto. Você pode encontrá -lo dentro da pasta /exemplo.
Você pode obter um apk depuração do aplicativo de amostra a partir do trabalho de ações de pré -merge github como um artefato de saída aqui.

Você quer ajudar o Appintro a se tornar internacional? Estamos mais do que felizes! Appintro atualmente suporta os seguintes idiomas.
Para adicionar uma nova tradução, basta adicionar uma solicitação de tração com um novo arquivo strings.xml dentro de uma pasta values-xx (onde xx é um código de idioma ISO 639-1 de duas letras).
Para fornecer a tradução, seu arquivo precisa conter as seguintes strings:
<? 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 >Uma versão atualizada da tradução da versão em inglês está disponível aqui.
Se uma tradução no seu idioma já estiver disponível, verifique -o e, eventualmente, corrija -o (todas as strings devem ser listadas, não apenas um subconjunto).
O desenvolvimento do Appintro acontece no ramo principal. Você pode obter versões SNAPSHOT diretamente do Jitpack, se necessário.
repositories {
maven { url " https://jitpack.io " }
} dependencies {
implementation " com.github.AppIntro:AppIntro:main-SNAPSHOT "
}Estamos oferecendo suporte ao Appintro no canal #Appintro na Slack Kotlinlang. Venha e junte -se à conversa lá. Se você não tiver acesso à Slack Kotlinlang, poderá solicitar acesso aqui.
Estamos procurando contribuidores! Não seja tímido. ? Sinta -se à vontade para abrir problemas/puxar solicitações para me ajudar a melhorar este projeto.
Appintro é atualmente desenvolvido e mantido pelo Appintro Github Org. Ao enviar um novo PR, por favor, ping em um de:
O Appintro não confia em nenhuma biblioteca de terceiros que não seja da 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.
Se você estiver usando o Appintro em seu aplicativo e gostaria de ser listado aqui, abra uma solicitação de tração e ficaremos mais do que felizes em incluir você: