OSDN Git Service

Demos for show/hide layout transitions
authorChet Haase <chet@google.com>
Tue, 21 Sep 2010 15:28:16 +0000 (08:28 -0700)
committerChet Haase <chet@google.com>
Mon, 4 Oct 2010 22:19:26 +0000 (15:19 -0700)
Change-Id: Idb7ecb66b7dc0126a230385dd09af6a9208d5345

samples/ApiDemos/AndroidManifest.xml
samples/ApiDemos/res/layout/layout_animations_hideshow.xml [new file with mode: 0644]
samples/ApiDemos/src/com/example/android/apis/animation/LayoutAnimations.java
samples/ApiDemos/src/com/example/android/apis/animation/LayoutAnimationsByDefault.java
samples/ApiDemos/src/com/example/android/apis/animation/LayoutAnimationsHideShow.java [new file with mode: 0644]

index 04e7190..c7e61cb 100644 (file)
             </intent-filter>
         </activity>
 
-        <activity android:name=".animation.LayoutAnimations"
-                  android:label="Animation/Layout Animations">
+        <activity android:name=".animation.LayoutAnimationsHideShow"
+                  android:label="Animation/Hide-Show Animations">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <category android:name="android.intent.category.SAMPLE_CODE" />
diff --git a/samples/ApiDemos/res/layout/layout_animations_hideshow.xml b/samples/ApiDemos/res/layout/layout_animations_hideshow.xml
new file mode 100644 (file)
index 0000000..f9ccf62
--- /dev/null
@@ -0,0 +1,46 @@
+<?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="fill_parent"
+    android:layout_height="wrap_content"
+    android:id="@+id/parent"
+    >
+    <LinearLayout
+        android:orientation="horizontal"
+        android:layout_width="fill_parent"
+        android:layout_height="fill_parent"
+        >
+        <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>
index 0648311..a0a50c5 100644 (file)
@@ -36,9 +36,8 @@ import android.os.Bundle;
 import android.widget.Button;
 
 /**
- * This application demonstrates the seeking capability of ValueAnimator. The SeekBar in the
- * UI allows you to set the position of the animation. Pressing the Run button will play from
- * the current position of the animation.
+ * This application demonstrates how to use LayoutTransition to automate transition animations
+ * as items are removed from or added to a container.
  */
 public class LayoutAnimations extends Activity {
 
index d819f00..81d3469 100644 (file)
@@ -28,9 +28,8 @@ import android.os.Bundle;
 import android.widget.Button;
 
 /**
- * This application demonstrates the seeking capability of ValueAnimator. The SeekBar in the
- * UI allows you to set the position of the animation. Pressing the Run button will play from
- * the current position of the animation.
+ * This application demonstrates how to use the animateLayoutChanges tag in XML to automate
+ * transition animations as items are removed from or added to a container.
  */
 public class LayoutAnimationsByDefault extends Activity {
 
diff --git a/samples/ApiDemos/src/com/example/android/apis/animation/LayoutAnimationsHideShow.java b/samples/ApiDemos/src/com/example/android/apis/animation/LayoutAnimationsHideShow.java
new file mode 100644 (file)
index 0000000..9f311b1
--- /dev/null
@@ -0,0 +1,180 @@
+/*
+ * 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.layout_animations_hideshow);
+
+        final CheckBox hideGoneCB = (CheckBox) findViewById(R.id.hideGoneCB);
+
+        container = new FixedGridLayout(this);
+        ((FixedGridLayout)container).setCellHeight(50);
+        ((FixedGridLayout)container).setCellWidth(100);
+        container = new LinearLayout(this);
+
+        // 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<Integer> pvhLeft =
+                new PropertyValuesHolder<Integer>("left", 0, 1);
+        PropertyValuesHolder<Integer> pvhTop =
+                new PropertyValuesHolder<Integer>("top", 0, 1);
+        PropertyValuesHolder<Integer> pvhRight =
+                new PropertyValuesHolder<Integer>("right", 0, 1);
+        PropertyValuesHolder<Integer> pvhBottom =
+                new PropertyValuesHolder<Integer>("bottom", 0, 1);
+        PropertyValuesHolder<Float> pvhScaleX =
+                new PropertyValuesHolder<Float>("scaleX", 1f, 0f, 1f);
+        PropertyValuesHolder<Float> pvhScaleY =
+                new PropertyValuesHolder<Float>("scaleY", 1f, 0f, 1f);
+        final ObjectAnimator changeIn =
+                new ObjectAnimator(transition.getDuration(LayoutTransition.CHANGE_APPEARING),
+                        this, pvhLeft, pvhTop, pvhRight, pvhBottom, pvhScaleX, pvhScaleY);
+        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 = new Keyframe(0f, 0f);
+        Keyframe kf1 = new Keyframe(.9999f, 360f);
+        Keyframe kf2 = new Keyframe(1f, 0f);
+        PropertyValuesHolder<Keyframe> pvhRotation =
+                new PropertyValuesHolder<Keyframe>("rotation", kf0, kf1, kf2);
+        final ObjectAnimator changeOut =
+                new ObjectAnimator(transition.getDuration(LayoutTransition.CHANGE_DISAPPEARING),
+                        this, pvhLeft, pvhTop, pvhRight, pvhBottom, pvhRotation);
+        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<Float> animIn =
+                new ObjectAnimator<Float>(transition.getDuration(LayoutTransition.APPEARING),
+                        null, "rotationY", 90f, 0f);
+        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<Float> animOut =
+                new ObjectAnimator<Float>(transition.getDuration(LayoutTransition.DISAPPEARING),
+                        null, "rotationX", 0f, 90f);
+        transition.setAnimator(LayoutTransition.DISAPPEARING, animOut);
+        animIn.addListener(new AnimatorListenerAdapter() {
+            public void onAnimationEnd(Animator anim) {
+                View view = (View) ((ObjectAnimator) anim).getTarget();
+                view.setRotationX(0f);
+            }
+        });
+
+    }
+}
\ No newline at end of file