Use LayoutTransition to automate transition animations as items are hidden or shown in a container. : Layout « UI « Android






Use LayoutTransition to automate transition animations as items are hidden or shown in a container.

    
/*
 * Copyright (C) 2010 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.example.android.apis.animation;

// Need the following import to get access to the app resources, since this
// class is in a sub-package.
import android.animation.Animator;
import android.animation.ObjectAnimator;
import android.widget.LinearLayout;
import com.example.android.apis.R;

import android.animation.AnimatorListenerAdapter;
import android.animation.Keyframe;
import android.animation.LayoutTransition;
import android.animation.PropertyValuesHolder;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CheckBox;
import android.widget.CompoundButton;

import android.app.Activity;
import android.os.Bundle;
import android.widget.Button;

/**
 * This application demonstrates how to use LayoutTransition to automate transition animations
 * as items are hidden or shown in a container.
 */
public class LayoutAnimationsHideShow extends Activity {

    private int numButtons = 1;
    ViewGroup container = null;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        final CheckBox hideGoneCB = (CheckBox) findViewById(R.id.hideGoneCB);

        container = new LinearLayout(this);
        container.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
                ViewGroup.LayoutParams.MATCH_PARENT));

        // Add a slew of buttons to the container. We won't add any more buttons at runtime, but
        // will just show/hide the buttons we've already created
        for (int i = 0; i < 6; ++i) {
            Button newButton = new Button(this);
            newButton.setText("Click to Hide " + i);
            container.addView(newButton);
            newButton.setOnClickListener(new View.OnClickListener() {
                public void onClick(View v) {
                    v.setVisibility(hideGoneCB.isChecked() ? View.GONE : View.INVISIBLE);
                }
            });
        }
        final LayoutTransition transitioner = new LayoutTransition();
        container.setLayoutTransition(transitioner);

        ViewGroup parent = (ViewGroup) findViewById(R.id.parent);
        parent.addView(container);

        Button addButton = (Button) findViewById(R.id.addNewButton);
        addButton.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                for (int i = 0; i < container.getChildCount(); ++i) {
                    View view = (View) container.getChildAt(i);
                    view.setVisibility(View.VISIBLE);
                }
            }
        });

        CheckBox customAnimCB = (CheckBox) findViewById(R.id.customAnimCB);
        customAnimCB.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                long duration;
                if (isChecked) {
                    transitioner.setStagger(LayoutTransition.CHANGE_APPEARING, 30);
                    transitioner.setStagger(LayoutTransition.CHANGE_DISAPPEARING, 30);
                    setupAnimations(transitioner);
                    duration = 500;
                } else {
                    transitioner.setStagger(LayoutTransition.CHANGE_APPEARING, 0);
                    transitioner.setStagger(LayoutTransition.CHANGE_DISAPPEARING, 0);
                    transitioner.setAnimator(LayoutTransition.APPEARING, null);
                    transitioner.setAnimator(LayoutTransition.DISAPPEARING, null);
                    transitioner.setAnimator(LayoutTransition.CHANGE_APPEARING, null);
                    transitioner.setAnimator(LayoutTransition.CHANGE_DISAPPEARING, null);
                    duration = 300;
                }
                transitioner.setDuration(duration);
            }
        });
    }

    private void setupAnimations(LayoutTransition transition) {
        // Changing while Adding
        PropertyValuesHolder pvhLeft =
                PropertyValuesHolder.ofInt("left", 0, 1);
        PropertyValuesHolder pvhTop =
                PropertyValuesHolder.ofInt("top", 0, 1);
        PropertyValuesHolder pvhRight =
                PropertyValuesHolder.ofInt("right", 0, 1);
        PropertyValuesHolder pvhBottom =
                PropertyValuesHolder.ofInt("bottom", 0, 1);
        PropertyValuesHolder pvhScaleX =
                PropertyValuesHolder.ofFloat("scaleX", 1f, 0f, 1f);
        PropertyValuesHolder pvhScaleY =
                PropertyValuesHolder.ofFloat("scaleY", 1f, 0f, 1f);
        final ObjectAnimator changeIn = ObjectAnimator.ofPropertyValuesHolder(
                        this, pvhLeft, pvhTop, pvhRight, pvhBottom, pvhScaleX, pvhScaleY).
                setDuration(transition.getDuration(LayoutTransition.CHANGE_APPEARING));
        transition.setAnimator(LayoutTransition.CHANGE_APPEARING, changeIn);
        changeIn.addListener(new AnimatorListenerAdapter() {
            public void onAnimationEnd(Animator anim) {
                View view = (View) ((ObjectAnimator) anim).getTarget();
                view.setScaleX(1f);
                view.setScaleY(1f);
            }
        });

        // Changing while Removing
        Keyframe kf0 = Keyframe.ofFloat(0f, 0f);
        Keyframe kf1 = Keyframe.ofFloat(.9999f, 360f);
        Keyframe kf2 = Keyframe.ofFloat(1f, 0f);
        PropertyValuesHolder pvhRotation =
                PropertyValuesHolder.ofKeyframe("rotation", kf0, kf1, kf2);
        final ObjectAnimator changeOut = ObjectAnimator.ofPropertyValuesHolder(
                        this, pvhLeft, pvhTop, pvhRight, pvhBottom, pvhRotation).
                setDuration(transition.getDuration(LayoutTransition.CHANGE_DISAPPEARING));
        transition.setAnimator(LayoutTransition.CHANGE_DISAPPEARING, changeOut);
        changeOut.addListener(new AnimatorListenerAdapter() {
            public void onAnimationEnd(Animator anim) {
                View view = (View) ((ObjectAnimator) anim).getTarget();
                view.setRotation(0f);
            }
        });

        // Adding
        ObjectAnimator animIn = ObjectAnimator.ofFloat(null, "rotationY", 90f, 0f).
                setDuration(transition.getDuration(LayoutTransition.APPEARING));
        transition.setAnimator(LayoutTransition.APPEARING, animIn);
        animIn.addListener(new AnimatorListenerAdapter() {
            public void onAnimationEnd(Animator anim) {
                View view = (View) ((ObjectAnimator) anim).getTarget();
                view.setRotationY(0f);
            }
        });

        // Removing
        ObjectAnimator animOut = ObjectAnimator.ofFloat(null, "rotationX", 0f, 90f).
                setDuration(transition.getDuration(LayoutTransition.DISAPPEARING));
        transition.setAnimator(LayoutTransition.DISAPPEARING, animOut);
        animIn.addListener(new AnimatorListenerAdapter() {
            public void onAnimationEnd(Animator anim) {
                View view = (View) ((ObjectAnimator) anim).getTarget();
                view.setRotationX(0f);
            }
        });

    }
}

