Home | History | Annotate | Download | only in fragmenttransition
      1 /*
      2  * Copyright 2014 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *     http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package com.example.android.fragmenttransition;
     18 
     19 import com.example.android.common.logger.Log;
     20 
     21 import android.content.Context;
     22 import android.os.Bundle;
     23 import android.support.v4.app.Fragment;
     24 import android.transition.Scene;
     25 import android.transition.TransitionManager;
     26 import android.view.LayoutInflater;
     27 import android.view.View;
     28 import android.view.ViewGroup;
     29 import android.view.animation.Animation;
     30 import android.view.animation.AnimationUtils;
     31 import android.widget.FrameLayout;
     32 import android.widget.ImageView;
     33 import android.widget.TextView;
     34 
     35 public class DetailFragment extends Fragment implements Animation.AnimationListener {
     36 
     37     private static final String TAG = "DetailFragment";
     38 
     39     private static final String ARG_RESOURCE_ID = "resource_id";
     40     private static final String ARG_TITLE = "title";
     41     private static final String ARG_X = "x";
     42     private static final String ARG_Y = "y";
     43     private static final String ARG_WIDTH = "width";
     44     private static final String ARG_HEIGHT = "height";
     45 
     46     /**
     47      * Create a new instance of DetailFragment.
     48      *
     49      * @param resourceId The resource ID of the Drawable image to show
     50      * @param title The title of the image
     51      * @param x The horizontal position of the grid item in pixel
     52      * @param y The vertical position of the grid item in pixel
     53      * @param width The width of the grid item in pixel
     54      * @param height The height of the grid item in pixel
     55      * @return a new instance of DetailFragment
     56      */
     57     public static DetailFragment newInstance(int resourceId, String title,
     58                                              int x, int y, int width, int height) {
     59         DetailFragment fragment = new DetailFragment();
     60         Bundle args = new Bundle();
     61         args.putInt(ARG_RESOURCE_ID, resourceId);
     62         args.putString(ARG_TITLE, title);
     63         args.putInt(ARG_X, x);
     64         args.putInt(ARG_Y, y);
     65         args.putInt(ARG_WIDTH, width);
     66         args.putInt(ARG_HEIGHT, height);
     67         fragment.setArguments(args);
     68         return fragment;
     69     }
     70 
     71     public DetailFragment() {
     72     }
     73 
     74     @Override
     75     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
     76         return inflater.inflate(R.layout.fragment_detail, container, false);
     77     }
     78 
     79     @Override
     80     public void onViewCreated(View view, Bundle savedInstanceState) {
     81         FrameLayout root = (FrameLayout) view;
     82         Context context = view.getContext();
     83         assert context != null;
     84         // This is how the fragment looks at first. Since the transition is one-way, we don't need to make
     85         // this a Scene.
     86         View item = LayoutInflater.from(context).inflate(R.layout.item_meat_grid, root, false);
     87         assert item != null;
     88         bind(item);
     89         // We adjust the position of the initial image with LayoutParams using the values supplied
     90         // as the fragment arguments.
     91         Bundle args = getArguments();
     92         FrameLayout.LayoutParams params = null;
     93         if (args != null) {
     94             params = new FrameLayout.LayoutParams(
     95                     args.getInt(ARG_WIDTH), args.getInt(ARG_HEIGHT));
     96             params.topMargin = args.getInt(ARG_Y);
     97             params.leftMargin = args.getInt(ARG_X);
     98         }
     99         root.addView(item, params);
    100     }
    101 
    102     @Override
    103     public void onResume() {
    104         super.onResume();
    105     }
    106 
    107     /**
    108      * Bind the views inside of parent with the fragment arguments.
    109      *
    110      * @param parent The parent of views to bind.
    111      */
    112     private void bind(View parent) {
    113         Bundle args = getArguments();
    114         if (args == null) {
    115             return;
    116         }
    117         ImageView image = (ImageView) parent.findViewById(R.id.image);
    118         image.setImageResource(args.getInt(ARG_RESOURCE_ID));
    119         TextView title = (TextView) parent.findViewById(R.id.title);
    120         title.setText(args.getString(ARG_TITLE));
    121     }
    122 
    123     @Override
    124     public Animation onCreateAnimation(int transit, boolean enter, int nextAnim) {
    125         Animation animation = AnimationUtils.loadAnimation(getActivity(),
    126                 enter ? android.R.anim.fade_in : android.R.anim.fade_out);
    127         // We bind a listener for the fragment transaction. We only bind it when
    128         // this fragment is entering.
    129         if (animation != null && enter) {
    130             animation.setAnimationListener(this);
    131         }
    132         return animation;
    133     }
    134 
    135     @Override
    136     public void onAnimationStart(Animation animation) {
    137         // This method is called at the end of the animation for the fragment transaction.
    138         // There is nothing we need to do in this sample.
    139     }
    140 
    141     @Override
    142     public void onAnimationEnd(Animation animation) {
    143         // This method is called at the end of the animation for the fragment transaction,
    144         // which is perfect time to start our Transition.
    145         Log.i(TAG, "Fragment animation ended. Starting a Transition.");
    146         final Scene scene = Scene.getSceneForLayout((ViewGroup) getView(),
    147                 R.layout.fragment_detail_content, getActivity());
    148         TransitionManager.go(scene);
    149         // Note that we need to bind views with data after we call TransitionManager.go().
    150         bind(scene.getSceneRoot());
    151     }
    152 
    153     @Override
    154     public void onAnimationRepeat(Animation animation) {
    155         // This method is never called in this sample because the animation doesn't repeat.
    156     }
    157 
    158 }
    159