android关于侧滑菜单slidingMenu

简单的侧滑的实现:



Mainactivity

package com.example.sudo.slidemenu;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;

import view.SlideMenus;

public class MainActivity extends AppCompatActivity {
    private SlideMenus mMenu;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mMenu = (SlideMenus) findViewById(R.id.menu);

    }
    public void toggleMenu(View v){
        mMenu.toggle();
    }
}
activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:Jin="http://schemas.android.com/apk/res-auto"
    tools:context="com.example.sudo.slidemenu.MainActivity">

    <view.SlideMenus
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/menu"
        Jin:rightPadding="150dp">
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="horizontal">
            <include layout="@layout/left_menu"></include>
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:background="@mipmap/qq">
               <Button
                   android:layout_width="wrap_content"
                   android:layout_height="wrap_content"
                   android:onClick="toggleMenu"
                   android:text="切换菜单"/>
            </LinearLayout>
        </LinearLayout>
        </view.SlideMenus>
</RelativeLayout>


left_menu.xml

<?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="@mipmap/bbbg">
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:layout_centerInParent="true">
        <TextView
            android:id="@+id/tv_img1"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:drawableLeft="@mipmap/img_1"
            android:text="第一个Item"
            android:paddingLeft="20dp"
            android:paddingTop="10dp"
            android:drawablePadding="20dp"
            android:gravity="center_vertical"
            android:layout_weight="1"/>
        <TextView
            android:id="@+id/tv_img2"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:drawableLeft="@mipmap/img_2"
            android:text="第二个Item"
            android:paddingLeft="20dp"
            android:drawablePadding="20dp"
            android:paddingTop="10dp"
            android:gravity="center_vertical"
            android:layout_weight="1"/>
        <TextView
            android:id="@+id/tv_img3"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:text="第三个Item"
            android:paddingLeft="20dp"
            android:gravity="center_vertical"
            android:drawablePadding="20dp"
            android:drawableLeft="@mipmap/img_3"
            android:paddingTop="10dp"
            android:layout_weight="1"/>
        <TextView
            android:id="@+id/tv_img4"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:paddingLeft="20dp"
            android:drawableLeft="@mipmap/img_4"
            android:text="第四个Item"
            android:drawablePadding="20dp"
            android:paddingTop="10dp"
            android:gravity="center_vertical"
            android:layout_weight="1"/>
        <TextView
            android:id="@+id/tv_img5"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:text="第五个Item"
            android:drawableLeft="@mipmap/img_5"
            android:paddingLeft="20dp"
            android:paddingTop="10dp"
            android:drawablePadding="20dp"
            android:gravity="center_vertical"
            android:layout_weight="1"/>

    </LinearLayout>

</RelativeLayout>

activity_sliding_drawable.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:Huan="http://schemas.android.com/apk/res-auto"
    tools:context="com.example.sudo.slidemenu.SlidingDrawable">

    <view.SlideMenus
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/twomenu"
        Huan:rightPadding="150dp">
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="horizontal">
            <include layout="@layout/left_menu"></include>
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:background="@mipmap/qq">
                <Button
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:onClick="toggleMenu"
                    android:text="切换菜单"/>
            </LinearLayout>
        </LinearLayout>
    </view.SlideMenus>
</RelativeLayout>
attr.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <attr name="rightPadding" format="dimension">
    </attr>
    
    <declare-styleable name="SlideMenus">
        <attr name="rightPadding"></attr>
    </declare-styleable>

    <declare-styleable name="TwoSlideMenu">
        <attr name="rightPadding"></attr>
    </declare-styleable>

</resources>


SlideMenus


/**
 * Created by Sudo on 2016/9/19.
 */
public class SlideMenus extends HorizontalScrollView{

    private LinearLayout mWapper;
    private ViewGroup mMenu;
    //内容区域
    private ViewGroup mContent;
    //屏幕的宽度
    private int mScreenWidth;
   //menu与右边的距离单位dp
    private int mMenuRightPadding = 10;
    private boolean once=false;
    //表示当前的状态
    private boolean isOpen;

    //menu的宽度
    private int mMenuWidth;
    /*
    未使用自定义属性时调用
     */
    public SlideMenus(Context context, AttributeSet attrs) {
        this(context, attrs,0);
//        //获取屏幕的宽度
//       WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
//
//        DisplayMetrics outMetrics= new DisplayMetrics();
//        wm.getDefaultDisplay().getMetrics(outMetrics);
//        //widthPixels像素值
//       mScreenWidth = outMetrics.widthPixels;
//     //将dp转换为px
//        mMenuRightPadding = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 50, context.getResources().getDisplayMetrics());
    }

