diff --git a/ResideMenu/src/com/special/ResideMenu/ResideMenu.java b/ResideMenu/src/com/special/ResideMenu/ResideMenu.java index f7d7de0..83f09e0 100644 --- a/ResideMenu/src/com/special/ResideMenu/ResideMenu.java +++ b/ResideMenu/src/com/special/ResideMenu/ResideMenu.java @@ -47,7 +47,7 @@ public class ResideMenu extends FrameLayout{ private ViewGroup viewDecor; private TouchDisableView viewActivity; /** The flag of menu opening status. */ - private boolean isOpened; + private boolean isOpened; private float shadowAdjustScaleX; private float shadowAdjustScaleY; /** Views which need stop to intercept touch events. */ @@ -254,33 +254,42 @@ public OnMenuListener getMenuListener() { * Show the menu; */ public void openMenu(int direction){ + openMenu(direction, true); + } + public void openMenu(int direction, boolean withAnimations){ setScaleDirection(direction); isOpened = true; - AnimatorSet scaleDown_activity = buildScaleDownAnimation(viewActivity, mScaleValue, mScaleValue); - AnimatorSet scaleDown_shadow = buildScaleDownAnimation(imageViewShadow, - mScaleValue + shadowAdjustScaleX, mScaleValue + shadowAdjustScaleY); - AnimatorSet alpha_menu = buildMenuAnimation(scrollViewMenu, 1.0f); - scaleDown_shadow.addListener(animationListener); - scaleDown_activity.playTogether(scaleDown_shadow); - scaleDown_activity.playTogether(alpha_menu); - scaleDown_activity.start(); + int duration = withAnimations ? 250 : 0; + AnimatorSet activityScaleDown = buildScaleDownAnimation(viewActivity, mScaleValue, mScaleValue, duration); + AnimatorSet shadowScaleDown = buildScaleDownAnimation(imageViewShadow, + mScaleValue + shadowAdjustScaleX, mScaleValue + shadowAdjustScaleY, duration); + AnimatorSet menuAlpha = buildMenuAnimation(scrollViewMenu, 1.0f, duration); + shadowScaleDown.addListener(animationListener); + activityScaleDown.playTogether(shadowScaleDown); + activityScaleDown.playTogether(menuAlpha); + activityScaleDown.start(); } /** * Close the menu; */ public void closeMenu(){ + closeMenu(true); + } + + public void closeMenu(boolean withAnimations){ isOpened = false; - AnimatorSet scaleUp_activity = buildScaleUpAnimation(viewActivity, 1.0f, 1.0f); - AnimatorSet scaleUp_shadow = buildScaleUpAnimation(imageViewShadow, 1.0f, 1.0f); - AnimatorSet alpha_menu = buildMenuAnimation(scrollViewMenu, 0.0f); - scaleUp_activity.addListener(animationListener); - scaleUp_activity.playTogether(scaleUp_shadow); - scaleUp_activity.playTogether(alpha_menu); - scaleUp_activity.start(); + int duration = withAnimations ? 250 : 0; + AnimatorSet activityScaleUp = buildScaleUpAnimation(viewActivity, 1.0f, 1.0f, duration); + AnimatorSet shadowScaleUp = buildScaleUpAnimation(imageViewShadow, 1.0f, 1.0f, duration); + AnimatorSet alpha_menu = buildMenuAnimation(scrollViewMenu, 0.0f, duration); + activityScaleUp.addListener(animationListener); + activityScaleUp.playTogether(shadowScaleUp); + activityScaleUp.playTogether(alpha_menu); + activityScaleUp.start(); } @Deprecated @@ -318,7 +327,7 @@ private void setScaleDirection(int direction){ } /** - * return the flag of menu status; + * Return the flag of menu status; * * @return */ @@ -326,6 +335,15 @@ public boolean isOpened() { return isOpened; } + /** + * Return the current opening direction of menu. + * + * @return + */ + public int getCurrentDirection() { + return scaleDirection; + } + private OnClickListener viewActivityOnClickListener = new OnClickListener() { @Override public void onClick(View view) { @@ -345,7 +363,7 @@ public void onAnimationStart(Animator animation) { @Override public void onAnimationEnd(Animator animation) { - // reset the view; + // Reset the view; if(isOpened()){ viewActivity.setTouchDisable(true); viewActivity.setOnClickListener(viewActivityOnClickListener); @@ -378,7 +396,8 @@ public void onAnimationRepeat(Animator animation) { * @param targetScaleY * @return */ - private AnimatorSet buildScaleDownAnimation(View target,float targetScaleX,float targetScaleY){ + private AnimatorSet buildScaleDownAnimation( + View target,float targetScaleX, float targetScaleY, int duration){ AnimatorSet scaleDown = new AnimatorSet(); scaleDown.playTogether( @@ -388,7 +407,7 @@ private AnimatorSet buildScaleDownAnimation(View target,float targetScaleX,float scaleDown.setInterpolator(AnimationUtils.loadInterpolator(activity, android.R.anim.decelerate_interpolator)); - scaleDown.setDuration(250); + scaleDown.setDuration(duration); return scaleDown; } @@ -400,7 +419,8 @@ private AnimatorSet buildScaleDownAnimation(View target,float targetScaleX,float * @param targetScaleY * @return */ - private AnimatorSet buildScaleUpAnimation(View target,float targetScaleX,float targetScaleY){ + private AnimatorSet buildScaleUpAnimation( + View target,float targetScaleX,float targetScaleY, int duration){ AnimatorSet scaleUp = new AnimatorSet(); scaleUp.playTogether( @@ -408,18 +428,18 @@ private AnimatorSet buildScaleUpAnimation(View target,float targetScaleX,float t ObjectAnimator.ofFloat(target, "scaleY", targetScaleY) ); - scaleUp.setDuration(250); + scaleUp.setDuration(duration); return scaleUp; } - private AnimatorSet buildMenuAnimation(View target, float alpha){ + private AnimatorSet buildMenuAnimation(View target, float alpha, int duration){ AnimatorSet alphaAnimation = new AnimatorSet(); alphaAnimation.playTogether( ObjectAnimator.ofFloat(target, "alpha", alpha) ); - alphaAnimation.setDuration(250); + alphaAnimation.setDuration(duration); return alphaAnimation; } @@ -600,4 +620,5 @@ private void hideScrollViewMenu(ScrollView scrollViewMenu){ removeView(scrollViewMenu); } } + } diff --git a/ResideMenuDemo/src/com/special/ResideMenuDemo/MenuActivity.java b/ResideMenuDemo/src/com/special/ResideMenuDemo/MenuActivity.java index f80c925..b6a8150 100644 --- a/ResideMenuDemo/src/com/special/ResideMenuDemo/MenuActivity.java +++ b/ResideMenuDemo/src/com/special/ResideMenuDemo/MenuActivity.java @@ -18,6 +18,8 @@ public class MenuActivity extends FragmentActivity implements View.OnClickListen private ResideMenuItem itemProfile; private ResideMenuItem itemCalendar; private ResideMenuItem itemSettings; + private static final String MENU_STATE = "MenuActivity.MENU_STATE"; + private static final String MENU_DIRECTION = "MenuActivity.MENU_DIRECTION"; /** * Called when the activity is first created. @@ -27,19 +29,20 @@ public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mContext = this; - setUpMenu(); - if( savedInstanceState == null ) + setUpMenu(savedInstanceState); + if( savedInstanceState == null ) { changeFragment(new HomeFragment()); + } } - private void setUpMenu() { + + private void setUpMenu(Bundle savedInstanceState) { // attach to current activity; resideMenu = new ResideMenu(this); resideMenu.setBackground(R.drawable.menu_background); resideMenu.attachToActivity(this); resideMenu.setMenuListener(menuListener); - //valid scale factor is between 0.0f and 1.0f. leftmenu'width is 150dip. resideMenu.setScaleValue(0.6f); // create menu items; @@ -73,6 +76,11 @@ public void onClick(View view) { resideMenu.openMenu(ResideMenu.DIRECTION_RIGHT); } }); + + // Restore the menu state by savedInstanceState. + if ( savedInstanceState != null && savedInstanceState.getBoolean(MENU_STATE) == true ) { + resideMenu.openMenu(savedInstanceState.getInt(MENU_DIRECTION)); + } } @Override @@ -117,8 +125,16 @@ private void changeFragment(Fragment targetFragment){ .commit(); } - // What good method is to access resideMenu? public ResideMenu getResideMenu(){ return resideMenu; } + + @Override + protected void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + if (resideMenu != null) { + outState.putBoolean(MENU_STATE, resideMenu.isOpened()); + outState.putInt(MENU_DIRECTION, resideMenu.getCurrentDirection()); + } + } }