Home | History | Annotate | Download | only in layouttranschanging
      1 /*
      2  * Copyright (C) 2013 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.layouttranschanging;
     18 
     19 import android.animation.LayoutTransition;
     20 import android.app.Activity;
     21 import android.content.Context;
     22 import android.os.Bundle;
     23 import android.view.View;
     24 import android.view.ViewGroup;
     25 import android.widget.Button;
     26 import android.widget.LinearLayout;
     27 import android.widget.LinearLayout.LayoutParams;
     28 
     29 /**
     30  * This example shows how to use LayoutTransition to animate simple changes in a layout
     31  * container.
     32  *
     33  * Watch the associated video for this demo on the DevBytes channel of developer.android.com
     34  * or on YouTube at https://www.youtube.com/watch?v=55wLsaWpQ4g.
     35  */
     36 public class LayoutTransChanging extends Activity {
     37 
     38     @Override
     39     public void onCreate(Bundle savedInstanceState) {
     40         super.onCreate(savedInstanceState);
     41         setContentView(R.layout.main);
     42 
     43         final Button addButton =
     44                 (Button) findViewById(R.id.addButton);
     45         final Button removeButton =
     46                 (Button) findViewById(R.id.removeButton);
     47         final LinearLayout container =
     48                 (LinearLayout) findViewById(R.id.container);
     49         final Context context = this;
     50 
     51         // Start with two views
     52         for (int i = 0; i < 2; ++i) {
     53             container.addView(new ColoredView(this));
     54         }
     55 
     56         addButton.setOnClickListener(new View.OnClickListener() {
     57             @Override
     58             public void onClick(View v) {
     59                 // Adding a view will cause a LayoutTransition animation
     60                 container.addView(new ColoredView(context), 1);
     61             }
     62         });
     63 
     64         removeButton.setOnClickListener(new View.OnClickListener() {
     65             @Override
     66             public void onClick(View v) {
     67                 if (container.getChildCount() > 0) {
     68                     // Removing a view will cause a LayoutTransition animation
     69                     container.removeViewAt(Math.min(1, container.getChildCount() - 1));
     70                 }
     71             }
     72         });
     73 
     74         // Note that this assumes a LayoutTransition is set on the container, which is the
     75         // case here because the container has the attribute "animateLayoutChanges" set to true
     76         // in the layout file. You can also call setLayoutTransition(new LayoutTransition()) in
     77         // code to set a LayoutTransition on any container.
     78         LayoutTransition transition = container.getLayoutTransition();
     79 
     80         // New capability as of Jellybean; monitor the container for *all* layout changes
     81         // (not just add/remove/visibility changes) and animate these changes as well.
     82         transition.enableTransitionType(LayoutTransition.CHANGING);
     83     }
     84 
     85     /**
     86      * Custom view painted with a random background color and two different sizes which are
     87      * toggled between due to user interaction.
     88      */
     89     private static class ColoredView extends View {
     90 
     91         private boolean mExpanded = false;
     92 
     93         private LayoutParams mCompressedParams = new LayoutParams(
     94                 ViewGroup.LayoutParams.MATCH_PARENT, 50);
     95 
     96         private LayoutParams mExpandedParams = new LayoutParams(
     97                 ViewGroup.LayoutParams.MATCH_PARENT, 200);
     98 
     99         private ColoredView(Context context) {
    100             super(context);
    101             int red = (int)(Math.random() * 128 + 127);
    102             int green = (int)(Math.random() * 128 + 127);
    103             int blue = (int)(Math.random() * 128 + 127);
    104             int color = 0xff << 24 | (red << 16) |
    105                     (green << 8) | blue;
    106             setBackgroundColor(color);
    107             setLayoutParams(mCompressedParams);
    108             setOnClickListener(new OnClickListener() {
    109                 @Override
    110                 public void onClick(View v) {
    111                     // Size changes will cause a LayoutTransition animation if the CHANGING
    112                     // transition is enabled
    113                     setLayoutParams(mExpanded ? mCompressedParams : mExpandedParams);
    114                     mExpanded = !mExpanded;
    115                     requestLayout();
    116                 }
    117             });
    118         }
    119     }
    120 }
    121