//main.xml

<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2010 The Android Open Source Project

     Licensed under the Apache License, Version 2.0 (the "License");
     you may not use this file except in compliance with the License.
     You may obtain a copy of the License at

          http://www.apache.org/licenses/LICENSE-2.0

     Unless required by applicable law or agreed to in writing, software
     distributed under the License is distributed on an "AS IS" BASIS,
     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     See the License for the specific language governing permissions and
     limitations under the License.
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/parent"
    >
    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        >
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Show Buttons"
            android:id="@+id/addNewButton"
            />
        <CheckBox
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Custom Animations"
            android:id="@+id/customAnimCB"
            />
        <CheckBox
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Hide (GONE)"
            android:id="@+id/hideGoneCB"
            />
    </LinearLayout>
</LinearLayout>

   
    
    
    
  








Related examples in the same category

1.Load Layout from xml layout file
2.android:layout_width and android:layout_height
3.Provide layout for different screen size
4.Config your own layout through xml
5.extends FrameLayout
6.Table layout inside a Linear layout
7.Set layout alignment base line
8.Using more than one layout xml
9.Using LayoutInflater
10.res\layout\main.xml
11.Using static string in layout xml file from strings.xml
12.Layout Orientation
13.Set Layout Parameters in your code
14.Layout widget with code only
15.Using two layout xml file for one Activity
16.Create the user interface by inflating a layout resource.
17.Layout input form
18.Layout Animation
19.extends ViewGroup to do layout
20.A layout that arranges its children in a grid.
21.Use the animateLayoutChanges tag in XML to automate transition animations as items are removed from or added to a container.
22.Layout gravity bottom
23.Layout gravity center vertical
24.Layout align Baseline, align Right
25.Layout grid fade
26.Layout bottom to top slide
27.Layout random fade
28.Layout grid inverse fade
29.Layout wave scale
30.Layout animation row left slide
31.Demonstrates a simple linear layout. The height of the layout is the sum of its children.
32.Demonstrates a simple linear layout. The layout fills the screen, with the children stacked from the top.
33.A simple linear layout fills the screen, with the children stacked from the top. The middle child gets allocated any extra space.
34.Demonstrates a horizontal linear layout with equally sized columns
35.Demonstrates a nesting layouts to make a form
36.Demonstrates a horizontal linear layout with equally sized columns. Some columns force their height to match the parent.
37.A simple layout which demonstrates stretching a view to fill the space between two other views.
38.Demonstrates using a relative layout to create a form
39.Demonstrates wrapping a layout in a ScrollView.
40.This example shows how to use cell spanning in a table layout.
41.Tabs that uses labels TabSpec#setIndicator(CharSequence) for indicators and views by id from a layout file TabSpec#setContent(int)
42.This sample application shows how to use layout animation and various transformations on views.
43.Create Linear Layout
44.Create LayoutParam
45.Inflate Layout
46.Layout Utils
47.Set text Size
48.Set right margin
49.Baseline nested
50.Set baselineAlignedChildIndex
51.Align along with Parent
52.Using LayoutParams