• 热门专题

Android 学习笔记之AndBase框架学习(七) SlidingMenu滑动菜单的实现

作者:Darker  发布日期:2015-11-17 20:43:17
Tag标签:框架  菜单  笔记  
  • PS:努力的往前飞..再累也无所谓..

    学习内容:

    1.使用SlidingMenu实现滑动菜单..

      SlidingMenu滑动菜单..滑动菜单在绝大多数app中也是存在的..非常的实用..Github有位牛人将这个东西书写成了一个简单的框架..我们只需要通过引用相关的资源就能够完成一个滑动菜单的实现..有了这一层的基础..那么滑动菜单就很容易实现了..就拿我们最为熟悉的QQ来说吧..当我们进行滑动操作的时候..会有一个新的View去覆盖原本的View..我们可以通过触发新的视图上的控件来执行其他的操作...

      SlidingMenu的实现有很多种方式..个人感觉最实用的方式还是使用继承SlidingFragment的方式来实现..这样我们可以添加更多的Fragment来展现一个视图..首先使用最简单的方式实现一个滑动后在左侧出现一个滑动视图...

    1.使用最基本的方式实现SlidingMenu

      通过使用创建SlidingMenu对象..然后对其进行相关参数的设置..将这个滑动菜单再添加到相关联的Activity当中就可以完成一个滑动菜单的创建了...

    package com.darker;
    
    import android.app.Activity;
    import android.os.Bundle;
    
    import com.jeremyfeinstein.slidingmenu.lib.SlidingMenu;
    
    public class MainActivity extends Activity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            SlidingMenu menu = new SlidingMenu(this); //创建一个滑动菜单对象..
            menu.setMode(SlidingMenu.LEFT);
            // 设置触摸屏幕的模式
            menu.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);
            menu.setShadowWidthRes(R.dimen.shadow_width);
            menu.setShadowDrawable(R.drawable.shadow);
    
            // 设置滑动菜单视图的宽度
            menu.setBehindOffsetRes(R.dimen.slidingmenu_offset);
            // 设置渐入渐出效果的值
            menu.setFadeDegree(0.35f);
            // 把滑动菜单添加进所有的Activity中,可选值SLIDING_CONTENT , SLIDING_WINDOW
            menu.attachToActivity(this, SlidingMenu.SLIDING_CONTENT);
            // 为侧滑菜单设置布局
            menu.setMenu(R.layout.leftmenu);
    
        }
    
    }

      这里是通过直接对对象进行创建,然后设置相关的属性..从而构造一个滑动菜单..我们同样可以在布局文件当中去写一个SlidingMenu..然后通过获取ID的方式去指定样式..同样可以创建一个滑动菜单...布局的方式采用这种方式..那么这块的布局就会去调用com.jeremyfeinstein.slidingmenu.lib.SlidingMenu去创建一个SlidingMenu..

     <com.jeremyfeinstein.slidingmenu.lib.SlidingMenu
                xmlns:sliding='http://schemas.android.com/apk/res-auto'
                android:id='@+id/slidingmenulayout'
                android:layout_width='120dp'
                android:layout_height='170dp'
                android:background='#ffffffff'
                sliding:behindOffset='0dp'
                sliding:behindScrollScale='1'
                sliding:fadeDegree='0.3'
                sliding:fadeEnabled='true'
                sliding:touchModeAbove='fullscreen'
                sliding:viewAbove='@layout/pic'>
    </com.jeremyfeinstein.slidingmenu.lib.SlidingMenu>

       这样创建出来的SlidingMenu会按照xml指定的大小和位置出现..动态布局其实和这样的静态布局其实区别并不是非常的大...动态则需要我们手动去创建..通过建立对象的方式..而静态则是调用xml文件的方式..最后归根结底都去调用SlidingMenu的构造函数去创建一个滑动菜单...

    package com.Darker;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.view.View;
    import android.view.View.OnClickListener;
    
    import com.jeremyfeinstein.slidingmenu.lib.SlidingMenu;
    
    public class MainActivity extends Activity {
        private SlidingMenu mLeftMenu;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            mLeftMenu = (SlidingMenu) findViewById(R.id.slidingmenulayout);
            // configure the SlidingMenu
            // SlidingMenu menu = new SlidingMenu(this);
            mLeftMenu.setMode(SlidingMenu.LEFT);
            // 设置触摸屏幕的模式
            mLeftMenu.setShadowWidthRes(R.dimen.shadow_width);
            mLeftMenu.setShadowDrawable(R.drawable.shadow);
    
            mLeftMenu.setMenu(R.layout.leftmenu);
    
            mLeftMenu.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (mLeftMenu.isMenuShowing())
                        mLeftMenu.toggle();
                }
            });
        }
    
    }

    2.使用另外一种方式去创建一个SlidingMenu...

      第二种方式则是采用 extends SlidingFragmentActivity的方式去实现一个滑动菜单..它extends FragmentActivity..说到这里就不得不说一下Fragment了..这个在Android 3.0 就被正式引入的新概念..但是在Android 4.0才开始正式启用..

      Fragment被称为碎片管理,这个名字给我感觉和它的作用到底有毛关系我还真就不是非常的清楚..还是说一下它的具体功能吧..Fragment其实是一个轻量级的Acticity..因为app都是采用多Activity进行管理的..因此当界面众多的时候..我们需要建立多个Activity..Activity通过Intent去完成数据信息的传递和交互过程..但是多个Activity就会导致一个问题的出现..在对应用软件进行相关维护的时候,由于Activity众多..导致可维护性也比较差..众多的Activity会导致AndroidManifest配置文件非常的难读..因此这里就引入了Fragment这个概念.并且它内部封装的方法可以直接拿到inflater..这样我们可以直接去inflate布局..

      Fragment的使用可以定义在xml布局文件当中..

        <fragment 
            android:id='@+id/fragment'
            android:layout_height='wrap_content'
            android:layout_width='wrap_content'/>

      以这样的方式在xml文件内部定义fragment,然后在主函数内部通过获取ID的方式,然后对fragment进行设置也是可以的..不过我个人感觉..fragment通过动态的创建更加的好用..一个简单的fragment的定义方式..

    package com.Darker;
    
    import android.os.Bundle;
    import android.support.v4.app.Fragment;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    
    public class MainTab01 extends Fragment {
    
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            return inflater.inflate(R.layout.main_tab_01, container, false);
        }
    }

      这样直接创建一个Fragment子类..通过继承的方式..这样就能够继承内部的大部分属性..onCreateView这个方法是个非常常用的方法..其实就是拿到当前Activity的inflater然后直接在View上加载一个新的布局..这样就可以直接在Activity添加fragment...多说无益..来一段代码...

    package com.Darker;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import android.os.Bundle;
    import android.support.v4.app.Fragment;
    import android.support.v4.app.FragmentPagerAdapter;
    import android.support.v4.view.ViewPager;
    import android.view.View;
    import android.view.Window;
    
    import com.jeremyfeinstein.slidingmenu.lib.SlidingMenu;
    import com.jeremyfeinstein.slidingmenu.lib.app.SlidingFragmentActivity;
    
    public class MainActivity extends SlidingFragmentActivity {
    
        private ViewPager mViewPager;              //ViewPager用于保存多个View..以多页的方式进行保存..
        private FragmentPagerAdapter mAdapter;  //Fragment适配器..
        private List<Fragment> mFragments = new ArrayList<Fragment>();  //定义一个List..用来保存Fragment..
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            this.requestWindowFeature(Window.FEATURE_NO_TITLE);
            setContentView(R.layout.activity_main);
            // 初始化SlideMenu
            initRightMenu();
            // 初始化ViewPager
            initViewPager();
    
        }
    
        private void initViewPager() {
            mViewPager = (ViewPager) findViewById(R.id.id_viewpager);  //获取ViewPager..
            
            /**
             *  自定义了三个轻量级Activity..也就是Fragment..
             * */
            
            MainTab01 tab01 = new MainTab01();   
            MainTab02 tab02 = new MainTab02();
            MainTab03 tab03 = new MainTab03();
            
            //将三个Fragment保存在List中..
            mFragments.add(tab01);
            mFragments.add(tab02);
            mFragments.add(tab03);
            /**
             * 初始化Adapter..
             */
            mAdapter = new FragmentPagerAdapter(getSupportFragmentManager()) {
                @Override
                public int getCount() {
                    return mFragments.size();  //返回Fragment的数量..
                }
    
                @Override
                public Fragment getItem(int arg0) {
                    return mFragments.get(arg0);  //获取Fragment子选项..
                }
            };
            mViewPager.setAdapter(mAdapter);
        }
    
        //这里自定义了两个滑动菜单...
        private void initRightMenu() {
            
            Fragment leftMenuFragment = new MenuLeftFragment(); // 左侧的视图View..
            setBehindContentView(R.layout.left_menu_frame);      //设置需要被覆盖的布局..
            
            /**
             *  首先获取碎片管理权限..
             *  由于布局之间的覆盖是一个事务.因此需要将事物设置为开始状态..
             *  同时调用replace方法来设置布局之间的相互替代...
             *  最后将事物进行提交..
             * */
            getSupportFragmentManager().beginTransaction()
                    .replace(R.id.id_left_menu_frame, leftMenuFragment).commit();
            SlidingMenu menu = getSlidingMenu();              //定义一个滑动菜单..
            menu.setMode(SlidingMenu.LEFT_RIGHT);              
            // 设置触摸屏幕的模式
            menu.setTouchModeAbove(SlidingMenu.TOUCHMODE_MARGIN);
            menu.setShadowWidthRes(R.dimen.shadow_width);
            menu.setShadowDrawable(R.drawable.shadow);
            // 设置滑动菜单视图的宽度
            menu.setBehindOffsetRes(R.dimen.slidingmenu_offset);
            // 设置渐入渐出效果的值
            menu.setFadeDegree(0.35f);
            menu.setSecondaryShadowDrawable(R.drawable.shadow);
            
            // 设置了一个(二级)侧滑菜单
            menu.setSecondaryMenu(R.layout.right_menu_frame);
            Fragment rightMenuFragment = new MenuRightFragment();
            getSupportFragmentManager().beginTransaction()
                    .replace(R.id.id_right_menu_frame, rightMenuFragment).commit();
        }
        
        //显示当前滑动菜单的左侧子菜单..
        public void showLeftMenu(View view) {
            getSlidingMenu().showMenu();
        }
    
        //显示当前滑动菜单的右侧子菜单..
        public void showRightMenu(View view) {
            getSlidingMenu().showSecondaryMenu();
        }
    }

      这里我们可以看到通过extends SlidingFragmentActivity 来实现的..并且这里使用了一个ViewPager..用来保存多个界面.从而实现滑动..并且在这里定义了两个滑动菜单..这两个滑动菜单通过人为在屏幕的最左右侧进行滑动来完成触发..通过滑动..那么滑动的子菜单也会得到展示..我们同样可以操作子菜单来完成更多的操作..这里并不是因为继承了当前Activity继承了SlidingFragmentActivity才实现的左右菜单一起进行设置..通过继承普通的Activity也是能够实现的...这里不要走入误区..

      继承了SlidingFragmentActivity的原因是我希望当前的主Activity能够添加fragment的形式来完成滑动...

      还需要说的一点就是ViewPager也是需要设置适配器的..这里使用了Android系统自带的FragmentPageAdapter..其实也是通过继承了PagerAdapter来实现的..我们只需要重写一个抽象方法就可以了..总之实现的过程是非常的简单的...

      最后附加上一个源码提供个大家:http://files.cnblogs.com/files/RGogoing/zhy_slidingmenu_demo.rar (源代码不是本人写的..这个源代码主要是针对如何使用SlidingMenu..)

About IT165 - 广告服务 - 隐私声明 - 版权申明 - 免责条款 - 网站地图 - 网友投稿 - 联系方式
本站内容来自于互联网,仅供用于网络技术学习,学习中请遵循相关法律法规