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

时间:2023-02-21 09:07:05

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

  

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

  1. Android 学习笔记之AndBase框架学习&lpar;六&rpar; PullToRefrech 下拉刷新的实现

    PS:Struggle for a better future 学习内容: 1.PullToRefrech下拉刷新的实现...   不得不说AndBase这个开源框架确实是非常的强大..把大部分的东西 ...

  2. Android 学习笔记之AndBase框架学习&lpar;五&rpar; 数据库ORM&period;&period;注解,数据库对象映射&period;&period;&period;

    PS:好久没写博客了... 学习内容: 1.DAO介绍,通用DAO的简单调度过程.. 2.数据库映射关系... 3.使用泛型+反射+注解封装通用DAO.. 4.使用AndBase框架实现对DAO的调用 ...

  3. Android 学习笔记之AndBase框架学习&lpar;三&rpar; 使用封装好的函数完成Http请求&period;&period;

    PS:踏踏实实走好每一步... 学习内容: 1.使用AndBase框架实现无参Http Get请求... 2.使用AndBase框架实现有参Http Post请求... 3.使用AndBase框架实现 ...

  4. Android 学习笔记之AndBase框架学习&lpar;二&rpar; 使用封装好的进度框,Toast框,弹出框,确认框&period;&period;&period;

    PS:渐渐明白,在实验室呆三年都不如在企业呆一年... 学习内容: 1.使用AbActivity内部封装的方法实现进度框,Toast框,弹出框,确认框...   AndBase中AbActivity封 ...

  5. Android 学习笔记之AndBase框架学习&lpar;一&rpar; 实现多功能标题栏

    PS:Volley框架终于通过看源码的方式完成了所有的学习..开始学习AndBase...AndBase的源码实在是多的离谱...因此就不对所有的源码进行分析了... 学习内容: 1.使用AndBas ...

  6. Android 学习笔记之AndBase框架学习&lpar;四&rpar; 使用封装好的函数实现单,多线程任务

    PS:Force Is Meaningless Without Skill 学习内容: 1.使用AndBase实现单线程任务... 2.使用AndBase实现多线程任务...   AndBase内部封 ...

  7. Hadoop学习笔记—18&period;Sqoop框架学习

    一.Sqoop基础:连接关系型数据库与Hadoop的桥梁 1.1 Sqoop的基本概念 Hadoop正成为企业用于大数据分析的最热门选择,但想将你的数据移植过去并不容易.Apache Sqoop正在加 ...

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

    HBase是Apache Hadoop的数据库,能够对大型数据提供随机.实时的读写访问.HBase的目标是存储并处理大型的数据.HBase是一个开源的,分布式的,多版本的,面向列的存储模型,它存储的是 ...

  9. Hadoop学习笔记—15&period;HBase框架学习(基础实践篇)

    一.HBase的安装配置 1.1 伪分布模式安装 伪分布模式安装即在一台计算机上部署HBase的各个角色,HMaster.HRegionServer以及ZooKeeper都在一台计算机上来模拟. 首先 ...

随机推荐

  1. Android成长日记-Noification实现状态栏通知

    Notification可以作为状态栏的通知,实现这个效果需要使用NotificationManager实现控制类,才能实现对这个效果的显示 下面是实现状态栏显示效果的通知: 1. 首先在Layout ...

  2. Caffe学习系列&lpar;8&rpar;:solver及其配置

    solver是caffe的核心. net: "examples/mnist/lenet_train_test.prototxt" test_iter: 100 test_inter ...

  3. js处理日期的一些整理&lpar;js获取给定日期前一天的日期&rpar;

    var date = new Date(); alert(date);//获取当前时间 alert(date.getFullYear());//获取当前年分 alert(date.getMonth() ...

  4. Mockito使用注意事项

    已使用mockito有些问题.例如:配合可变长度参数.定义自己的参数匹配,在这些mockito官方文件(http://docs.mockito.googlecode.com/hg/latest/org ...

  5. 老李推荐:第8章6节《MonkeyRunner源码剖析》MonkeyRunner启动运行过程-启动Monkey 4

    在获得比对设备序列号后,findAttachedDevice就会跟提供的序列号进行比对,如果吻合就返回给调用者” 代码8-6-3 AdbBackend - waitForConnection”了.而A ...

  6. react项目中遇到的坑

    1,touchStart和touchEnd 如果touchstart和touchend改变的是同一个state,那么在首次加载渲染的时候组件会陷入死循环,原因是touchstart会直接触发,但此时s ...

  7. centos 7 linux 安装与卸载 jdk 7

    一.声明 本文采用操作系统版本: Centos 7 Linux 系统 版本源:CentOS-7-x86_64-DVD-1708.iso 官网下载地址:http://isoredirect.centos ...

  8. grid - 网格项目对齐方式(Box Alignment)

    CSS的Box Alignment Module补充了网格项目沿着网格行或列轴对齐方式. <view class="grid"> <view class='ite ...

  9. Linux文件系统命令 cd

    命令名:cd 功能:切换到某一个目录,后面可以跟相对路径和绝对路径. eg:cd /etc/ 表示的是进入到/etc/目录下 另外几个比较特俗的用法: cd - 切换到当前目录 cd ./ 还是当前路 ...

  10. MAMP 安装phpredis 扩展

    phpredis扩展包地址: https://github.com/nicolasff/phpredis 1.下载php源码 (http://php.net/releases/  选择php5.5.1 ...