drawerlayout 动画效果 取消主界面透明度变化

最近在做项目过程中,涉及到对抽屉的应用,可使用slidingmenu,作用于drawerlayout相似,但是找了挺多好像没怎么看到对缩放和偏移的动画效果,于是用了google的drawerlayout.同时在项目中引入jar包nineoldandroids-2.4.0.jar  下载地址 http://dl.dbank.com/c04t71hcap 

使用方法:

1、其中drawerlayout有setDrawerLockMode();可以设置是否支持手势滑动,其中

      setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED, Gravity.RIGHT);//关闭手势滑动,有时候跟主界面滑动事件存在冲突时,可以将手势滑动关闭

      mDrawer_layout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED); //打开手势滑动

2、重写DrawerListener ,在onDrawerSlide方法中定义需要加载的动画效果,声明:在抽屉划出过程中会多次调用ondrawerslide方法,我在项目中用到的是nineoldandroids-2.4.0.jar架包,这是一个支持低版本动画效果的jar包,使用时直接导入到libs文件夹中即可。其中的ViewHelper可设置对应控件的

动画效果,代码如下:

private void initDrawerLayout()
	{
		mDrawerLayout = (DrawerLayout)findViewById(R.id.id_drawerLayout);
		mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED, Gravity.RIGHT);
		mDrawerLayout.setScrimColor(0x00ffffff);
		
		//新建drawerlistener
		DrawerListener listener = new DrawerListener()
		{
			@Override
			public void onDrawerStateChanged(int newState)
			{}

			@Override
			public void onDrawerSlide(View drawerView, float slideOffset)
			{
				//offset 偏移值
				View mContent = mDrawerLayout.getChildAt(0);
				View mMenu = drawerView;
				float scale = 1 - slideOffset;
				float rightScale = 0.8f + scale * 0.2f;

				if (drawerView.getTag().equals("RIGHT"))
				{
					ViewHelper.setTranslationX(mContent,-mMenu.getMeasuredWidth() * slideOffset);
//					ViewHelper.setAlpha(mMenu, 0.6f + 0.4f * (1 - scale));
					
					ViewHelper.setPivotX(mContent, mContent.getMeasuredWidth());
					ViewHelper.setPivotY(mContent,mContent.getMeasuredHeight() / 2);
					
					mContent.invalidate();
					ViewHelper.setScaleX(mContent, rightScale);
					ViewHelper.setScaleY(mContent, rightScale);
				}
			}

			@Override
			public void onDrawerOpened(View drawerView)
			{}

			@Override
			public void onDrawerClosed(View drawerView)
			{
//				ViewHelper.setTranslationX(mDrawerLayout.getChildAt(0),0);
				mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED, Gravity.RIGHT);
			}
		};
		
		mDrawerLayout.setDrawerListener(listener);
	}


3、在layout文件中使用drawerlayout,如果需要在左右两边都侧滑,那就定义两个fragment对应左右拉出菜单。同时定义左右菜单的宽度


   
   

   
   
    

    
    

    
     
     
    
     
     

    
     
     

        
      
      

        
      
      

        
      
      

        
      
      

        
      
      
    
     
     


    
    
   
    
    


   
   

最后提一下,由于在项目中使用drawerlayout的时候主界面在抽屉拉出后会有一个变暗的效果,如果想取消这种效果,可以添加mDrawerLayout.setScrimColor(0x00ffffff);这一句,将整个屏幕保持高亮。

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android的DrawerLayout是一个常用的侧滑菜单控件,其中挤压效果是它的一个常用特性。挤压效果可以让界面在侧滑菜单展开时向右侧挤压,以让侧滑菜单展示更多的内容。 要实现这个效果,需要在DrawerLayout中添加一个布局,通常是一个LinearLayout,作为界面的容器。然后,在这个布局中添加一个属性为layout_gravity="start"的NavigationView,它将作为侧滑菜单的容器。 接下来,在界面布局中,我们需要使用android:fitsSystemWindows="true"属性来让界面的内容从状态栏下方开始布局。然后,我们需要在界面布局中添加一个属性为android:layout_marginStart="?android:attr/actionBarSize"的FrameLayout,它将作为界面的内容容器,并且设置了一个左边距,以让界面在侧滑菜单展开时向右侧挤压。 最后,在Java代码中,我们需要使用DrawerLayout的setDrawerListener方法来设置一个DrawerLayout.DrawerListener,然后在onDrawerSlide方法中,我们需要获取到界面的FrameLayout,然后根据抽屉菜单的滑动进度,设置界面的左边距和透明度,以实现挤压效果。 以下是一个实现DrawerLayout挤压效果的示例代码: ```xml <android.support.v4.widget.DrawerLayout android:id="@+id/drawer_layout" android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true"> <LinearLayout android:id="@+id/content" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:fitsSystemWindows="true"> <FrameLayout android:id="@+id/main_content" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginStart="?android:attr/actionBarSize" android:background="@color/white"/> </LinearLayout> <android.support.design.widget.NavigationView android:id="@+id/navigation_view" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_gravity="start"/> </android.support.v4.widget.DrawerLayout> ``` ```java DrawerLayout drawerLayout = findViewById(R.id.drawer_layout); View content = findViewById(R.id.content); final FrameLayout mainContent = findViewById(R.id.main_content); NavigationView navigationView = findViewById(R.id.navigation_view); drawerLayout.setDrawerListener(new DrawerLayout.DrawerListener() { @Override public void onDrawerSlide(@NonNull View drawerView, float slideOffset) { int margin = (int) (slideOffset * drawerView.getWidth()); DrawerLayout.LayoutParams params = (DrawerLayout.LayoutParams) mainContent.getLayoutParams(); params.setMargins(margin + getResources().getDimensionPixelSize(R.dimen.margin),0,0,0); mainContent.setLayoutParams(params); mainContent.setAlpha(1 - slideOffset); } @Override public void onDrawerOpened(@NonNull View drawerView) {} @Override public void onDrawerClosed(@NonNull View drawerView) {} @Override public void onDrawerStateChanged(int newState) {} }); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值