13f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki/* 23f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki * Copyright (C) 2017 The Android Open Source Project 33f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki * 43f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki * Licensed under the Apache License, Version 2.0 (the "License"); 53f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki * you may not use this file except in compliance with the License. 63f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki * You may obtain a copy of the License at 73f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki * 83f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki * http://www.apache.org/licenses/LICENSE-2.0 93f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki * 103f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki * Unless required by applicable law or agreed to in writing, software 113f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki * distributed under the License is distributed on an "AS IS" BASIS, 123f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 133f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki * See the License for the specific language governing permissions and 143f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki * limitations under the License. 153f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki */ 163f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki 173f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Arakipackage com.example.android.support.transition.widget; 183f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki 193f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Arakiimport android.os.Bundle; 203f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Arakiimport android.support.annotation.Nullable; 213f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Arakiimport android.support.transition.AutoTransition; 223f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Arakiimport android.support.transition.Fade; 233f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Arakiimport android.support.transition.Transition; 243f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Arakiimport android.support.v4.app.Fragment; 253f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Arakiimport android.support.v4.app.FragmentManager; 263f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Arakiimport android.support.v4.view.ViewCompat; 273f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Arakiimport android.support.v4.view.animation.FastOutSlowInInterpolator; 283f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Arakiimport android.view.LayoutInflater; 293f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Arakiimport android.view.View; 303f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Arakiimport android.view.ViewGroup; 313f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki 323f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Arakiimport com.example.android.support.transition.R; 333f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki 343f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki/** 353f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki * Demonstrates usage of shared element Transition between Fragments. 363f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki */ 373f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Arakipublic class FragmentTransitionUsage extends TransitionUsageBase { 383f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki 393f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki private static final String SHARED = "red"; 403f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki 413f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki private static final Transition SHARED_TRANSITION = new AutoTransition(); 423f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki private static final Transition NON_SHARED_TRANSITION = new Fade(); 433f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki 443f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki static { 453f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki SHARED_TRANSITION.setDuration(1000); 463f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki SHARED_TRANSITION.setInterpolator(new FastOutSlowInInterpolator()); 473f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki NON_SHARED_TRANSITION.setDuration(1000); 483f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki NON_SHARED_TRANSITION.setInterpolator(new FastOutSlowInInterpolator()); 493f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki } 503f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki 513f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki private static final String FRAGMENT_FIRST = "first"; 523f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki private static final String FRAGMENT_SECOND = "second"; 533f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki 543f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki @Override 553f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki int getLayoutResId() { 563f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki return R.layout.fragment_transition; 573f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki } 583f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki 593f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki @Override 603f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki protected void onCreate(Bundle savedInstanceState) { 613f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki super.onCreate(savedInstanceState); 623f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki if (savedInstanceState == null) { 633f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki getSupportFragmentManager().beginTransaction() 643f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki .replace(R.id.container, new FirstFragment(), FRAGMENT_FIRST) 653f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki .setReorderingAllowed(true) 663f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki .commitNow(); 673f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki } 683f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki } 693f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki 703f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki void showSecond(View sharedElement) { 713f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki FragmentManager fragmentManager = getSupportFragmentManager(); 723f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki final FirstFragment first = 733f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki (FirstFragment) fragmentManager.findFragmentByTag(FRAGMENT_FIRST); 743f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki if (first == null) { 753f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki return; 763f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki } 773f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki final SecondFragment second = new SecondFragment(); 783f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki 793f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki fragmentManager.beginTransaction() 803f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki .replace(R.id.container, second, FRAGMENT_SECOND) 813f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki .addToBackStack(null) 823f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki .setReorderingAllowed(true) 833f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki .addSharedElement(sharedElement, SHARED) 843f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki .commit(); 853f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki } 863f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki 873f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki private abstract static class TransitionFragment extends Fragment { 883f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki 893f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki @Override 903f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki public void onActivityCreated(@Nullable Bundle savedInstanceState) { 913f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki super.onActivityCreated(savedInstanceState); 923f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki setSharedElementEnterTransition(SHARED_TRANSITION); 933f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki setSharedElementReturnTransition(SHARED_TRANSITION); 943f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki setExitTransition(NON_SHARED_TRANSITION); 953f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki setEnterTransition(NON_SHARED_TRANSITION); 963f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki setReenterTransition(NON_SHARED_TRANSITION); 973f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki setReturnTransition(NON_SHARED_TRANSITION); 983f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki setAllowEnterTransitionOverlap(true); 993f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki setAllowReturnTransitionOverlap(true); 1003f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki } 1013f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki 1023f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki } 1033f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki 1043f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki /** 1053f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki * A {@link Fragment} with red and yellow squares. 1063f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki */ 1073f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki public static class FirstFragment extends TransitionFragment { 1083f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki 1093f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki @Nullable 1103f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki @Override 1113f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, 1123f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki @Nullable Bundle savedInstanceState) { 1133f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki return inflater.inflate(R.layout.fragment_transition_first, container, false); 1143f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki } 1153f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki 1163f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki @Override 1173f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 1183f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki final View red = view.findViewById(R.id.red); 1193f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki ViewCompat.setTransitionName(red, SHARED); 1203f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki view.findViewById(R.id.move).setOnClickListener(new View.OnClickListener() { 1213f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki @Override 1223f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki public void onClick(View v) { 1233f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki FragmentTransitionUsage activity = (FragmentTransitionUsage) getActivity(); 1243f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki if (activity != null) { 1253f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki activity.showSecond(red); 1263f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki } 1273f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki } 1283f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki }); 1293f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki } 1303f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki 1313f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki } 1323f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki 1333f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki /** 1343f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki * A {@link Fragment} with red and blue squares. 1353f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki */ 1363f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki public static class SecondFragment extends TransitionFragment { 1373f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki 1383f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki @Nullable 1393f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki @Override 1403f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, 1413f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki @Nullable Bundle savedInstanceState) { 1423f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki return inflater.inflate(R.layout.fragment_transition_second, container, false); 1433f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki } 1443f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki 1453f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki @Override 1463f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 1473f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki ViewCompat.setTransitionName(view.findViewById(R.id.red), SHARED); 1483f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki } 1493f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki 1503f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki } 1513f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki 1523f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki} 153