    /**
     *
     *当自定义了属性时会调用此方法
     */
    public SlideMenus(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        //获取自定义属性
        TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.SlideMenus,defStyleAttr,0);
        int n = a.getIndexCount();
        for (int i=0;i<n;i++){
            int attr = a.getIndex(i);
            switch (attr){
                case R.styleable.SlideMenus_rightPadding:
                    mMenuRightPadding=a.getDimensionPixelSize(attr,(int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 50,
                            context.getResources().getDisplayMetrics()));
                break;
            }
        }
        //释放
        a.recycle();



                //获取屏幕的宽度
       WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);

        DisplayMetrics outMetrics= new DisplayMetrics();
        wm.getDefaultDisplay().getMetrics(outMetrics);
        //widthPixels像素值
       mScreenWidth = outMetrics.widthPixels;
     //将dp转换为px
      //  mMenuRightPadding = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 50, context.getResources().getDisplayMetrics());
    }

    public SlideMenus(Context context) {
        this(context,null);
    }

    /*
    设置子View的宽和高
    设置自己的宽和高
     */
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        //如果为false设置子view的宽和高
        if(!once){
            mWapper = (LinearLayout) getChildAt(0);
            //LinearLayout里的第一个元素
            mMenu = (ViewGroup) mWapper.getChildAt(0);
//LinearLayout里的第二个元素
            mContent = (ViewGroup) mWapper.getChildAt(1);
            //menu的宽度
            mMenuWidth= mMenu.getLayoutParams().width = mScreenWidth-mMenuRightPadding;
            //屏幕的宽度
            mContent.getLayoutParams().width = mScreenWidth;
            //只调用一次
            once=true;

        }

        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }

    /**
     *
     *通过设置偏移量将Menu隐藏
     */
    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        super.onLayout(changed, l, t, r, b);
        if (changed){
            this.scrollTo(mMenuWidth,0);
        }

    }

    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        int action = ev.getAction();
        //通过action判断用户的行为
        switch (action){
            case MotionEvent.ACTION_UP:
                //隐藏在左边的宽度
                int scrollX=getScrollX();
                if (scrollX>=mMenuWidth/2){
                    this.smoothScrollTo(mMenuWidth,0);
                    //菜单隐藏
                    isOpen = false;
                }else{
                    this.smoothScrollTo(0,0);
                    isOpen = true;
                }
                return  true;
        }
        return super.onTouchEvent(ev);
    }

    /**
     * 打开菜单
     */
   public void  openMenu() {
       if (isOpen){
           return;
       }
        this.smoothScrollTo(0,0);
       isOpen=true;
    }
    /**
     * 关闭菜单
     */
    public void closeMenu(){
        if(!isOpen){
            return;
        }
        this.smoothScrollTo(mMenuWidth,0);
        isOpen=false;
    }
    /**
     * 切换菜单
     */
    public void toggle(){
        if (isOpen){
            closeMenu();
        }else {
            openMenu();
        }
    }
}

抽屉式侧滑菜单:

SlidingDrawable


//抽屉式侧滑菜单
public class SlidingDrawable extends AppCompatActivity {
    private SlideMenus twomenu;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sliding_drawable);

        twomenu = (SlideMenus) findViewById(R.id.twomenu);

    }
    public void toggleMenu(View v){
        twomenu.toggle();
    }
}

TwoSlideMenu

public class TwoSlideMenu extends HorizontalScrollView{

    private LinearLayout mWapper;
    private ViewGroup mMenu;
    //内容区域
    private ViewGroup mContent;
    //屏幕的宽度
    private int mScreenWidth;
   //menu与右边的距离单位dp
    private int mMenuRightPadding = 10;
    private boolean once=false;
    //表示当前的状态
    private boolean isOpen;

    //menu的宽度
    private int mMenuWidth;
    /*
    未使用自定义属性时调用
     */
    public TwoSlideMenu(Context context, AttributeSet attrs) {
        this(context, attrs,0);
//        //获取屏幕的宽度
//       WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
//
//        DisplayMetrics outMetrics= new DisplayMetrics();
//        wm.getDefaultDisplay().getMetrics(outMetrics);
//        //widthPixels像素值
//       mScreenWidth = outMetrics.widthPixels;
//     //将dp转换为px
//        mMenuRightPadding = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 50, context.getResources().getDisplayMetrics());
    }

