65.9K
CodeProject 正在变化。 阅读更多。
Home

Android 滑动菜单

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.97/5 (14投票s)

2013年3月12日

CPOL

2分钟阅读

viewsIcon

314982

downloadIcon

10197

Android 滑动菜单。

引言

在最近的 Android 应用程序中,从屏幕左侧滑出的菜单变得越来越流行。本文展示了如何使用 `TranslateAnimation` 类以简单的方式创建类似的菜单。

背景

首先需要理解 `TranslateAnimation` 类的功能。它的构造函数接收四个参数。前两个参数与 X 坐标相关,后两个参数与 Y 坐标相关。每种情况下的第一个参数是动画的起始点,第二个参数是动画的结束点。

在单独使用它之后,我注意到该对象回到了其原始位置。进一步检查代码后,我意识到需要使用 `LayoutParams` 类来更改对象的位置。这确保了您的动画对对象的位置产生永久影响。

使用代码

只需确定内容相对于菜单的位置即可,即菜单是否可见。在我的例子中,我使用内容的左边距和一个布尔值来跟踪这一点,并确定将哪些参数传递给 `TranslateAnimation` 构造函数。

if(contentParams.leftMargin == -(menu.getLayoutParams().width)) {
// Menu is hidden (slide out parameters)
    animateFromX = 0;
    animateToX = (menu.getLayoutParams().width);
    marginX = 0;
    menuOpen = true;
} else {    // Menu is visible (slide in parameter)
    animateFromX = 0;
    animateToX = -(menu.getLayoutParams().width);
    marginX = -(menu.getLayoutParams().width);
    menuOpen = false;
} 

为了确保动画不会被撤销,内容左边距的位置需要进行如下更改

slide.setAnimationListener(new AnimationListener() {
    public void onAnimationEnd(Animation animation) {
    // Make movement of content permanent after animation has completed 
    contentParams.setMargins(marginX, 0, 0, 0); // by positioning its left margin
    content.setLayoutParams(contentParams);
}

    public void onAnimationRepeat(Animation animation) { }
    public void onAnimationStart(Animation animation) { }
});   

左边距位置可以是 0 或菜单的宽度。菜单的宽度如下获得

menu.getLayoutParams().width // this is an integer value

一旦确定了参数,就会调用以下定义的函数来使菜单滑动进入或滑动退出

slideMenuIn(animateFromX, animateToX, marginX); 

关注点

最好通过代码获取菜单宽度来设置内容的左边距,而不是使用固定的整数值。这将避免在不同设备上出现不同屏幕尺寸的问题。 还可以通过以下方式防止用户在尝试隐藏菜单时按返回按钮意外关闭应用程序

public boolean onKeyDown(int keyCode, KeyEvent keyEvent) {
    if(keyCode == KeyEvent.KEYCODE_BACK) {
        if(menuOpen) {
        // Slide the menu back if visible and one does not wish to close app but slide it back
            slideMenuIn(0, -(menu.getLayoutParams().width), 
              -(menu.getLayoutParams().width));     // Pass slide in paramters
            menuOpen = false;
            return true;
        }
    }
    return super.onKeyDown(keyCode, keyEvent);
} 
© . All rights reserved.