Advertisement
Guest User

ResideMenu.java

a guest
Dec 29th, 2017
633
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 23.17 KB | None | 0 0
  1. package com.androidmkab.residemenu;
  2.  
  3. import android.app.Activity;
  4. import android.content.Context;
  5. import android.content.res.Configuration;
  6. import android.content.res.Resources;
  7. import android.graphics.Rect;
  8. import android.util.DisplayMetrics;
  9. import android.view.KeyCharacterMap;
  10. import android.view.KeyEvent;
  11. import android.view.LayoutInflater;
  12. import android.view.MotionEvent;
  13. import android.view.View;
  14. import android.view.ViewGroup;
  15. import android.view.animation.AnimationUtils;
  16. import android.widget.FrameLayout;
  17. import android.widget.ImageView;
  18. import android.widget.LinearLayout;
  19. import android.widget.RelativeLayout;
  20.  
  21. import com.nineoldandroids.animation.Animator;
  22. import com.nineoldandroids.animation.AnimatorSet;
  23. import com.nineoldandroids.animation.ObjectAnimator;
  24. import com.nineoldandroids.view.ViewHelper;
  25.  
  26. import java.util.ArrayList;
  27. import java.util.List;
  28.  
  29. /**
  30.  * User: special
  31.  * Date: 13-12-10
  32.  * Time: 下午10:44
  33.  */
  34. public class ResideMenu extends FrameLayout {
  35.  
  36.     public static final int DIRECTION_LEFT = 0;
  37.    // public static final int DIRECTION_RIGHT = 1;
  38.     private static final int PRESSED_MOVE_HORIZONTAL = 2;
  39.     private static final int PRESSED_DOWN = 3;
  40.     private static final int PRESSED_DONE = 4;
  41.     private static final int PRESSED_MOVE_VERTICAL = 5;
  42.  
  43.     private ImageView imageViewShadow;
  44.     private ImageView imageViewBackground;
  45.     private LinearLayout layoutLeftMenu;
  46.     private LinearLayout layoutRightMenu;
  47.     private View scrollViewLeftMenu;
  48.     private View scrollViewRightMenu;
  49.     private View scrollViewMenu;
  50.     /**
  51.      * Current attaching activity.
  52.      */
  53.     private Activity activity;
  54.     /**
  55.      * The DecorView of current activity.
  56.      */
  57.     private ViewGroup viewDecor;
  58.     private TouchDisableView viewActivity;
  59.     /**
  60.      * The flag of menu opening status.
  61.      */
  62.     private boolean isOpened;
  63.     private float shadowAdjustScaleX;
  64.     private float shadowAdjustScaleY;
  65.     /**
  66.      * Views which need stop to intercept touch events.
  67.      */
  68.     private List<View> ignoredViews;
  69.     private List<ResideMenuItem> leftMenuItems;
  70.     private List<ResideMenuItem> rightMenuItems;
  71.     private DisplayMetrics displayMetrics = new DisplayMetrics();
  72.     private OnMenuListener menuListener;
  73.     private float lastRawX;
  74.     private boolean isInIgnoredView = false;
  75.     private int scaleDirection = DIRECTION_LEFT;
  76.     private int pressedState = PRESSED_DOWN;
  77.     private List<Integer> disabledSwipeDirection = new ArrayList<Integer>();
  78.     // Valid scale factor is between 0.0f and 1.0f.
  79.     private float mScaleValue = 0.5f;
  80.  
  81.     private boolean mUse3D;
  82.     private static final int ROTATE_Y_ANGLE = 10;
  83.  
  84.     public ResideMenu(Context context) {
  85.         super(context);
  86.         initViews(context, -1, -1);
  87.     }
  88.  
  89.     /**
  90.      * This constructor provides you to create menus with your own custom
  91.      * layouts, but if you use custom menu then do not call addMenuItem because
  92.      * it will not be able to find default views
  93.      */
  94.     public ResideMenu(Context context, int customLeftMenuId,
  95.                       int customRightMenuId) {
  96.         super(context);
  97.         initViews(context, customLeftMenuId, customRightMenuId);
  98.     }
  99.  
  100.     private void initViews(Context context, int customLeftMenuId,
  101.                            int customRightMenuId) {
  102.         LayoutInflater inflater = (LayoutInflater) context
  103.                 .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
  104.         inflater.inflate(R.layout.residemenu_custom, this);
  105.  
  106.         if (customLeftMenuId >= 0) {
  107.             scrollViewLeftMenu = inflater.inflate(customLeftMenuId, this, false);
  108.         } else {
  109.             scrollViewLeftMenu = inflater.inflate(
  110.                     R.layout.residemenu_custom_left_scrollview, this, false);
  111.             layoutLeftMenu = (LinearLayout) scrollViewLeftMenu.findViewById(R.id.layout_left_menu);
  112.         }
  113.  
  114.         if (customRightMenuId >= 0) {
  115.             scrollViewRightMenu = inflater.inflate(customRightMenuId, this, false);
  116.         } else {
  117.             scrollViewRightMenu = inflater.inflate(
  118.                     R.layout.residemenu_custom_right_scrollview, this, false);
  119.             layoutRightMenu = (LinearLayout) scrollViewRightMenu.findViewById(R.id.layout_right_menu);
  120.         }
  121.  
  122.         imageViewShadow = (ImageView) findViewById(R.id.iv_shadow);
  123.         imageViewBackground = (ImageView) findViewById(R.id.iv_background);
  124.  
  125.         RelativeLayout menuHolder = (RelativeLayout) findViewById(R.id.sv_menu_holder);
  126.         menuHolder.addView(scrollViewLeftMenu);
  127.         menuHolder.addView(scrollViewRightMenu);
  128.     }
  129.  
  130.     /**
  131.      * Returns left menu view so you can findViews and do whatever you want with
  132.      */
  133.     public View getLeftMenuView() {
  134.         return scrollViewLeftMenu;
  135.     }
  136.  
  137.     /**
  138.      * Returns right menu view so you can findViews and do whatever you want with
  139.      */
  140.     public View getRightMenuView() {
  141.         return scrollViewRightMenu;
  142.     }
  143.  
  144.     @Override
  145.     protected boolean fitSystemWindows(Rect insets) {
  146.         // Applies the content insets to the view's padding, consuming that
  147.         // content (modifying the insets to be 0),
  148.         // and returning true. This behavior is off by default and can be
  149.         // enabled through setFitsSystemWindows(boolean)
  150.         // in api14+ devices.
  151.  
  152.         // This is added to fix soft navigationBar's overlapping to content above LOLLIPOP
  153.         int bottomPadding = viewActivity.getPaddingBottom() + insets.bottom;
  154.         boolean hasBackKey = KeyCharacterMap.deviceHasKey(KeyEvent.KEYCODE_BACK);
  155.         boolean hasHomeKey = KeyCharacterMap.deviceHasKey(KeyEvent.KEYCODE_HOME);
  156.         if (!hasBackKey || !hasHomeKey) {//there's a navigation bar
  157.             bottomPadding += getNavigationBarHeight();
  158.         }
  159.  
  160.         this.setPadding(viewActivity.getPaddingLeft() + insets.left,
  161.                 viewActivity.getPaddingTop() + insets.top,
  162.                 viewActivity.getPaddingRight() + insets.right,
  163.                 bottomPadding);
  164.         insets.left = insets.top = insets.right = insets.bottom = 0;
  165.         return true;
  166.     }
  167.  
  168.     private int getNavigationBarHeight() {
  169.         Resources resources = getResources();
  170.         int resourceId = resources.getIdentifier("navigation_bar_height", "dimen", "android");
  171.         if (resourceId > 0) {
  172.             return resources.getDimensionPixelSize(resourceId);
  173.         }
  174.         return 0;
  175.     }
  176.  
  177.     /**
  178.      * Set up the activity;
  179.      *
  180.      * @param activity
  181.      */
  182.     public void attachToActivity(Activity activity) {
  183.         initValue(activity);
  184.         setShadowAdjustScaleXByOrientation();
  185.         viewDecor.addView(this, 0);
  186.     }
  187.  
  188.     private void initValue(Activity activity) {
  189.         this.activity = activity;
  190.         leftMenuItems = new ArrayList<ResideMenuItem>();
  191.         rightMenuItems = new ArrayList<ResideMenuItem>();
  192.         ignoredViews = new ArrayList<View>();
  193.         viewDecor = (ViewGroup) activity.getWindow().getDecorView();
  194.         viewActivity = new TouchDisableView(this.activity);
  195.  
  196.         View mContent = viewDecor.getChildAt(0);
  197.         viewDecor.removeViewAt(0);
  198.         viewActivity.setContent(mContent);
  199.         addView(viewActivity);
  200.  
  201.         ViewGroup parent = (ViewGroup) scrollViewLeftMenu.getParent();
  202.         parent.removeView(scrollViewLeftMenu);
  203.         parent.removeView(scrollViewRightMenu);
  204.     }
  205.  
  206.     private void setShadowAdjustScaleXByOrientation() {
  207.         int orientation = getResources().getConfiguration().orientation;
  208.         if (orientation == Configuration.ORIENTATION_LANDSCAPE) {
  209.             shadowAdjustScaleX = 0.034f;
  210.             shadowAdjustScaleY = 0.12f;
  211.         } else if (orientation == Configuration.ORIENTATION_PORTRAIT) {
  212.             shadowAdjustScaleX = 0.06f;
  213.             shadowAdjustScaleY = 0.07f;
  214.         }
  215.     }
  216.  
  217.     /**
  218.      * Set the background image of menu;
  219.      *
  220.      * @param imageResource
  221.      */
  222.     public void setBackground(int imageResource) {
  223.         imageViewBackground.setImageResource(imageResource);
  224.     }
  225.  
  226.     /**
  227.      * The visibility of the shadow under the activity;
  228.      *
  229.      * @param isVisible
  230.      */
  231.     public void setShadowVisible(boolean isVisible) {
  232.         if (isVisible)
  233.             imageViewShadow.setBackgroundResource(R.drawable.shadow);
  234.         else
  235.             imageViewShadow.setBackgroundResource(0);
  236.     }
  237.  
  238.     /**
  239.      * Add a single item to the left menu;
  240.      * <p/>
  241.      * WARNING: It will be removed from v2.0.
  242.      *
  243.      * @param menuItem
  244.      */
  245.     @Deprecated
  246.     public void addMenuItem(ResideMenuItem menuItem) {
  247.         this.leftMenuItems.add(menuItem);
  248.         layoutLeftMenu.addView(menuItem);
  249.     }
  250.  
  251.     /**
  252.      * Add a single items;
  253.      *
  254.      * @param menuItem
  255.      * @param direction
  256.      */
  257.     public void addMenuItem(ResideMenuItem menuItem, int direction) {
  258.         if (direction == DIRECTION_LEFT) {
  259.             this.leftMenuItems.add(menuItem);
  260.             layoutLeftMenu.addView(menuItem);
  261.         } else {
  262.             this.rightMenuItems.add(menuItem);
  263.             layoutRightMenu.addView(menuItem);
  264.         }
  265.     }
  266.  
  267.     /**
  268.      * WARNING: It will be removed from v2.0.
  269.      *
  270.      * @param menuItems
  271.      */
  272.     @Deprecated
  273.     public void setMenuItems(List<ResideMenuItem> menuItems) {
  274.         this.leftMenuItems = menuItems;
  275.         rebuildMenu();
  276.     }
  277.  
  278.     /**
  279.      * Set menu items by a array;
  280.      *
  281.      * @param menuItems
  282.      * @param direction
  283.      */
  284.     public void setMenuItems(List<ResideMenuItem> menuItems, int direction) {
  285.         if (direction == DIRECTION_LEFT)
  286.             this.leftMenuItems = menuItems;
  287.         else
  288.             this.rightMenuItems = menuItems;
  289.         rebuildMenu();
  290.     }
  291.  
  292.     private void rebuildMenu() {
  293.         if (layoutLeftMenu != null) {
  294.             layoutLeftMenu.removeAllViews();
  295.             for (ResideMenuItem leftMenuItem : leftMenuItems)
  296.                 layoutLeftMenu.addView(leftMenuItem);
  297.         }
  298.  
  299.         if (layoutRightMenu != null) {
  300.             layoutRightMenu.removeAllViews();
  301.             for (ResideMenuItem rightMenuItem : rightMenuItems)
  302.                 layoutRightMenu.addView(rightMenuItem);
  303.         }
  304.     }
  305.  
  306.     /**
  307.      * WARNING: It will be removed from v2.0.
  308.      *
  309.      * @return
  310.      */
  311.     @Deprecated
  312.     public List<ResideMenuItem> getMenuItems() {
  313.         return leftMenuItems;
  314.     }
  315.  
  316.     /**
  317.      * Return instances of menu items;
  318.      *
  319.      * @return
  320.      */
  321.     public List<ResideMenuItem> getMenuItems(int direction) {
  322.         if (direction == DIRECTION_LEFT)
  323.             return leftMenuItems;
  324.         else
  325.             return rightMenuItems;
  326.     }
  327.  
  328.     /**
  329.      * If you need to do something on closing or opening menu,
  330.      * set a listener here.
  331.      *
  332.      * @return
  333.      */
  334.     public void setMenuListener(OnMenuListener menuListener) {
  335.         this.menuListener = menuListener;
  336.     }
  337.  
  338.  
  339.     public OnMenuListener getMenuListener() {
  340.         return menuListener;
  341.     }
  342.  
  343.     /**
  344.      * Show the menu;
  345.      */
  346.     public void openMenu(int direction) {
  347.  
  348.         setScaleDirection(direction);
  349.  
  350.         isOpened = true;
  351.         AnimatorSet scaleDown_activity = buildScaleDownAnimation(viewActivity, mScaleValue, mScaleValue);
  352.         AnimatorSet scaleDown_shadow = buildScaleDownAnimation(imageViewShadow,
  353.                 mScaleValue + shadowAdjustScaleX, mScaleValue + shadowAdjustScaleY);
  354.         AnimatorSet alpha_menu = buildMenuAnimation(scrollViewMenu, 1.0f);
  355.         scaleDown_shadow.addListener(animationListener);
  356.         scaleDown_activity.playTogether(scaleDown_shadow);
  357.         scaleDown_activity.playTogether(alpha_menu);
  358.         scaleDown_activity.start();
  359.     }
  360.  
  361.     /**
  362.      * Close the menu;
  363.      */
  364.     public void closeMenu() {
  365.  
  366.         isOpened = false;
  367.         AnimatorSet scaleUp_activity = buildScaleUpAnimation(viewActivity, 1.0f, 1.0f);
  368.         AnimatorSet scaleUp_shadow = buildScaleUpAnimation(imageViewShadow, 1.0f, 1.0f);
  369.         AnimatorSet alpha_menu = buildMenuAnimation(scrollViewMenu, 0.0f);
  370.         scaleUp_activity.addListener(animationListener);
  371.         scaleUp_activity.playTogether(scaleUp_shadow);
  372.         scaleUp_activity.playTogether(alpha_menu);
  373.         scaleUp_activity.start();
  374.     }
  375.  
  376.     @Deprecated
  377.     public void setDirectionDisable(int direction) {
  378.         disabledSwipeDirection.add(direction);
  379.     }
  380.  
  381.     public void setSwipeDirectionDisable(int direction) {
  382.         disabledSwipeDirection.add(direction);
  383.     }
  384.  
  385.     private boolean isInDisableDirection(int direction) {
  386.         return disabledSwipeDirection.contains(direction);
  387.     }
  388.  
  389.     private void setScaleDirection(int direction) {
  390.  
  391.         int screenWidth = getScreenWidth();
  392.         float pivotX;
  393.         float pivotY = getScreenHeight() * 0.5f;
  394.  
  395.         if (direction == DIRECTION_LEFT) {
  396.             scrollViewMenu = scrollViewLeftMenu;
  397.             pivotX = screenWidth * 1.5f;
  398.         } else {
  399.             scrollViewMenu = scrollViewRightMenu;
  400.             pivotX = screenWidth * -0.5f;
  401.         }
  402.  
  403.         ViewHelper.setPivotX(viewActivity, pivotX);
  404.         ViewHelper.setPivotY(viewActivity, pivotY);
  405.         ViewHelper.setPivotX(imageViewShadow, pivotX);
  406.         ViewHelper.setPivotY(imageViewShadow, pivotY);
  407.         scaleDirection = direction;
  408.     }
  409.  
  410.     /**
  411.      * return the flag of menu status;
  412.      *
  413.      * @return
  414.      */
  415.     public boolean isOpened() {
  416.         return isOpened;
  417.     }
  418.  
  419.     private OnClickListener viewActivityOnClickListener = new OnClickListener() {
  420.         @Override
  421.         public void onClick(View view) {
  422.             if (isOpened()) closeMenu();
  423.         }
  424.     };
  425.  
  426.     private Animator.AnimatorListener animationListener = new Animator.AnimatorListener() {
  427.         @Override
  428.         public void onAnimationStart(Animator animation) {
  429.             if (isOpened()) {
  430.                 showScrollViewMenu(scrollViewMenu);
  431.                 if (menuListener != null)
  432.                     menuListener.openMenu();
  433.             }
  434.         }
  435.  
  436.         @Override
  437.         public void onAnimationEnd(Animator animation) {
  438.             // reset the view;
  439.             if (isOpened()) {
  440.                 viewActivity.setTouchDisable(true);
  441.                 viewActivity.setOnClickListener(viewActivityOnClickListener);
  442.             } else {
  443.                 viewActivity.setTouchDisable(false);
  444.                 viewActivity.setOnClickListener(null);
  445.                 hideScrollViewMenu(scrollViewLeftMenu);
  446.                 hideScrollViewMenu(scrollViewRightMenu);
  447.                 if (menuListener != null)
  448.                     menuListener.closeMenu();
  449.             }
  450.         }
  451.  
  452.         @Override
  453.         public void onAnimationCancel(Animator animation) {
  454.  
  455.         }
  456.  
  457.         @Override
  458.         public void onAnimationRepeat(Animator animation) {
  459.  
  460.         }
  461.     };
  462.  
  463.     /**
  464.      * A helper method to build scale down animation;
  465.      *
  466.      * @param target
  467.      * @param targetScaleX
  468.      * @param targetScaleY
  469.      * @return
  470.      */
  471.     private AnimatorSet buildScaleDownAnimation(View target, float targetScaleX, float targetScaleY) {
  472.  
  473.         AnimatorSet scaleDown = new AnimatorSet();
  474.         scaleDown.playTogether(
  475.                 ObjectAnimator.ofFloat(target, "scaleX", targetScaleX),
  476.                 ObjectAnimator.ofFloat(target, "scaleY", targetScaleY)
  477.         );
  478.  
  479.         if (mUse3D) {
  480.             int angle = scaleDirection == DIRECTION_LEFT ? -ROTATE_Y_ANGLE : ROTATE_Y_ANGLE;
  481.             scaleDown.playTogether(ObjectAnimator.ofFloat(target, "rotationY", angle));
  482.         }
  483.  
  484.         scaleDown.setInterpolator(AnimationUtils.loadInterpolator(activity,
  485.                 android.R.anim.decelerate_interpolator));
  486.         scaleDown.setDuration(250);
  487.         return scaleDown;
  488.     }
  489.  
  490.     /**
  491.      * A helper method to build scale up animation;
  492.      *
  493.      * @param target
  494.      * @param targetScaleX
  495.      * @param targetScaleY
  496.      * @return
  497.      */
  498.     private AnimatorSet buildScaleUpAnimation(View target, float targetScaleX, float targetScaleY) {
  499.  
  500.         AnimatorSet scaleUp = new AnimatorSet();
  501.         scaleUp.playTogether(
  502.                 ObjectAnimator.ofFloat(target, "scaleX", targetScaleX),
  503.                 ObjectAnimator.ofFloat(target, "scaleY", targetScaleY)
  504.         );
  505.  
  506.         if (mUse3D) {
  507.             scaleUp.playTogether(ObjectAnimator.ofFloat(target, "rotationY", 0));
  508.         }
  509.  
  510.         scaleUp.setDuration(250);
  511.         return scaleUp;
  512.     }
  513.  
  514.     private AnimatorSet buildMenuAnimation(View target, float alpha) {
  515.  
  516.         AnimatorSet alphaAnimation = new AnimatorSet();
  517.         alphaAnimation.playTogether(
  518.                 ObjectAnimator.ofFloat(target, "alpha", alpha)
  519.         );
  520.  
  521.         alphaAnimation.setDuration(250);
  522.         return alphaAnimation;
  523.     }
  524.  
  525.     /**
  526.      * If there were some view you don't want reside menu
  527.      * to intercept their touch event, you could add it to
  528.      * ignored views.
  529.      *
  530.      * @param v
  531.      */
  532.     public void addIgnoredView(View v) {
  533.         ignoredViews.add(v);
  534.     }
  535.  
  536.     /**
  537.      * Remove a view from ignored views;
  538.      *
  539.      * @param v
  540.      */
  541.     public void removeIgnoredView(View v) {
  542.         ignoredViews.remove(v);
  543.     }
  544.  
  545.     /**
  546.      * Clear the ignored view list;
  547.      */
  548.     public void clearIgnoredViewList() {
  549.         ignoredViews.clear();
  550.     }
  551.  
  552.     /**
  553.      * If the motion event was relative to the view
  554.      * which in ignored view list,return true;
  555.      *
  556.      * @param ev
  557.      * @return
  558.      */
  559.     private boolean isInIgnoredView(MotionEvent ev) {
  560.         Rect rect = new Rect();
  561.         for (View v : ignoredViews) {
  562.             v.getGlobalVisibleRect(rect);
  563.             if (rect.contains((int) ev.getX(), (int) ev.getY()))
  564.                 return true;
  565.         }
  566.         return false;
  567.     }
  568.  
  569.     private void setScaleDirectionByRawX(float currentRawX) {
  570.  
  571.             setScaleDirection(DIRECTION_LEFT);
  572.     }
  573.  
  574.     private float getTargetScale(float currentRawX) {
  575.         float scaleFloatX = ((currentRawX - lastRawX) / getScreenWidth()) * 0.75f;
  576.       //  scaleFloatX = scaleDirection == DIRECTION_RIGHT ? -scaleFloatX : scaleFloatX;
  577.  
  578.         float targetScale = ViewHelper.getScaleX(viewActivity) - scaleFloatX;
  579.         targetScale = targetScale > 1.0f ? 1.0f : targetScale;
  580.         targetScale = targetScale < 0.5f ? 0.5f : targetScale;
  581.         return targetScale;
  582.     }
  583.  
  584.     private float lastActionDownX, lastActionDownY;
  585.  
  586.     @Override
  587.     public boolean dispatchTouchEvent(MotionEvent ev) {
  588.         float currentActivityScaleX = ViewHelper.getScaleX(viewActivity);
  589.         if (currentActivityScaleX == 1.0f)
  590.             setScaleDirectionByRawX(ev.getRawX());
  591.  
  592.         switch (ev.getAction()) {
  593.             case MotionEvent.ACTION_DOWN:
  594.                 lastActionDownX = ev.getX();
  595.                 lastActionDownY = ev.getY();
  596.                 isInIgnoredView = isInIgnoredView(ev) && !isOpened();
  597.                 pressedState = PRESSED_DOWN;
  598.                 break;
  599.  
  600.             case MotionEvent.ACTION_MOVE:
  601.                 if (isInIgnoredView || isInDisableDirection(scaleDirection))
  602.                     break;
  603.  
  604.                 if (pressedState != PRESSED_DOWN &&
  605.                         pressedState != PRESSED_MOVE_HORIZONTAL)
  606.                     break;
  607.  
  608.                 int xOffset = (int) (ev.getX() - lastActionDownX);
  609.                 int yOffset = (int) (ev.getY() - lastActionDownY);
  610.  
  611.                 if (pressedState == PRESSED_DOWN) {
  612.                     if (yOffset > 25 || yOffset < -25) {
  613.                         pressedState = PRESSED_MOVE_VERTICAL;
  614.                         break;
  615.                     }
  616.                     if (xOffset < -50 || xOffset > 50) {
  617.                         pressedState = PRESSED_MOVE_HORIZONTAL;
  618.                         ev.setAction(MotionEvent.ACTION_CANCEL);
  619.                     }
  620.                 } else if (pressedState == PRESSED_MOVE_HORIZONTAL) {
  621.                     if (currentActivityScaleX < 0.95)
  622.                         showScrollViewMenu(scrollViewMenu);
  623.  
  624.                     float targetScale = getTargetScale(ev.getRawX());
  625.                     if (mUse3D) {
  626.                         int angle = scaleDirection == DIRECTION_LEFT ? -ROTATE_Y_ANGLE : ROTATE_Y_ANGLE;
  627.                         angle *= (1 - targetScale) * 2;
  628.                         ViewHelper.setRotationY(viewActivity, angle);
  629.  
  630.                         ViewHelper.setScaleX(imageViewShadow, targetScale - shadowAdjustScaleX);
  631.                         ViewHelper.setScaleY(imageViewShadow, targetScale - shadowAdjustScaleY);
  632.                     } else {
  633.                         ViewHelper.setScaleX(imageViewShadow, targetScale + shadowAdjustScaleX);
  634.                         ViewHelper.setScaleY(imageViewShadow, targetScale + shadowAdjustScaleY);
  635.                     }
  636.                     ViewHelper.setScaleX(viewActivity, targetScale);
  637.                     ViewHelper.setScaleY(viewActivity, targetScale);
  638.                     ViewHelper.setAlpha(scrollViewMenu, (1 - targetScale) * 2.0f);
  639.  
  640.                     lastRawX = ev.getRawX();
  641.                     return true;
  642.                 }
  643.  
  644.                 break;
  645.  
  646.             case MotionEvent.ACTION_UP:
  647.  
  648.                 if (isInIgnoredView) break;
  649.                 if (pressedState != PRESSED_MOVE_HORIZONTAL) break;
  650.  
  651.                 pressedState = PRESSED_DONE;
  652.                 if (isOpened()) {
  653.                     if (currentActivityScaleX > 0.56f)
  654.                         closeMenu();
  655.                     else
  656.                         openMenu(scaleDirection);
  657.                 } else {
  658.                     if (currentActivityScaleX < 0.94f) {
  659.                         openMenu(scaleDirection);
  660.                     } else {
  661.                         closeMenu();
  662.                     }
  663.                 }
  664.  
  665.                 break;
  666.  
  667.         }
  668.         lastRawX = ev.getRawX();
  669.         return super.dispatchTouchEvent(ev);
  670.     }
  671.  
  672.     public int getScreenHeight() {
  673.         activity.getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
  674.         return displayMetrics.heightPixels;
  675.     }
  676.  
  677.     public int getScreenWidth() {
  678.         activity.getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
  679.         return displayMetrics.widthPixels;
  680.     }
  681.  
  682.     public void setScaleValue(float scaleValue) {
  683.         this.mScaleValue = scaleValue;
  684.     }
  685.  
  686.     public void setUse3D(boolean use3D) {
  687.         mUse3D = use3D;
  688.     }
  689.  
  690.     public interface OnMenuListener {
  691.  
  692.         /**
  693.          * This method will be called at the finished time of opening menu animations.
  694.          */
  695.         public void openMenu();
  696.  
  697.         /**
  698.          * This method will be called at the finished time of closing menu animations.
  699.          */
  700.         public void closeMenu();
  701.     }
  702.  
  703.     private void showScrollViewMenu(View scrollViewMenu) {
  704.         if (scrollViewMenu != null && scrollViewMenu.getParent() == null) {
  705.             addView(scrollViewMenu);
  706.         }
  707.     }
  708.  
  709.     private void hideScrollViewMenu(View scrollViewMenu) {
  710.         if (scrollViewMenu != null && scrollViewMenu.getParent() != null) {
  711.             removeView(scrollViewMenu);
  712.         }
  713.     }
  714. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement