Impedir completamente que as transições de atividades interfiram nas transições de elementos compartilhados:
Na atividade de saída, chame getWindow (). SetExitTransition (null);
Na atividade de entrada, chame getWindow (). SetEnterTransition (null);
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:
public static Bundle transitionOptions(Activity activity, int transitionViewResId, int transitionNameResId) {
if (VERSION.SDK_INT < VERSION_CODES.LOLLIPOP) {
return null;
}
View decorView = activity.getWindow().getDecorView();
View statusBar = decorView.findViewById(android.R.id.statusBarBackground);
View navigationBar = decorView.findViewById(android.R.id.navigationBarBackground);
View appBarLayout = decorView.findViewById(**R.id.appbarlayout**);
View transitionView = decorView.findViewById(transitionViewResId);
String transitionName = activity.getString(transitionNameResId);
List<Pair<View, String>> pairs = new ArrayList<>();
pairs.add(Pair.create(statusBar, Window.STATUS_BAR_BACKGROUND_TRANSITION_NAME));
pairs.add(Pair.create(navigationBar, Window.NAVIGATION_BAR_BACKGROUND_TRANSITION_NAME));
if (appBarLayout != null) {
pairs.add(Pair.create(appBarLayout, activity.getString(**R.string.transition_appbarlayout**)));
}
pairs.add(Pair.create(transitionView, transitionName));
//noinspection unchecked - we're not worried about the "unchecked" conversion of List<Pair> to Pair[] here
return ActivityOptionsCompat.makeSceneTransitionAnimation(activity, pairs.toArray(new Pair[pairs.size()]))
.toBundle();
}
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):
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.AppBarLayout
android:id="**@+id/appbarlayout**"
android:transitionName="**@string/transition_appbarlayout**">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"/>
</android.support.design.widget.AppBarLayout>
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:
startActivity(intent, UIUtils.transitionOptions(getActivity(),
R.id.**my_view**,
R.string.**transition_my_view**));
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.