29

我想实现一个滑动菜单,如 FB 或 G+ 应用程序,我从FB Menu Demohttps://github.com/jfeinstein10/SlidingMenu中找到了一些示例代码

这些都是好的开始,但我需要从他们那里得到一些额外的东西。就像这里一样,它只能在单击菜单按钮时起作用,但我也想通过手势来移动它。我想要有一个中心视图的行为,并且在将该中心向右移动时,将出现一个视图,而在向左移动时,将出现菜单。假设有三个视图 A、B、C,当我向左滑动 C 时出现 A,当我向右滑动 C 时出现 B。C在A和B的中间。

1.中间视图向右移动

那个屏幕在中间向右移动 出现菜单

2.将中间视图向左移动

通过触摸向左移动 向左移动第三视图

现在我的问题是:发展这样的观点的最佳实践是什么。我从某人那里听说我也应该使用 Fragments 和 View pager。那么我该如何开发呢?是否有人做过任何示例实现?任何帮助和建议表示赞赏。

作为参考,请参阅此应用程序,它使用这种类型的滑动黑白视图Skout 应用程序

4

4 回答 4

17

最简单的解决方案可能是使用android-undergarment,它内置了边框滑动,基于项目 README:

用户还可以通过从屏幕左侧滑动边框以打开抽屉并从右侧进行相同操作以关闭它来控制抽屉。如果你想阻止这种触摸功能,你可以调用 setDrawerEnabled(false)。

于 2012-10-29T18:38:06.557 回答
12

您可以简单地TranslateAnimation在要移动的视图上使用淡出弹出窗口和菜单弹出窗口。我已经在我的应用程序中实现了它,它就像一个魅力。
此图像显示您何时需要动画和其他组件


代码

public class SlidingOptionsMenuActivity extends Activity {

    /**
     * Signifies that the menu is already visible
     */
    boolean alreadyShowing = false;
    /**
     * Width of the current window
     */
    private int windowWidth;
    /**
     * Height of the current window
     */
    private int windowHeight;
    /**
     * Reference of the {@link PopupWindow} which dims the screen
     */
    private PopupWindow fadePopup;
    /**
     * The translate animation
     */
    private Animation ta;
    /**
     * The view which needs to be translated
     */
    private RelativeLayout baseView;
    /**
     * Reference of the {@link LayoutInflater}
     */
    LayoutInflater inflater;

    /*
     * (non-Javadoc)
     * 
     * @see android.app.Activity#onCreate(android.os.Bundle)
     */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        Display display = getWindowManager().getDefaultDisplay();
        windowWidth = display.getWidth();
        windowHeight = display.getHeight();
        inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        findViewById(R.id.btnOptions).setOnClickListener(new OnClickListener() {

            /*
             * (non-Javadoc)
             * 
             * @see android.view.View.OnClickListener#onClick(android.view.View)
             */
            @Override
            public void onClick(View v) {
                if(!alreadyShowing){
                    alreadyShowing = true;
                    openSlidingMenu();
                }
            }
        });
    }


    /**
     * Fades the entire screen, gives a dim background
     */
    private void showFadePopup() {
        final View layout = inflater.inflate(R.layout.fadepopup, (ViewGroup) findViewById(R.id.fadePopup));
        fadePopup = new PopupWindow(layout, windowWidth, windowHeight, false);
        fadePopup.showAtLocation(layout, Gravity.NO_GRAVITY, 0, 0);
    }

    /**
     * Opens the sliding Menu
     */
    private void openSlidingMenu() {
        showFadePopup();
        // The amount of view which needs to be moved out. equivalent to the
        // width of the menu
        int width = (int) (windowWidth * 0.6f);
        translateView((float) (width));
        int height = LayoutParams.FILL_PARENT;
        // creating a popup
        final View layout = inflater.inflate(R.layout.option_popup_layout,(ViewGroup) findViewById(R.id.popup_element));

        final PopupWindow optionsPopup = new PopupWindow(layout, width, height, true);
        optionsPopup.setBackgroundDrawable(new PaintDrawable());

        optionsPopup.showAtLocation(layout, Gravity.NO_GRAVITY, 0, 0);

        optionsPopup.setOnDismissListener(new PopupWindow.OnDismissListener() {

            public void onDismiss() {
                //Removing the fade effect
                fadePopup.dismiss();    
                //to clear the previous animation transition in
                cleanUp();
                //move the view out
                translateView(0);
                //to clear the latest animation transition out
                cleanUp();
                //resetting the variable
                alreadyShowing = false;
            }
        });
    }

    /**
     * This method is responsible for view translation. It applies a translation
     * animation on the root view of the activity
     * 
     * @param right The position to translate to
     */
    private void translateView(float right) {

        ta = new TranslateAnimation(0f, right, 0f, 0f);
        ta.setDuration(300);
        ta.setFillEnabled(true);
        ta.setFillAfter(true);

        baseView = (RelativeLayout) findViewById(R.id.baseView);
        baseView.startAnimation(ta);
        baseView.setVisibility(View.VISIBLE);
    }

    /**
     * Basic cleanup to avoid memory issues. Not everything is release after
     * animation, so to immediately release it doing it manually
     */
    private void cleanUp(){
        if (null != baseView) {
            baseView.clearAnimation();
            baseView = null;
        }
        if (null != ta) {
            ta.cancel();
            ta = null;
        }
        fadePopup = null;
    }
} //END of Class
//END of file

希望这会有所帮助。

实际截图。

于 2012-11-02T09:21:29.947 回答
10

我发现另一个非常好的开源库是SlidingMenu。它应该适合您的需求,因为您可以通过单击“菜单”和滑动边框来打开和关闭抽屉。我发现将它与 ActionBar 库(如ActionBarSherlockjohannilsson 的 android-actionbar库)集成在一起,只需在库项目中更改一两行代码即可。SlidingMenu 库的自述文件解释了如何与 ABSherlock 库集成。

值得注意的是,SlidingMenu 示例项目演示了许多不同的抽屉打开关闭动画。这些是我见过的这种风格的菜单/导航的一些最好的动画。

于 2012-11-02T00:34:22.427 回答
-1

有一种官方方式...有用且轻巧(通过使用 v4 支持库):

创建导航抽屉:

https://developer.android.com/training/implementing-navigation/nav-drawer.html

于 2017-06-21T11:53:37.347 回答