Como aplicar animação de slides entre duas atividades no Android?
em java ambos os ficheiros:
super.onCreate(savedInstanceState);
overridePendingTransition(R.anim.fadein, R.anim.fadeout);
setContentView(R.layout.main);
dois ficheiros na pasta res / anim:
Fadein.xml
<?xml version="1.0" encoding="utf-8"?>
<alpha
xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="5000"
android:fromAlpha="0.0"
android:interpolator="@android:anim/slide_out_right"
android:toAlpha="1.0" >
</alpha>
Fadeout.xml
<?xml version="1.0" encoding="utf-8"?>
<alpha
xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="5000"
android:fromAlpha="0.0"
android:interpolator="@android:anim/slide_in_left"
android:toAlpha="1.0" >
</alpha>
6 answers
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.splashscreen);
new Handler().postDelayed(new Runnable() {
public void run() {
/* Create an intent that will start the main activity. */
Intent mainIntent = new Intent(SplashScreen.this,
ConnectedActivity.class);
mainIntent.putExtra("id", "1");
//SplashScreen.this.startActivity(mainIntent);
startActivity(mainIntent);
/* Finish splash activity so user cant go back to it. */
SplashScreen.this.finish();
/* Apply our splash exit (fade out) and main
entry (fade in) animation transitions. */
overridePendingTransition(R.anim.mainfadein,R.anim.splashfadeout);
}
}, SPLASH_DISPLAY_TIME);
}
Adicione estes dois ficheiros na pasta res/anim.
Deslizante.xml
<?xml version="1.0" encoding="utf-8"?>
<translate
xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="@android:integer/config_longAnimTime"
android:fromXDelta="100%p"
android:toXDelta="0%p">
</translate>
Deslizante.xml
<?xml version="1.0" encoding="utf-8"?>
<translate
xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="@android:integer/config_longAnimTime"
android:fromXDelta="0%p"
android:toXDelta="-100%p">
</translate>
E escreva o seguinte código no método de oncreato() da próxima actividade que você passa através da intenção.
overridePendingTransition(R.anim.slide_in, R.anim.slide_out);
Você pode sobrepor a sua animação por omissão e ela funciona melhor do que a transição dependente. Eu uso esta solução que funciona para cada versão android. Basta copiar o colar 4 ficheiros e adicionar um estilo de 4 linhas como em baixo:
Crie uma " animação personalizada "e adicione isto ao seu tema de base por"estilo windowanimation".
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorPrimary</item>
<item name="android:windowAnimationStyle">@style/CustomActivityAnimation</item>
</style>
<style name="CustomActivityAnimation" parent="@android:style/Animation.Activity">
<item name="android:activityOpenEnterAnimation">@anim/slide_in_right</item>
<item name="android:activityOpenExitAnimation">@anim/slide_out_left</item>
<item name="android:activityCloseEnterAnimation">@anim/slide_in_left</item>
<item name="android:activityCloseExitAnimation">@anim/slide_out_right</item>
</style>
Em seguida, criar uma pasta anim sob a pasta res e, em seguida, criar estes quatro arquivos de animação em anim pasta:
Slide_in_right.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate android:fromXDelta="100%p" android:toXDelta="0"
android:duration="@android:integer/config_mediumAnimTime"/>
</set>
Slide_out_left.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate android:fromXDelta="0" android:toXDelta="-100%p"
android:duration="@android:integer/config_mediumAnimTime"/>
</set>
Slide_in_left.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate android:fromXDelta="-100%p" android:toXDelta="0"
android:duration="@android:integer/config_mediumAnimTime"/>
</set>
Directo.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate android:fromXDelta="0" android:toXDelta="100%p"
android:duration="@android:integer/config_mediumAnimTime"/>
</set>
Se enfrentares algum problema, podes descarregar o meu projecto de amostra do github .
Obrigado.Podes usar overridePendingTransition
em startActivity
em vez de onCreate
. Pelo menos, por mim tudo bem!
Veja um exemplo completo aqui . É incluindo uma animação (reversa) onBackPressed, assim, ao retornar à atividade anterior! No seu exemplo específico (fade-in e-out) isso pode ser desnecessário.
A animação por 'Slide' pode ser aplicada às transições de actividade, invocando a transição dependente de 'overriding' e passando os recursos de animação para as actividades de entrada e saída.
As animações de slides podem ser deslizadas para a direita, deslizar para a esquerda, deslizar para cima e deslizar para baixo.Deslizar para cima
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/linear_interpolator">
<scale
android:duration="800"
android:fromXScale="1.0"
android:fromYScale="1.0"
android:toXScale="1.0"
android:toYScale="0.0" />
</set>
Deslizar para baixo
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/linear_interpolator">
<scale
android:duration="800"
android:fromXScale="1.0"
android:fromYScale="0.0"
android:toXScale="1.0"
android:toYScale="1.0" />
</set>
Transição Super dependente(R. anim.slide_down, R. anim.slide_up);
Ver animação de transição de actividade exemplos para mais transição de actividade exemplo.
Deslizar para cima / para baixo com animação alfa com algumas notas
Deslizante.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="@integer/activity_transition_time"
>
<translate
android:fromYDelta="100%p"
android:toYDelta="0"/>
<alpha
android:fromAlpha="0.5"
android:toAlpha="1"/>
</set>
Slide_down.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="@integer/activity_transition_time"
>
<translate
android:fromYDelta="0"
android:toYDelta="100%p"/>
<alpha
android:fromAlpha="1"
android:toAlpha="0.5"/>
</set>
Reanimação não.xml
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="@integer/activity_transition_time"
android:fromYDelta="0"
android:toYDelta="0"/>
Primeira Actividade
startActivity(new Intent(this, SecondActivity.class));
overridePendingTransition(R.anim.slide_up, R.anim.no_animation); // remember to put it after startActivity, if you put it to above, animation will not working
// document say if we don't want animation we can put 0. However, if we put 0 instead of R.anim.no_animation, the exist activity will become black when animate
Segunda Actividade
finish();
overridePendingTransition(R.anim.no_animation, R.anim.slide_down);
Concluído
MAIS
Eu tento fazer a animação slide como a animação iOS quando apresentar um modelo de vista (como este https://www.youtube.com/watch?v=deZobvh2064 mas falhou.
Olhando para a animação actual do iOS irá ver: a animação a partir de baixo com o alpha (cerca de 50%), em seguida, vai muito rápido e mais lento, o tempo de animação é cerca de > 500ms (eu uso Ferramentas de vídeo aparadas para contar o tempo de animação https://www.kapwing.com/trim-video então não pode exactamente 100%)
Depois tento candidatar-me ao android.Para fazer Alfa eu usar
<alpha>
e sucesso.Para fazer animação comece mais rápido do que mais lento que eu uso
android:interpolator="a decelerate interpolator"
mas quase falhou.
Existem 3 predefinições Eu tentei 3 acima não consigo alcançar como iOS, a animação não podemos começar mais rápido como os iOS. Em seguida, crio um factor de desaceleração personalizado interpolator wiht = 3 Como E eu aumento o tempo de duração de decelerate interpolator
no Android@android:interpolator/decelerate_quad
-> factor = 1@android:interpolator/decelerate_cubic
-> factor = 1.5@android:interpolator/decelerate_quint
_> factor = 2, 5
(factor mais elevado a animação começa mais rápido do início e mais lento no fim)
Aqui está um bom tutorial http://cogitolearning.co.uk/2013/10/android-animations-tutorial-5-more-on-interpolators por entendê-lo.
<?xml version="1.0" encoding="utf-8"?>
<decelerateInterpolator xmlns:android="http://schemas.android.com/apk/res/android"
android:factor="3" />
500 -> 750
. It working well (very similar to iOS). No entanto, ele só funciona bem em algum dispositivo, em algum dispositivo a animação é bastante lenta. Mais tarde, eu sei que a animação pode ser diferente em diferentes dispositivos (eg: algum dispositivo vai mais rápido e algum dispositivo vai mais lento) para que eu não possa torná-lo a animação semelhante em todos os dispositivos Android. Portanto ... não utilize interpolator
. Não sei se os meus testes são 100% ou não, mas espero que esta experiência ajude.