How to make background Activity smaller while opening the Navigation Drawer?

后端 未结 3 520
耶瑟儿~
耶瑟儿~ 2021-02-04 12:44

I want to make my background Activity a little bit smaller while opening the Navigation Drawer, Simulate the effect that exists in the Airbnb

3条回答
  •  粉色の甜心
    2021-02-04 13:26

    You can perform this effect using the ActionBarDrawerToggle in the support library v4.

    All you have to do is to Override onDrawerSlide method to retrieve the opening % of the drawer menu, and then scale your FrameLayout where your fragment is placed in.

    Example with code:

    main_layout.xml

    
    
    
            
    
        
    
    
    

    Now in your Activity which holds the Drawer:

    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
        }
    }
    

    Note that i use 2 different methods to scale, because setScaleX/Y are not available in PRE - Honeycomb Android versions.

    With this, you can set your own scaleFactor (i think 0.9f its small enough) or maybe try new effects (change color) based on the opening % of the drawer.

    Hope it helps.

提交回复
热议问题