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

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..)

  

时间: 2024-10-26 10:27:08

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

Android 学习笔记之AndBase框架学习(五) 数据库ORM..注解,数据库对象映射...

PS:好久没写博客了... 学习内容: 1.DAO介绍,通用DAO的简单调度过程.. 2.数据库映射关系... 3.使用泛型+反射+注解封装通用DAO.. 4.使用AndBase框架实现对DAO的调用实现数据库基本操作.. 1.DAO..   DAO..这个说法大家都不陌生..数据库操作访问对象的抽象接口层..在DAO内部封装好通用的方法..然后再使用一个具体类来进行实现..在我们想要调用这些方法对数据库进行相关操作时..只需要传递数据实体对象,就可以通过实体对象的传递从而实现对数据库进行操作.

Android 学习笔记之AndBase框架学习(三) 使用封装好的函数完成Http请求..

PS:踏踏实实走好每一步... 学习内容: 1.使用AndBase框架实现无参Http Get请求... 2.使用AndBase框架实现有参Http Post请求... 3.使用AndBase框架实现有参Http Get请求...   AndBase框架为我们提供了一些相关的方法提供给我们使用,用来完成Http网络请求...总体就是对Http请求的一个封装,不过个人认为,网络请求这一模块更加推荐使用Volley框架..楼主对比了两个框架中的源码...Volley更多的地方是使用抽象方法封装在接口

Android 学习笔记之AndBase框架学习(一) 实现多功能标题栏

PS:Volley框架终于通过看源码的方式完成了所有的学习..开始学习AndBase...AndBase的源码实在是多的离谱...因此就不对所有的源码进行分析了... 学习内容: 1.使用AndBase实现多功能标题栏...   AndBase框架内部提供了许多的方式能够使我们去设置一个更好的标题栏,进行动态的改变,而并非静态的将标题栏界面写死...能够使得标题栏更加的美观...总体就是动态的获取布局然后通过对布局的操作来自定义一个良好的标题栏...   使用AndBase框架的时候我们的主函数

Android 学习笔记之AndBase框架学习(二) 使用封装好的进度框,Toast框,弹出框,确认框...

PS:渐渐明白,在实验室呆三年都不如在企业呆一年... 学习内容: 1.使用AbActivity内部封装的方法实现进度框,Toast框,弹出框,确认框...   AndBase中AbActivity封装好了许多方法提供我们去使用,使得在使用的时候更加的方便,只需要传递相关参数即可..省去了我们自己使用基础的函数进行构造...   就好比进度框,Toast框,弹出框,确认框...这些基本的东西都在AndBase的AbActivity封装好了...我们只需要传递参数调用其中内部的方法就可以完成这些视

Android 学习笔记之AndBase框架学习(四) 使用封装好的函数实现单,多线程任务

PS:Force Is Meaningless Without Skill 学习内容: 1.使用AndBase实现单线程任务... 2.使用AndBase实现多线程任务...   AndBase内部封装了多种方法,我们可以使用这些方法构建单线程任务和多线程任务..一般线程任务用于执行耗时的操作...比如说下载什么安装包,文件等数据量较大的东西,我们是必须要开启一个异步线程或者是同步线程来执行操作...如果任务过多,那么我们就可以使用任务请求队列或者是线程池来处理多个任务...这样可以节省很多的时

Hadoop学习笔记—18.Sqoop框架学习

一.Sqoop基础:连接关系型数据库与Hadoop的桥梁 1.1 Sqoop的基本概念 Hadoop正成为企业用于大数据分析的最热门选择,但想将你的数据移植过去并不容易.Apache Sqoop正在加紧帮助客户将重要数据从数据库移到Hadoop.随着Hadoop和关系型数据库之间的数据移动渐渐变成一个标准的流程,云管理员们能够利用Sqoop的并行批量数据加载能力来简化这一流程,降低编写自定义数据加载脚本的需求. Apache Sqoop(SQL-to-Hadoop) 项目旨在协助 RDBMS 与

Hadoop学习笔记—15.HBase框架学习(基础知识篇)

HBase是Apache Hadoop的数据库,能够对大型数据提供随机.实时的读写访问.HBase的目标是存储并处理大型的数据.HBase是一个开源的,分布式的,多版本的,面向列的存储模型,它存储的是松散型数据. 一.HBase:BigTable的开源实现 1.1 HBase出现的背景 (1)随着数据规模越来越大,大量业务场景开始考虑数据存储水平扩展,使得存储服务可以增加/删除,而目前的关系型数据库更专注于一台机器. (2)海量数据量存储成为瓶颈,单台机器无法负载大量数据. (3)单台机器IO读

Hadoop学习笔记—19.Flume框架学习

START:Flume是Cloudera提供的一个高可用的.高可靠的开源分布式海量日志收集系统,日志数据可以经过Flume流向需要存储终端目的地.这里的日志是一个统称,泛指文件.操作记录等许多数据. 一.Flume基础理论 1.1 常见的分布式日志收集系统 Scribe是facebook开源的日志收集系统,在facebook内部已经得到大量的应用. Chukwa 是一个开源的用于监控大型分布式系统的数据收集系统.这是构建在 hadoop 的 hdfs 和 map/reduce 框架之上的,继承了

Hadoop学习笔记—16.Pig框架学习

一.关于Pig:别以为猪不能干活 1.1 Pig的简介 Pig是一个基于Hadoop的大规模数据分析平台,它提供的SQL-LIKE语言叫Pig Latin,该语言的编译器会把类SQL的数据分析请求转换为一系列经过优化处理的MapReduce运算.Pig为复杂的海量数据并行计算提供了一个简单的操作和编程接口. Compare:相比Java的MapReduce API,Pig为大型数据集的处理提供了更高层次的抽象,与MapReduce相比,Pig提供了更丰富的数据结构,一般都是多值和嵌套的数据结构.