From 0ce081512d8b9c61761edb60c5ba0f7ce1d0dbd9 Mon Sep 17 00:00:00 2001 From: seven332 Date: Tue, 24 Mar 2015 16:46:50 +0800 Subject: [PATCH] Update Scene --- .../animation/SimpleAnimatorListener.java | 37 +++++++++ .../ehviewer/ui/scene/GalleryListScene.java | 3 +- .../main/java/com/hippo/scene/Curtain.java | 25 ++++-- app/src/main/java/com/hippo/scene/Scene.java | 20 ++++- .../com/hippo/scene/TransitionCurtain.java | 79 ++++++++++--------- app/src/main/res/layout/fragment_list.xml | 8 ++ app/src/main/res/layout/scene_test.xml | 8 ++ app/src/main/res/values-v19/themes.xml | 2 + app/src/main/res/values-v21/themes.xml | 2 + app/src/main/res/values/themes.xml | 1 + 10 files changed, 141 insertions(+), 44 deletions(-) create mode 100644 app/src/main/java/com/hippo/animation/SimpleAnimatorListener.java diff --git a/app/src/main/java/com/hippo/animation/SimpleAnimatorListener.java b/app/src/main/java/com/hippo/animation/SimpleAnimatorListener.java new file mode 100644 index 000000000..827fbb8b3 --- /dev/null +++ b/app/src/main/java/com/hippo/animation/SimpleAnimatorListener.java @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2015 Hippo Seven + * + * 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 + * 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.hippo.animation; + +import android.animation.Animator; + +public class SimpleAnimatorListener implements Animator.AnimatorListener { + + @Override + public void onAnimationStart(Animator animation) { + } + + @Override + public void onAnimationEnd(Animator animation) { + } + + @Override + public void onAnimationCancel(Animator animation) { + } + + @Override + public void onAnimationRepeat(Animator animation) { + } +} diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryListScene.java b/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryListScene.java index c352f48e4..824af45da 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryListScene.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryListScene.java @@ -87,7 +87,8 @@ public class GalleryListScene extends Scene implements SearchLayout.SearhLayoutH @Override public void onClick(View v) { startScene(TestScene.class, null, new TransitionCurtain(new TransitionCurtain.ViewPair[] { - new TransitionCurtain.ViewPair(R.id.haha, R.id.haha) + new TransitionCurtain.ViewPair(R.id.haha, R.id.haha), + new TransitionCurtain.ViewPair(R.id.bbbbbb, R.id.bbbbbb) })); } }); diff --git a/app/src/main/java/com/hippo/scene/Curtain.java b/app/src/main/java/com/hippo/scene/Curtain.java index 6c8ad54a2..47c950b69 100644 --- a/app/src/main/java/com/hippo/scene/Curtain.java +++ b/app/src/main/java/com/hippo/scene/Curtain.java @@ -19,16 +19,31 @@ import android.support.annotation.NonNull; public abstract class Curtain { + /** + * Called when + * + * @param enter the scene on the top of the scene stack + * @param exit the scene behind the enter scene + */ public abstract void open(@NonNull Scene enter, @NonNull Scene exit); public abstract void close(@NonNull Scene enter, @NonNull Scene exit); /** - * Call it after {@link #close} - * - * @param scene the scene + * End open or close animation */ - protected void dispatchDetachFromeStage(Scene scene) { - scene.detachFromeStage(); + public abstract void endAnimation(); + + /** + * Is open or close animation running + */ + public abstract boolean isInAnimation(); + + protected void dispatchOpenFinished(@NonNull Scene enter, @NonNull Scene exit) { + + } + + protected void dispatchCloseFinished(@NonNull Scene enter, @NonNull Scene exit) { + exit.detachFromeStage(); } } diff --git a/app/src/main/java/com/hippo/scene/Scene.java b/app/src/main/java/com/hippo/scene/Scene.java index 4e36ad693..ce25fee43 100644 --- a/app/src/main/java/com/hippo/scene/Scene.java +++ b/app/src/main/java/com/hippo/scene/Scene.java @@ -37,10 +37,19 @@ import com.hippo.util.AssertUtils; */ public abstract class Scene { + static final int SCENE_STATE_CREATE = 0; + static final int SCENE_STATE_RUN = 1; + static final int SCENE_STATE_DESTROY = 2; + static final int SCENE_STATE_OPEN = 3; + static final int SCENE_STATE_CLOSE = 4; + static final int SCENE_STATE_PAUSE = 5; + private @Nullable FrameLayout mSceneView; private int mBackgroundColor = 0xffeeeeee; // TODO Need a better to set background color + private int mState = SCENE_STATE_CREATE; + private static SceneManager sSceneManager; static void setSceneManager(SceneManager sceneManager) { @@ -76,6 +85,14 @@ public abstract class Scene { sSceneManager.startScene(sceneClass, announcer, curtain); } + int getState() { + return mState; + } + + void setState(int state) { + mState = state; + } + public final void finish() { sSceneManager.finishScene(this); } @@ -131,8 +148,6 @@ public abstract class Scene { return mBackgroundColor; } - - protected void setContentView(int resId) { AssertUtils.assertNull("Only call setContentView once", mSceneView); @@ -240,6 +255,7 @@ public abstract class Scene { } public void onBackPressed() { + // TODO First click to show finish animation, click again to finish the animation at once and it is finished finish(); } diff --git a/app/src/main/java/com/hippo/scene/TransitionCurtain.java b/app/src/main/java/com/hippo/scene/TransitionCurtain.java index 8fb69f575..c1356c83f 100644 --- a/app/src/main/java/com/hippo/scene/TransitionCurtain.java +++ b/app/src/main/java/com/hippo/scene/TransitionCurtain.java @@ -24,15 +24,20 @@ import android.view.View; import android.view.ViewTreeObserver; import com.hippo.animation.ArgbEvaluator; +import com.hippo.animation.SimpleAnimatorListener; import com.hippo.util.ViewUtils; +import java.util.LinkedList; +import java.util.List; + public class TransitionCurtain extends Curtain { - private static long ANIMATE_DELAY = 500L; private static long ANIMATE_TIME = 800L; private ViewPair[] mViewPairArray; + private List mAnimList = new LinkedList<>(); + public TransitionCurtain(ViewPair[] viewPairArray) { mViewPairArray = viewPairArray; } @@ -51,8 +56,17 @@ public class TransitionCurtain extends Curtain { colorAnim.setEvaluator(ArgbEvaluator.getInstance()); colorAnim.setDuration(ANIMATE_TIME); + colorAnim.addListener(new SimpleAnimatorListener() { + @Override + public void onAnimationEnd(Animator animation) { + mAnimList.clear(); + } + }); + colorAnim.start(); + mAnimList.add(colorAnim); + // Handle transit part for (ViewPair pair : mViewPairArray) { final View enterView = pair.getToView(enter); @@ -98,11 +112,7 @@ public class TransitionCurtain extends Curtain { @Override public void onAnimationEnd(Animator animation) { ViewUtils.setVisibility(exitView, View.VISIBLE); - } - - @Override - public void onAnimationCancel(Animator animation) { - ViewUtils.setVisibility(exitView, View.VISIBLE); + ViewUtils.setVisibility(exit.getSceneView(), View.GONE); } }); @@ -111,6 +121,11 @@ public class TransitionCurtain extends Curtain { xAnim.start(); yAnim.start(); + mAnimList.add(scaleXAnim); + mAnimList.add(scaleYAnim); + mAnimList.add(xAnim); + mAnimList.add(yAnim); + // TODO show other part progressively } }); @@ -120,6 +135,8 @@ public class TransitionCurtain extends Curtain { @Override public void close(@NonNull Scene enter, final @NonNull Scene exit) { + ViewUtils.setVisibility(enter.getSceneView(), View.VISIBLE); + // Handle background ObjectAnimator colorAnim = ObjectAnimator.ofInt(exit, "backgroundColor", Color.TRANSPARENT); colorAnim.setEvaluator(ArgbEvaluator.getInstance()); @@ -183,6 +200,18 @@ public class TransitionCurtain extends Curtain { } } + @Override + public void endAnimation() { + for (ObjectAnimator oa : mAnimList) { + oa.end(); + } + } + + @Override + public boolean isInAnimation() { + return !mAnimList.isEmpty(); + } + public static class ViewPair { private int[] mIds; @@ -196,26 +225,23 @@ public class TransitionCurtain extends Curtain { mHelper = helper; } - private @Nullable View getFromView(Scene scene) { - View sceneView = scene.getSceneView(); - - if (mIds != null && sceneView != null) { - return sceneView.findViewById(mIds[0]); + private @Nullable View getFromView(@NonNull Scene scene) { + if (mIds != null) { + return scene.findViewById(mIds[0]); } if (mHelper != null) { - return mHelper.getFromView(sceneView); + return mHelper.getFromView(scene.getSceneView()); } return null; } - private @Nullable View getToView(Scene scene) { - View sceneView = scene.getSceneView(); + private @Nullable View getToView(@NonNull Scene scene) { - if (mIds != null && sceneView != null) { - return sceneView.findViewById(mIds[1]); + if (mIds != null) { + return scene.findViewById(mIds[1]); } if (mHelper != null) { - return mHelper.getToView(sceneView); + return mHelper.getToView(scene.getSceneView()); } return null; } @@ -227,23 +253,4 @@ public class TransitionCurtain extends Curtain { public abstract View getToView(@Nullable View sceneView); } - - public class SimpleAnimatorListener implements Animator.AnimatorListener { - - @Override - public void onAnimationStart(Animator animation) { - } - - @Override - public void onAnimationEnd(Animator animation) { - } - - @Override - public void onAnimationCancel(Animator animation) { - } - - @Override - public void onAnimationRepeat(Animator animation) { - } - } } diff --git a/app/src/main/res/layout/fragment_list.xml b/app/src/main/res/layout/fragment_list.xml index 9d3f3aeca..13ecb22d0 100644 --- a/app/src/main/res/layout/fragment_list.xml +++ b/app/src/main/res/layout/fragment_list.xml @@ -32,4 +32,12 @@ android:id="@+id/test_button" android:layout_gravity="right|center_vertical"/> + + diff --git a/app/src/main/res/layout/scene_test.xml b/app/src/main/res/layout/scene_test.xml index d8660791e..44836da62 100644 --- a/app/src/main/res/layout/scene_test.xml +++ b/app/src/main/res/layout/scene_test.xml @@ -27,4 +27,12 @@ android:src="@drawable/ic_happy" android:scaleType="fitXY"/> + + diff --git a/app/src/main/res/values-v19/themes.xml b/app/src/main/res/values-v19/themes.xml index e27d3e36f..0991491e8 100644 --- a/app/src/main/res/values-v19/themes.xml +++ b/app/src/main/res/values-v19/themes.xml @@ -21,6 +21,8 @@ diff --git a/app/src/main/res/values-v21/themes.xml b/app/src/main/res/values-v21/themes.xml index f6895d5aa..a71ed672b 100644 --- a/app/src/main/res/values-v21/themes.xml +++ b/app/src/main/res/values-v21/themes.xml @@ -16,6 +16,8 @@