    /**
     *
     *当自定义了属性时会调用此方法
     */
    public TwoSlideMenu(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        //获取自定义属性
        TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.SlideMenus,defStyleAttr,0);
        int n = a.getIndexCount();
        for (int i=0;i<n;i++){
            int attr = a.getIndex(i);
            switch (attr){
                case R.styleable.SlideMenus_rightPadding:
                    mMenuRightPadding=a.getDimensionPixelSize(attr,(int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 50,
                            context.getResources().getDisplayMetrics()));
                break;
            }
        }
        //释放
        a.recycle();



                //获取屏幕的宽度
       WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);

        DisplayMetrics outMetrics= new DisplayMetrics();
        wm.getDefaultDisplay().getMetrics(outMetrics);
        //widthPixels像素值
       mScreenWidth = outMetrics.widthPixels;
     //将dp转换为px
      //  mMenuRightPadding = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 50, context.getResources().getDisplayMetrics());
    }

    public TwoSlideMenu(Context context) {
        this(context,null);
    }

    /*
    设置子View的宽和高
    设置自己的宽和高
     */
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        //如果为false设置子view的宽和高
        if(!once){
            mWapper = (LinearLayout) getChildAt(0);
            //LinearLayout里的第一个元素
            mMenu = (ViewGroup) mWapper.getChildAt(0);
//LinearLayout里的第二个元素
            mContent = (ViewGroup) mWapper.getChildAt(1);
            //menu的宽度
            mMenuWidth= mMenu.getLayoutParams().width = mScreenWidth-mMenuRightPadding;
            //屏幕的宽度
            mContent.getLayoutParams().width = mScreenWidth;
            //只调用一次
            once=true;

        }

        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }

    /**
     *
     *通过设置偏移量将Menu隐藏
     */
    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        super.onLayout(changed, l, t, r, b);
        if (changed){
            this.scrollTo(mMenuWidth,0);
        }

    }

    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        int action = ev.getAction();
        //通过action判断用户的行为
        switch (action){
            case MotionEvent.ACTION_UP:
                //隐藏在左边的宽度
                int scrollX=getScrollX();
                if (scrollX>=mMenuWidth/2){
                    this.smoothScrollTo(mMenuWidth,0);
                    //菜单隐藏
                    isOpen = false;
                }else{
                    this.smoothScrollTo(0,0);
                    isOpen = true;
                }
                return  true;
        }
        return super.onTouchEvent(ev);
    }

    /**
     * 打开菜单
     */
   public void  openMenu() {
       if (isOpen){
           return;
       }
        this.smoothScrollTo(0,0);
       isOpen=true;
    }
    /**
     * 关闭菜单
     */
    public void closeMenu(){
        if(!isOpen){
            return;
        }
        this.smoothScrollTo(mMenuWidth,0);
        isOpen=false;
    }
    /**
     * 切换菜单
     */
    public void toggle(){
        if (isOpen){
            closeMenu();
        }else {
            openMenu();
        }
    }

    /**
     *滚动发生时
     * int l:当前scaleX的值
     */
    @Override
    protected void onScrollChanged(int l, int t, int oldl, int oldt) {
        super.onScrollChanged(l, t, oldl, oldt);
        //scaleX的值1~0
        float scale = l*1.0f/mMenuWidth;
          //内容区域
        float rightScale = 0.7f+0.3f*scale;
        //缩放比例
        float leftScale = 1.0f-scale*3f;
        //透明度
        float leftAlpha = 0.6f+0.4f*(1-scale);
        //调用属性动画,设置TransationX
        ViewHelper.setTranslationX(mMenu,mMenuWidth*scale);
        //给菜单设置动画
        ViewHelper.setScaleX(mMenu,leftScale);
        ViewHelper.setScaleY(mMenu,leftScale);
        ViewHelper.setAlpha(mMenu,leftAlpha);

        //设置contnt缩放的中心点
        ViewHelper.setPivotX(mContent,0);
        ViewHelper.setPivotY(mContent,mContent.getHeight()/2);
        //内容区域的缩放
        ViewHelper.setScaleX(mContent,rightScale);
        ViewHelper.setScaleY(mContent,rightScale);
    }
}

用框架写的SlidingMenu转自http://blog.csdn.net/lmj623565791/article/details/36677279

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值