zoukankan      html  css  js  c++  java
  • Android 高仿QQ5.2双向側滑菜单DrawerLayout实现源代码

    Android 高仿QQ5.2双向側滑菜单DrawerLayout实现源代码

    左右側滑效果图



    1.主页的实现

    直接将DrawerLayout作为根布局,然后其内部第一个View为内容区域,第二个View为左側菜单,第三个View为右側側滑菜单,当前第三个是可选的。

    布局:

    <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/id_drawerLayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@drawable/img_frame_background" >
    
        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@drawable/qq" >
    
            <Button
                android:layout_width="40dp"
                android:layout_height="30dp"
                 android:layout_marginTop="10dp"
                android:layout_alignParentRight="true"
                android:layout_alignParentEnd="true" 
                android:background="@drawable/youce"
                android:onClick="OpenRightMenu" />
        </RelativeLayout>
    
        <fragment
            android:id="@+id/id_left_menu"
            android:name="com.pcachy.drawerlayout.MenuLeftFragment"
            android:layout_width="200dp"
            android:layout_height="match_parent"
            android:layout_gravity="start"
            android:tag="LEFT" />
    
        <fragment
            android:id="@+id/id_right_menu"
            android:name="com.pcachy.drawerlayout.MenuRightFragment"
            android:layout_width="100dp"
            android:layout_height="match_parent"
            android:layout_gravity="end"
            android:tag="RIGHT" />
    
    </android.support.v4.widget.DrawerLayout>

    代码

    package com.pcachy.drawerlayout;
    
    import android.os.Bundle;
    import android.support.v4.app.FragmentActivity;
    import android.support.v4.widget.DrawerLayout;
    import android.view.Gravity;
    import android.view.View;
    import android.view.Window;
    
    import com.nineoldandroids.view.ViewHelper;
    
    public class MainActivity extends FragmentActivity {
    
    	private DrawerLayout mDrawerLayout;
    	
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		
    		//
    		requestWindowFeature(Window.FEATURE_NO_TITLE);
    		setContentView(R.layout.activity_main);
    		
    		initView();
    		initEvents();
    	}
    	
    	private void initView()
    	{
    		mDrawerLayout = (DrawerLayout) findViewById(R.id.id_drawerLayout);
    		mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED, Gravity.END);
    	}
    	
    	private void initEvents()
    	{
    		mDrawerLayout.setDrawerListener(new DrawerLayout.DrawerListener() {
    
    			@Override
    			public void onDrawerSlide(View drawerView, float slideOffset) {
    				// TODO Auto-generated method stub
    				View mContent = mDrawerLayout.getChildAt(0);
    				View mMenu = drawerView;
    				float scale = 1 - slideOffset;
    				float rightScale = 0.8f + scale * 0.2f;
    
    				if (drawerView.getTag().equals("LEFT"))
    				{
    
    					float leftScale = 1 - 0.3f * scale;
    
    					ViewHelper.setScaleX(mMenu, leftScale);
    					ViewHelper.setScaleY(mMenu, leftScale);
    					ViewHelper.setAlpha(mMenu, 0.6f + 0.4f * (1 - scale));
    					ViewHelper.setTranslationX(mContent,
    							mMenu.getMeasuredWidth() * (1 - scale));
    					ViewHelper.setPivotX(mContent, 0);
    					ViewHelper.setPivotY(mContent,
    							mContent.getMeasuredHeight() / 2);
    					mContent.invalidate();
    					ViewHelper.setScaleX(mContent, rightScale);
    					ViewHelper.setScaleY(mContent, rightScale);
    				} else
    				{
    					ViewHelper.setTranslationX(mContent,
    							-mMenu.getMeasuredWidth() * slideOffset);
    					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) {
    				// TODO Auto-generated method stub
    				
    			}
    
    			@Override
    			public void onDrawerClosed(View drawerView) {
    				// TODO Auto-generated method stub
    				mDrawerLayout.setDrawerLockMode(
    						DrawerLayout.LOCK_MODE_LOCKED_CLOSED, Gravity.RIGHT);
    			}
    
    			@Override
    			public void onDrawerStateChanged(int newState) {
    				// TODO Auto-generated method stub
    				
    			}
    			
    		});
    	}
    	
    	public void OpenRightMenu(View view)
    	{
    		mDrawerLayout.openDrawer(Gravity.RIGHT);
    		mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED, Gravity.RIGHT);
    	}
    	
    }
    

    2.左菜单和右菜单布局(左菜单和右菜单的布局和代码随便你怎么写,这里是左菜单的样例)

    <?

    xml version="1.0" encoding="utf-8"?

    > <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#00000000" > <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_centerVertical="true" android:orientation="vertical" > <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content" > <ImageView android:id="@+id/one" android:layout_width="50dp" android:layout_height="50dp" android:layout_centerVertical="true" android:layout_marginLeft="20dp" android:layout_marginTop="20dp" android:src="@drawable/img_1" /> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_centerVertical="true" android:layout_marginLeft="20dp" android:layout_toRightOf="@id/one" android:text="第1个Item" android:textColor="#f0f0f0" android:textSize="20sp" /> </RelativeLayout> <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content" > <ImageView android:id="@+id/two" android:layout_width="50dp" android:layout_height="50dp" android:layout_centerVertical="true" android:layout_marginLeft="20dp" android:layout_marginTop="20dp" android:src="@drawable/img_2" /> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_centerVertical="true" android:layout_marginLeft="20dp" android:layout_toRightOf="@id/two" android:text="第2个Item" android:textColor="#f0f0f0" android:textSize="20sp" /> </RelativeLayout> <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content" > <ImageView android:id="@+id/three" android:layout_width="50dp" android:layout_height="50dp" android:layout_centerVertical="true" android:layout_marginLeft="20dp" android:layout_marginTop="20dp" android:src="@drawable/img_3" /> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_centerVertical="true" android:layout_marginLeft="20dp" android:layout_toRightOf="@id/three" android:text="第3个Item" android:textColor="#f0f0f0" android:textSize="20sp" /> </RelativeLayout> <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content" > <ImageView android:id="@+id/four" android:layout_width="50dp" android:layout_height="50dp" android:layout_centerVertical="true" android:layout_marginLeft="20dp" android:layout_marginTop="20dp" android:src="@drawable/img_4" /> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_centerVertical="true" android:layout_marginLeft="20dp" android:layout_toRightOf="@id/four" android:text="第4个Item" android:textColor="#f0f0f0" android:textSize="20sp" /> </RelativeLayout> <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content" > <ImageView android:id="@+id/five" android:layout_width="50dp" android:layout_height="50dp" android:layout_centerVertical="true" android:layout_marginLeft="20dp" android:layout_marginTop="20dp" android:src="@drawable/img_5" /> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_centerVertical="true" android:layout_marginLeft="20dp" android:layout_toRightOf="@id/five" android:text="第5个Item" android:textColor="#f0f0f0" android:textSize="20sp" /> </RelativeLayout> </LinearLayout> </RelativeLayout>

    1、为了模拟QQ的右側菜单须要点击才干出现。所以在初始化DrawerLayout的时候,使用了mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED,Gravity.RIGHT);意思是仅仅有编程才干将其弹出。然后在弹出以后。须要让手势能够滑动回去,所以在OpenRightMenu中又编写了:mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED,Gravity.RIGHT); UNLOCK了一下。

    最后在onDrawerClosed回调中。继续设置mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED,Gravity.RIGHT)。

    2、动画效果动画用了nineoldandroids。

    3、setDrawerListener
    通过代码也能看出来,能够使用setDrawerListener监听菜单的打开与关闭等等。这里对于当前操作是哪个菜单的推断是通过TAG推断的。我认为使用gravity应该也能推断出来


    源代码下载地址:http://download.csdn.net/detail/pcaxb/9042309


  • 相关阅读:
    "Automation 服务器不能创建对象" 的解决方法
    让DataGrid拥有单击回传事件并带回指定字段的值
    SQL 和TSQL学习(一)
    数据写入XML
    DATALIST分页存储过程
    The target assembly contains no service types. You may need to adjust the Code Access Security policy of this assembly." 目标程序集不包含服务类型。可能需要调整此程序集的代码访问
    字符串转日期
    C# 日期和时间正则表达式
    js根据输入日期显示该月的最后一天的日期[转]
    JavaScript试题【解析+答案】
  • 原文地址:https://www.cnblogs.com/zsychanpin/p/7293944.html
Copyright © 2011-2022 走看看