如何使用Drawer Layout左侧移动主要内容

Mr.*_*Cat 61 android android-ui

刚刚在这里查看了如何使用DrawerLayout制作菜单.但是左侧菜单正在主要内容的前面移动.如何将其设置为菜单和主要内容并排移动(菜单将内容推到右侧)?

nsL*_*nsL 168

如果您不想使用第三方库,则可以自行实现它,只需从ActionBarDrawerToggle覆盖onDrawerSlide即可.在那里,您可以根据抽屉的开口百分比翻译您的framelayout视图.

代码示例:

<?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>
Run Code Online (Sandbox Code Playgroud)

在这里,覆盖onDrawerSlide:

public class ConfigurerActivity extends ActionBarActivity 
{
    private DrawerLayout mDrawerLayout;
    private ListView mDrawerList;
    private ActionBarDrawerToggle mDrawerToggle;
    private FrameLayout frame;
    private float lastTranslate = 0.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)
            {
                super.onDrawerSlide(drawerView, slideOffset);
                float moveFactor = (mDrawerList.getWidth() * slideOffset);

                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) 
                {
                    frame.setTranslationX(moveFactor);
                }
                else
                {
                    TranslateAnimation anim = new TranslateAnimation(lastTranslate, moveFactor, 0.0f, 0.0f);
                    anim.setDuration(0);
                    anim.setFillAfter(true);
                    frame.startAnimation(anim);

                    lastTranslate = moveFactor;
                }
            }
        };

        mDrawerLayout.setDrawerListener(mDrawerToggle);

        // ... more of your code
    }
}
Run Code Online (Sandbox Code Playgroud)

由于setTranslationX在预蜂窝安卓版本中不可用,我使用TranslateAnimation为较低版本设备管理它.

希望能帮助到你!

  • 这对我很有帮助.由于我从两侧都有导航抽屉,我只需要把 - if(drawerView.getId()== R.id.right_drawer)slideOffset*= -1; - 在onDrawerSlide方法之上 (11认同)
  • 只需添加对super.onDrawerSlide的调用,它将再次移动动画:D (5认同)

Nik*_*ski 9

您可能想要使用我编写的这个Drawer Toggles库.

我相信你会找到ContentDisplaceDrawerToggle方便的:

ContentDisplaceDrawerToggle mContentDisplaceToggle = new ContentDisplaceDrawerToggle(this, mDrawerLayout, R.id.content_frame);    
mDrawerLayout.setDrawerListener(mContentDisplaceToggle);
Run Code Online (Sandbox Code Playgroud)

ContentDisplaceDrawerToggle完全按照你的意思行事.它会在您滑入/滑出时移动内容视图DrawerLayout.

示例图片

如果你想组合不同的切换,你可以使用ActionBarToggleWrapperDrawerToggleWrapper

使用选项在read me文件中给出.