如何在打开导航抽屉时使背景 Activity 变小?

2024-05-11

我想做我的背景Activity打开时稍微小一点Navigation Drawer,模拟存在的效果Airbnb应用。我想最好的解释是截图:

但重点不是让 View 变小,而是让它成为与 Drawer 打开/关闭动画同步的动画。因此,如果您开始打开抽屉并在中间决定停止并返回,则后台 Activity 比例将受到相应影响。

如何使用 DrawerLayout 中的构建来完成此操作?这有一些实施吗?


您可以使用以下命令来执行此效果ActionBarDrawer切换 http://developer.android.com/reference/android/support/v4/app/ActionBarDrawerToggle.html在支持库 v4 中。

您所要做的就是重写 onDrawerSlide 方法来检索抽屉菜单的打开百分比,然后缩放放置片段的 FrameLayout。

示例代码:

main_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent">

    <FrameLayout android:id="@+id/content_frame"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>    

    <ListView android:id="@+id/left_drawer"
    android:layout_width="240dp"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    android:choiceMode="singleChoice"
    android:divider="@android:color/transparent"
    android:dividerHeight="0dp"/>

</android.support.v4.widget.DrawerLayout>

现在在您保存抽屉的活动中:

public class ConfigurerActivity extends ActionBarActivity 
{
    private DrawerLayout mDrawerLayout;
    private ListView mDrawerList;
    private ActionBarDrawerToggle mDrawerToggle;
    private FrameLayout frame;
    private float lastScale = 1.0f;

    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_layout);

        mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
        mDrawerList = (ListView) findViewById(R.id.left_drawer);
        frame = (FrameLayout) findViewById(R.id.content_frame);

        mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, R.drawable.ic_drawer, R.string.acc_drawer_open, R.string.acc_drawer_close) 
        {            
            @SuppressLint("NewApi")
            public void onDrawerSlide(View drawerView, float slideOffset)
            {
                float min = 0.9f;
                float max = 1.0f;
                float scaleFactor = (max - ((max - min) * slideOffset));

                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) 
                {
                    frame.setScaleX(scaleFactor);
                    frame.setScaleY(scaleFactor);
                }
                else
                {               
                    ScaleAnimation anim = new ScaleAnimation(lastScale, scaleFactor, lastScale, scaleFactor, frame.getWidth()/2, frame.getHeight()/2);
                    anim.setDuration(0);
                    anim.setFillAfter(true);
                    frame.startAnimation(anim);

                    lastScale = scaleFactor;
                }
            }
        };

        mDrawerLayout.setDrawerListener(mDrawerToggle);

        // ... more of your code
    }
}

请注意,我使用 2 种不同的方法来缩放,因为 setScaleX/Y 在 PRE - Honeycomb Android 版本中不可用。

有了这个,你可以设置你自己的scaleFactor(我认为0.9f足够小),或者可以根据抽屉的打开百分比尝试新的效果(改变颜色)。

希望能帮助到你。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在打开导航抽屉时使背景 Activity 变小? 的相关文章

随机推荐