Existem duas abordagens que você pode usar para impedir que a barra de navegação / status seja animada durante a transição:
Abordagem 1: excluir a barra de status e a barra de navegação da transição padrão de saída / desvanecimento da janela
A razão pela qual a barra de status / navegação está diminuindo e diminuindo durante a transição é porque, por padrão, todas as visualizações não compartilhadas (incluindo os fundos da barra de status / navegação) diminuem / diminuem em suas atividades de chamada / chamada, respectivamente, assim que a transição começar . No entanto, você pode contornar isso facilmente excluindo os planos de fundo da barra de navegação / status da Fade
transição padrão de saída / entrada da janela . Basta adicionar o seguinte código aos onCreate()
métodos das suas atividades :
Transition fade = new Fade();
fade.excludeTarget(android.R.id.statusBarBackground, true);
fade.excludeTarget(android.R.id.navigationBarBackground, true);
getWindow().setExitTransition(fade);
getWindow().setEnterTransition(fade);
Essa transição também pode ser declarada no tema da atividade usando XML (ou seja, em seu próprio res/transition/window_fade.xml
arquivo):
<?xml version="1.0" encoding="utf-8"?>
<fade xmlns:android="http://schemas.android.com/apk/res/android">
<targets>
<target android:excludeId="@android:id/statusBarBackground"/>
<target android:excludeId="@android:id/navigationBarBackground"/>
</targets>
</fade>
Abordagem nº 2: adicione a barra de status e a barra de navegação como elementos compartilhados
Essa abordagem baseia-se na resposta do klmprt, que quase funcionou para mim ... embora eu ainda precisasse fazer algumas modificações.
Na minha atividade chamada, usei o seguinte código para iniciar a atividade:
View statusBar = findViewById(android.R.id.statusBarBackground);
View navigationBar = findViewById(android.R.id.navigationBarBackground);
List<Pair<View, String>> pairs = new ArrayList<>();
if (statusBar != null) {
pairs.add(Pair.create(statusBar, Window.STATUS_BAR_BACKGROUND_TRANSITION_NAME));
}
if (navigationBar != null) {
pairs.add(Pair.create(navigationBar, Window.NAVIGATION_BAR_BACKGROUND_TRANSITION_NAME));
}
pairs.add(Pair.create(mSharedElement, mSharedElement.getTransitionName()));
Bundle options = ActivityOptions.makeSceneTransitionAnimation(activity,
pairs.toArray(new Pair[pairs.size()])).toBundle();
startActivity(new Intent(context, NextActivity.class), options);
Até agora, isso é essencialmente a mesma coisa que klmprt sugeriu em sua resposta. No entanto, eu também precisei adicionar o código a seguir no onCreate()
método chamado Activity para impedir que a barra de status e a barra de navegação "piscassem" durante a transição:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_next);
// Postpone the transition until the window's decor view has
// finished its layout.
postponeEnterTransition();
final View decor = getWindow().getDecorView();
decor.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
@Override
public boolean onPreDraw() {
decor.getViewTreeObserver().removeOnPreDrawListener(this);
startPostponedEnterTransition();
return true;
}
});
}
A adição dos planos de fundo da barra de status e da barra de navegação como elementos compartilhados os forçará a serem desenhados em cima da transição padrão de saída / desvanecimento da janela, o que significa que eles não desaparecerão durante a transição. Mais discussões sobre essa abordagem podem ser encontradas nesta postagem do Google+ .
Impedir completamente que as transições de atividades interfiram nas transições de elementos compartilhados:
De https://stackoverflow.com/a/34907685/967131
Eu suspeito que isso possa ter efeitos colaterais, mas não tenho certeza. É absolutamente simples e funciona embora.
Evite que elementos específicos pisquem:
Comecei com a resposta de Alex Lockwood e fiz várias experiências para tentar fazê-lo funcionar. O núcleo está correto, embora eu não precise do código que ele sugere para a Atividade receptora, mas tive alguns problemas chamando-o em um Fragmento (em vez de uma Atividade) e definindo uma barra de ferramentas como barra de ação.
Oh, a coisa do fragmento? Vi muitos comentários de que tentar recuperar referências à barra de status e à barra de navegação era nulo. O mesmo aconteceu comigo também, até que percebi que não encontraria aqueles no layout do Fragmento ... eles estavam acima desse nível. Portanto, o código abaixo para obter a visualização de decoração da Atividade e pesquisar isso. Então eu os encontrei sem nenhum problema.
No final, desenvolvi este método utilitário:
Observe R.string.transition_appbarlayout e R.id.appbarlayout . Esses IDs são arbitrários, desde que correspondam ao que seu código usa. No meu XML, eu layout a barra de ação personalizada da seguinte maneira (editada até o essencial):
Se você não usar uma barra de ferramentas como essa, essa parte poderá ser removida do método utilitário.
Então você chamaria isso no seu fragmento da seguinte forma:
Usando os valores desejados, desde que corresponda ao seu XML.
Isso evita que a barra de status, a barra de ferramentas e a barra de navegação (botões voltar / página inicial / aplicativos recentes) pisquem durante a transição. O restante da transição de atividade é normal.
No meu caso, nosso tema do aplicativo é
android:windowBackground
azul. Isso causa um flash azul na transição, o que é bastante frustrante. Mas, em vez de fazer uma alteração que afeta todo o aplicativo dessa maneira, por enquanto vou com a primeira opção, rápida e suja.fonte
Você precisa compartilhá-los
ActivityOptions.makeSceneTransitionAnimation.
Por exemplo:
(desculpe o psuedo; eu não tenho o valor android.R.id exato na mão)
Você pode executar uma transição apropriada depois de compartilhar as visualizações.
fonte
Pelo que entendi, isso é causado pela sobreposição da transição de atividades. Para superar esse problema, usei os seguintes valores nos
onCreate()
métodos de ambas as atividades:fonte
Acabei de ter esse mesmo problema, e as respostas parecem estar faltando uma peça crítica para o quebra-cabeça. Lembre-se de que em uma transição de elemento compartilhado, tudo acontece na Atividade de destino .
Para remover o efeito intermitente, basta adicionar o seguinte à atividade que está sendo chamada:
Isso deve resolver seu problema!
fonte
getWindow().setEnterTransition(null);
na transição de entrada removeu a sobreposição branca para mim.fonte
Aqui está como eu fiz isso. Eu compartilho o
Status Bar
eNavigation Bar
oSharedElementTransition
junto com umImageView
:fonte