diff options
| author | Chet Haase <chet@google.com> | 2013-07-30 17:27:39 +0000 |
|---|---|---|
| committer | Android (Google) Code Review <android-gerrit@google.com> | 2013-07-30 17:27:39 +0000 |
| commit | d9654ca88d01a4282885f95418bd9be4b1c431ee (patch) | |
| tree | 1228eeaf90f6dd3912abd2643e05dad17641cd2e /samples/devbytes | |
| parent | d6cb483b3ce2fc73ebe6a2347e8ba77b5d873352 (diff) | |
| parent | 0d2f159061af1ef1c77ceb1984a64a160d580ef6 (diff) | |
| download | android_development-d9654ca88d01a4282885f95418bd9be4b1c431ee.tar.gz android_development-d9654ca88d01a4282885f95418bd9be4b1c431ee.tar.bz2 android_development-d9654ca88d01a4282885f95418bd9be4b1c431ee.zip | |
Merge "First commit for SlidingFragment."
Diffstat (limited to 'samples/devbytes')
21 files changed, 740 insertions, 0 deletions
diff --git a/samples/devbytes/animation/SlidingFragments/AndroidManifest.xml b/samples/devbytes/animation/SlidingFragments/AndroidManifest.xml new file mode 100644 index 000000000..2e71b6c9c --- /dev/null +++ b/samples/devbytes/animation/SlidingFragments/AndroidManifest.xml @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="utf-8"?> + +<!-- Copyright (C) 2013 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. +--> + +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + package="com.example.android.slidingfragments" + android:versionCode="1" + android:versionName="1.0"> + <uses-sdk android:minSdkVersion="14" + android:targetSdkVersion="17"/> + <application android:label="@string/app_name" android:icon="@drawable/ic_launcher"> + <activity android:name=".SlidingFragments" + android:label="@string/app_name"> + <intent-filter> + <action android:name="android.intent.action.MAIN"/> + <category android:name="android.intent.category.LAUNCHER"/> + </intent-filter> + </activity> + </application> +</manifest> diff --git a/samples/devbytes/animation/SlidingFragments/res/animator/slide_fragment_in.xml b/samples/devbytes/animation/SlidingFragments/res/animator/slide_fragment_in.xml new file mode 100644 index 000000000..7fe333b6d --- /dev/null +++ b/samples/devbytes/animation/SlidingFragments/res/animator/slide_fragment_in.xml @@ -0,0 +1,22 @@ +<!-- Copyright (C) 2013 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. +--> + +<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android" + android:valueFrom="0" + android:valueTo="@dimen/slide_up_down_fraction" + android:propertyName="yFraction" + android:valueType="floatType" + android:duration="@integer/slide_up_down_duration"> +</objectAnimator>
\ No newline at end of file diff --git a/samples/devbytes/animation/SlidingFragments/res/animator/slide_fragment_out.xml b/samples/devbytes/animation/SlidingFragments/res/animator/slide_fragment_out.xml new file mode 100644 index 000000000..4d4134a32 --- /dev/null +++ b/samples/devbytes/animation/SlidingFragments/res/animator/slide_fragment_out.xml @@ -0,0 +1,22 @@ +<!-- Copyright (C) 2013 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. +--> + +<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android" + android:valueFrom="@dimen/slide_up_down_fraction" + android:valueTo="0" + android:propertyName="yFraction" + android:valueType="floatType" + android:duration="@integer/slide_up_down_duration" > +</objectAnimator>
\ No newline at end of file diff --git a/samples/devbytes/animation/SlidingFragments/res/drawable-hdpi/golden_gate.jpg b/samples/devbytes/animation/SlidingFragments/res/drawable-hdpi/golden_gate.jpg Binary files differnew file mode 100644 index 000000000..9a3d3fd7b --- /dev/null +++ b/samples/devbytes/animation/SlidingFragments/res/drawable-hdpi/golden_gate.jpg diff --git a/samples/devbytes/animation/SlidingFragments/res/drawable-hdpi/ic_launcher.png b/samples/devbytes/animation/SlidingFragments/res/drawable-hdpi/ic_launcher.png Binary files differnew file mode 100644 index 000000000..96a442e5b --- /dev/null +++ b/samples/devbytes/animation/SlidingFragments/res/drawable-hdpi/ic_launcher.png diff --git a/samples/devbytes/animation/SlidingFragments/res/drawable-ldpi/ic_launcher.png b/samples/devbytes/animation/SlidingFragments/res/drawable-ldpi/ic_launcher.png Binary files differnew file mode 100644 index 000000000..99238729d --- /dev/null +++ b/samples/devbytes/animation/SlidingFragments/res/drawable-ldpi/ic_launcher.png diff --git a/samples/devbytes/animation/SlidingFragments/res/drawable-mdpi/ic_launcher.png b/samples/devbytes/animation/SlidingFragments/res/drawable-mdpi/ic_launcher.png Binary files differnew file mode 100644 index 000000000..359047dfa --- /dev/null +++ b/samples/devbytes/animation/SlidingFragments/res/drawable-mdpi/ic_launcher.png diff --git a/samples/devbytes/animation/SlidingFragments/res/drawable-xhdpi/ic_launcher.png b/samples/devbytes/animation/SlidingFragments/res/drawable-xhdpi/ic_launcher.png Binary files differnew file mode 100644 index 000000000..71c6d760f --- /dev/null +++ b/samples/devbytes/animation/SlidingFragments/res/drawable-xhdpi/ic_launcher.png diff --git a/samples/devbytes/animation/SlidingFragments/res/layout/image_fragment.xml b/samples/devbytes/animation/SlidingFragments/res/layout/image_fragment.xml new file mode 100644 index 000000000..eb555fea4 --- /dev/null +++ b/samples/devbytes/animation/SlidingFragments/res/layout/image_fragment.xml @@ -0,0 +1,20 @@ +<!-- Copyright (C) 2013 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. +--> + +<ImageView xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:src="@drawable/golden_gate" > +</ImageView>
\ No newline at end of file diff --git a/samples/devbytes/animation/SlidingFragments/res/layout/sliding_fragments_layout.xml b/samples/devbytes/animation/SlidingFragments/res/layout/sliding_fragments_layout.xml new file mode 100644 index 000000000..a789a77c7 --- /dev/null +++ b/samples/devbytes/animation/SlidingFragments/res/layout/sliding_fragments_layout.xml @@ -0,0 +1,31 @@ +<!-- Copyright (C) 2013 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. +--> + +<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:id="@+id/move_to_back_container"> + + <fragment class="com.example.android.slidingfragments.ImageFragment" + android:id="@+id/move_fragment" + android:layout_width="match_parent" + android:layout_height="match_parent" /> + + <View android:id="@+id/dark_hover_view" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:background="@color/black" /> + +</FrameLayout>
\ No newline at end of file diff --git a/samples/devbytes/animation/SlidingFragments/res/layout/text_fragment.xml b/samples/devbytes/animation/SlidingFragments/res/layout/text_fragment.xml new file mode 100644 index 000000000..652acaa7f --- /dev/null +++ b/samples/devbytes/animation/SlidingFragments/res/layout/text_fragment.xml @@ -0,0 +1,104 @@ +<!-- Copyright (C) 2013 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. +--> + +<com.example.android.slidingfragments.FractionalLinearLayout + xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:layout_marginLeft="@dimen/slide_fragment_horizontal_margin" + android:layout_marginRight="@dimen/slide_fragment_horizontal_margin" + android:orientation="vertical" + android:background="@color/white"> + + <TextView + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:text="@string/bridge" + android:textColor="#000000" + android:textStyle="bold" + android:textSize="26sp" + android:layout_marginBottom="@dimen/text_vertical_margin" + android:layout_marginLeft="@dimen/text_horizontal_margin" + android:layout_marginRight="@dimen/text_horizontal_margin" /> + + <TextView + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:text="@string/summary" + android:textSize="18sp" + android:textColor="#000000" + android:layout_marginBottom="@dimen/text_vertical_margin" + android:layout_marginLeft="@dimen/text_horizontal_margin" + android:layout_marginRight="@dimen/text_horizontal_margin" /> + + <TextView + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:text="@string/length" + android:textColor="#000000" + android:layout_marginLeft="@dimen/text_horizontal_margin" + android:layout_marginRight="@dimen/text_horizontal_margin" /> + + <TextView + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:text="@string/span" + android:textColor="#000000" + android:layout_marginLeft="@dimen/text_horizontal_margin" + android:layout_marginRight="@dimen/text_horizontal_margin" /> + + <TextView + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:text="@string/construction" + android:textColor="#000000" + android:layout_marginLeft="@dimen/text_horizontal_margin" + android:layout_marginRight="@dimen/text_horizontal_margin" /> + + <TextView + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:text="@string/height" + android:textColor="#000000" + android:layout_marginLeft="@dimen/text_horizontal_margin" + android:layout_marginRight="@dimen/text_horizontal_margin" /> + + <TextView + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:text="@string/elevation" + android:textColor="#000000" + android:layout_marginLeft="@dimen/text_horizontal_margin" + android:layout_marginRight="@dimen/text_horizontal_margin" /> + + <TextView + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:text="@string/address" + android:textColor="#000000" + android:layout_marginLeft="@dimen/text_horizontal_margin" + android:layout_marginRight="@dimen/text_horizontal_margin" /> + + <TextView + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:text="@string/photo_credits" + android:textColor="#000000" + android:textSize="10sp" + android:layout_marginTop="@dimen/text_vertical_margin" + android:layout_marginLeft="@dimen/text_horizontal_margin" + android:layout_marginRight="@dimen/text_horizontal_margin" /> + +</com.example.android.slidingfragments.FractionalLinearLayout>
\ No newline at end of file diff --git a/samples/devbytes/animation/SlidingFragments/res/values/colors.xml b/samples/devbytes/animation/SlidingFragments/res/values/colors.xml new file mode 100644 index 000000000..f5eb07aad --- /dev/null +++ b/samples/devbytes/animation/SlidingFragments/res/values/colors.xml @@ -0,0 +1,23 @@ +<!-- Copyright (C) 2013 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. +--> + +<resources> + + <color name="red">#ff0000</color> + <color name="black">#000000</color> + <color name="white">#ffffff</color> + <color name="green">#00ff00</color> + +</resources>
\ No newline at end of file diff --git a/samples/devbytes/animation/SlidingFragments/res/values/dimens.xml b/samples/devbytes/animation/SlidingFragments/res/values/dimens.xml new file mode 100644 index 000000000..2b378c132 --- /dev/null +++ b/samples/devbytes/animation/SlidingFragments/res/values/dimens.xml @@ -0,0 +1,22 @@ +<!-- Copyright (C) 2013 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. +--> + +<resources> + + <dimen name="slide_fragment_horizontal_margin">50dp</dimen> + <dimen name="text_vertical_margin">18dp</dimen> + <dimen name="text_horizontal_margin">10dp</dimen> + +</resources> diff --git a/samples/devbytes/animation/SlidingFragments/res/values/integers.xml b/samples/devbytes/animation/SlidingFragments/res/values/integers.xml new file mode 100644 index 000000000..57c19acdd --- /dev/null +++ b/samples/devbytes/animation/SlidingFragments/res/values/integers.xml @@ -0,0 +1,22 @@ +<!-- Copyright (C) 2013 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. +--> + +<resources> + + <integer name="slide_up_down_duration">200</integer> + <integer name="half_slide_up_down_duration">150</integer> + <integer name="slide_up_down_final_value">150</integer> + +</resources>
\ No newline at end of file diff --git a/samples/devbytes/animation/SlidingFragments/res/values/items.xml b/samples/devbytes/animation/SlidingFragments/res/values/items.xml new file mode 100644 index 000000000..2b7f0b58b --- /dev/null +++ b/samples/devbytes/animation/SlidingFragments/res/values/items.xml @@ -0,0 +1,20 @@ +<!-- Copyright (C) 2013 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. +--> + +<resources> + + <item name="slide_up_down_fraction" type="dimen" format="float">0.67</item> + +</resources>
\ No newline at end of file diff --git a/samples/devbytes/animation/SlidingFragments/res/values/strings.xml b/samples/devbytes/animation/SlidingFragments/res/values/strings.xml new file mode 100644 index 000000000..dbc41da47 --- /dev/null +++ b/samples/devbytes/animation/SlidingFragments/res/values/strings.xml @@ -0,0 +1,29 @@ +<!-- Copyright (C) 2013 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. +--> + +<resources> + + <string name="app_name">SlidingFragments</string> + <string name="photo_credits"><b>Golden Gate Sunset</b> by <b>Romain Guy</b></string> + <string name="address"><b>Address:</b> Golden Gate Bridge, San Francisco, CA 94129</string> + <string name="elevation"><b>Elevation:</b> 220\' (67 m)</string> + <string name="height"><b>Height:</b> 746\' (227 m)</string> + <string name="construction"><b>Construction started:</b> 1933</string> + <string name="span"><b>Longest span:</b> 4,200\' (1,280 m)</string> + <string name="length"><b>Total length:</b> 8,980\' (2,737 m)</string> + <string name="summary">"The Golden Gate Bridge is a suspension bridge spanning the Golden Gate, the opening of the San Francisco Bay into the Pacific Ocean."</string> + <string name="bridge">Golden Gate Bridge</string> + +</resources> diff --git a/samples/devbytes/animation/SlidingFragments/src/com/example/android/slidingfragments/FractionalLinearLayout.java b/samples/devbytes/animation/SlidingFragments/src/com/example/android/slidingfragments/FractionalLinearLayout.java new file mode 100644 index 000000000..55f7269da --- /dev/null +++ b/samples/devbytes/animation/SlidingFragments/src/com/example/android/slidingfragments/FractionalLinearLayout.java @@ -0,0 +1,62 @@ +/* + * Copyright (C) 2013 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.slidingfragments; + +import android.content.Context; +import android.util.AttributeSet; +import android.widget.LinearLayout; + +/** + * In order to animate the fragment containing text on/off the screen, + * it is required that we know the height of the device being used. However, + * this can only be determined at runtime, so we cannot specify the required + * translation in an xml file. Since FragmentTransaction's setCustomAnimations + * method requires an ID of an animation defined via an xml file, this linear + * layout was built as a workaround. This custom linear layout is created to specify + * the location of the fragment's layout as a fraction of the device's height. By + * animating yFraction from 0 to 1, we can animate the fragment from the top of + * the screen to the bottom of the screen, regardless of the device's specific size. + */ +public class FractionalLinearLayout extends LinearLayout { + + private float mYFraction; + private int mScreenHeight; + + public FractionalLinearLayout(Context context) { + super(context); + } + + public FractionalLinearLayout(Context context, AttributeSet attrs) { + super(context, attrs); + } + + @Override + protected void onSizeChanged (int w, int h, int oldw, int oldh) { + super.onSizeChanged(w, h, oldw, oldh); + mScreenHeight = h; + setY(mScreenHeight); + } + + public float getYFraction() { + return mYFraction; + } + + public void setYFraction(float yFraction) { + mYFraction = yFraction; + setY((mScreenHeight > 0) ? (mScreenHeight - yFraction * mScreenHeight) : 0); + } +} diff --git a/samples/devbytes/animation/SlidingFragments/src/com/example/android/slidingfragments/ImageFragment.java b/samples/devbytes/animation/SlidingFragments/src/com/example/android/slidingfragments/ImageFragment.java new file mode 100644 index 000000000..e306c98a8 --- /dev/null +++ b/samples/devbytes/animation/SlidingFragments/src/com/example/android/slidingfragments/ImageFragment.java @@ -0,0 +1,39 @@ +/* + * Copyright (C) 2013 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.slidingfragments; + +import android.app.Fragment; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +public class ImageFragment extends Fragment { + + View.OnClickListener clickListener; + + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + View view = inflater.inflate(R.layout.image_fragment, container, false); + view.setOnClickListener(clickListener); + return view; + } + + public void setClickListener(View.OnClickListener clickListener) { + this.clickListener = clickListener; + } +} diff --git a/samples/devbytes/animation/SlidingFragments/src/com/example/android/slidingfragments/OnTextFragmentAnimationEndListener.java b/samples/devbytes/animation/SlidingFragments/src/com/example/android/slidingfragments/OnTextFragmentAnimationEndListener.java new file mode 100644 index 000000000..692a7cbc7 --- /dev/null +++ b/samples/devbytes/animation/SlidingFragments/src/com/example/android/slidingfragments/OnTextFragmentAnimationEndListener.java @@ -0,0 +1,26 @@ +/* + * Copyright (C) 2013 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.slidingfragments; + +/** + * This interface is used to inform the main activity when the entry + * animation of the text fragment has completed in order to avoid the + * start of a new animation before the current one has completed. + */ +public interface OnTextFragmentAnimationEndListener { + public void onAnimationEnd(); +} diff --git a/samples/devbytes/animation/SlidingFragments/src/com/example/android/slidingfragments/SlidingFragments.java b/samples/devbytes/animation/SlidingFragments/src/com/example/android/slidingfragments/SlidingFragments.java new file mode 100644 index 000000000..9bfd8d4a2 --- /dev/null +++ b/samples/devbytes/animation/SlidingFragments/src/com/example/android/slidingfragments/SlidingFragments.java @@ -0,0 +1,200 @@ +/* + * Copyright (C) 2013 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.slidingfragments; + +import android.animation.Animator; +import android.animation.Animator.AnimatorListener; +import android.animation.AnimatorListenerAdapter; +import android.animation.AnimatorSet; +import android.animation.ObjectAnimator; +import android.animation.PropertyValuesHolder; +import android.app.Activity; +import android.app.FragmentManager; +import android.app.FragmentTransaction; +import android.os.Bundle; +import android.view.View; + +/** + * This application shows a simple technique to animate and overlay two fragments + * on top of each other in order to provide a more immersive experience, + * as opposed to only having full screen transitions. When additional content + * (text) related to the currently displayed content (image) is to be shown, + * the currently visible content can be moved into the background instead of + * being removed from the screen entirely. This effect can therefore + * provide a more natural way of displaying additional information to the user + * using a different fragment. + * + * In this specific demo, tapping on the screen toggles between the two + * animated states of the fragment. When the animation is called, + * the fragment with an image animates into the background while the fragment + * containing text slides up on top of it. When the animation is toggled once + * more, the text fragment slides back down and the image fragment regains + * focus. + */ +public class SlidingFragments extends Activity implements + OnTextFragmentAnimationEndListener, FragmentManager.OnBackStackChangedListener { + + ImageFragment mImageFragment; + TextFragment mTextFragment; + View mDarkHoverView; + + boolean mDidSlideOut = false; + boolean mIsAnimating = false; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.sliding_fragments_layout); + + mDarkHoverView = findViewById(R.id.dark_hover_view); + mDarkHoverView.setAlpha(0); + + mImageFragment = (ImageFragment) getFragmentManager().findFragmentById(R.id.move_fragment); + mTextFragment = new TextFragment(); + + getFragmentManager().addOnBackStackChangedListener(this); + + mImageFragment.setClickListener(mClickListener); + mTextFragment.setClickListener(mClickListener); + mTextFragment.setOnTextFragmentAnimationEnd(this); + mDarkHoverView.setOnClickListener(mClickListener); + + } + + View.OnClickListener mClickListener = new View.OnClickListener () { + @Override + public void onClick(View view) { + switchFragments(); + } + }; + + /** + * This method is used to toggle between the two fragment states by + * calling the appropriate animations between them. The entry and exit + * animations of the text fragment are specified in R.animator resource + * files. The entry and exit animations of the image fragment are + * specified in the slideBack and slideForward methods below. The reason + * for separating the animation logic in this way is because the translucent + * dark hover view must fade in at the same time as the image fragment + * animates into the background, which would be difficult to time + * properly given that the setCustomAnimations method can only modify the + * two fragments in the transaction. + */ + private void switchFragments () { + if (mIsAnimating) { + return; + } + mIsAnimating = true; + if (mDidSlideOut) { + mDidSlideOut = false; + getFragmentManager().popBackStack(); + } else { + mDidSlideOut = true; + + AnimatorListener listener = new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator arg0) { + FragmentTransaction transaction = getFragmentManager().beginTransaction(); + transaction.setCustomAnimations(R.animator.slide_fragment_in, 0, 0, + R.animator.slide_fragment_out); + transaction.add(R.id.move_to_back_container, mTextFragment); + transaction.addToBackStack(null); + transaction.commit(); + } + }; + slideBack (listener); + } + } + + @Override + public void onBackStackChanged() { + if (!mDidSlideOut) { + slideForward(null); + } + + } + + /** + * This method animates the image fragment into the background by both + * scaling and rotating the fragment's view, as well as adding a + * translucent dark hover view to inform the user that it is inactive. + */ + public void slideBack(AnimatorListener listener) + { + View movingFragmentView = mImageFragment.getView(); + + PropertyValuesHolder rotateX = PropertyValuesHolder.ofFloat("rotationX", 40f); + PropertyValuesHolder scaleX = PropertyValuesHolder.ofFloat("scaleX", 0.8f); + PropertyValuesHolder scaleY = PropertyValuesHolder.ofFloat("scaleY", 0.8f); + ObjectAnimator movingFragmentAnimator = ObjectAnimator. + ofPropertyValuesHolder(movingFragmentView, rotateX, scaleX, scaleY); + + ObjectAnimator darkHoverViewAnimator = ObjectAnimator. + ofFloat(mDarkHoverView, "alpha", 0.0f, 0.5f); + + ObjectAnimator movingFragmentRotator = ObjectAnimator. + ofFloat(movingFragmentView, "rotationX", 0); + movingFragmentRotator.setStartDelay(getResources(). + getInteger(R.integer.half_slide_up_down_duration)); + + AnimatorSet s = new AnimatorSet(); + s.playTogether(movingFragmentAnimator, darkHoverViewAnimator, movingFragmentRotator); + s.addListener(listener); + s.start(); + } + + /** + * This method animates the image fragment into the foreground by both + * scaling and rotating the fragment's view, while also removing the + * previously added translucent dark hover view. Upon the completion of + * this animation, the image fragment regains focus since this method is + * called from the onBackStackChanged method. + */ + public void slideForward(AnimatorListener listener) + { + View movingFragmentView = mImageFragment.getView(); + + PropertyValuesHolder rotateX = PropertyValuesHolder.ofFloat("rotationX", 40f); + PropertyValuesHolder scaleX = PropertyValuesHolder.ofFloat("scaleX", 1.0f); + PropertyValuesHolder scaleY = PropertyValuesHolder.ofFloat("scaleY", 1.0f); + ObjectAnimator movingFragmentAnimator = ObjectAnimator. + ofPropertyValuesHolder(movingFragmentView, rotateX, scaleX, scaleY); + + ObjectAnimator darkHoverViewAnimator = ObjectAnimator. + ofFloat(mDarkHoverView, "alpha", 0.5f, 0.0f); + + ObjectAnimator movingFragmentRotator = ObjectAnimator. + ofFloat(movingFragmentView, "rotationX", 0); + movingFragmentRotator.setStartDelay( + getResources().getInteger(R.integer.half_slide_up_down_duration)); + + AnimatorSet s = new AnimatorSet(); + s.playTogether(movingFragmentAnimator, movingFragmentRotator, darkHoverViewAnimator); + s.setStartDelay(getResources().getInteger(R.integer.slide_up_down_duration)); + s.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + mIsAnimating = false; + } + }); + s.start(); + } + + public void onAnimationEnd() { + mIsAnimating = false; + } +} diff --git a/samples/devbytes/animation/SlidingFragments/src/com/example/android/slidingfragments/TextFragment.java b/samples/devbytes/animation/SlidingFragments/src/com/example/android/slidingfragments/TextFragment.java new file mode 100644 index 000000000..f1f245cee --- /dev/null +++ b/samples/devbytes/animation/SlidingFragments/src/com/example/android/slidingfragments/TextFragment.java @@ -0,0 +1,65 @@ +/* + * Copyright (C) 2013 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.slidingfragments; + +import android.animation.Animator; +import android.animation.AnimatorInflater; +import android.animation.AnimatorListenerAdapter; +import android.app.Fragment; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +public class TextFragment extends Fragment { + + View.OnClickListener clickListener; + OnTextFragmentAnimationEndListener mListener; + + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + View view = inflater.inflate(R.layout.text_fragment, container, false); + view.setOnClickListener(clickListener); + return view; + } + + public void setClickListener(View.OnClickListener clickListener) { + this.clickListener = clickListener; + } + + @Override + public Animator onCreateAnimator(int transit, boolean enter, int nextAnim) + { + int id = enter ? R.animator.slide_fragment_in : R.animator.slide_fragment_out; + final Animator anim = AnimatorInflater.loadAnimator(getActivity(), id); + if (enter) { + anim.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + mListener.onAnimationEnd(); + } + }); + } + return anim; + } + + public void setOnTextFragmentAnimationEnd(OnTextFragmentAnimationEndListener listener) + { + mListener = listener; + } + +} |
