Xamarin.Android开发实践(十八)
Xamarin.Android之SlidingMenu
一、前言
有位网友在评论中希望能够出个在Xamarin.Android下实现SlidingMenu效果的随笔,刚好昨天在观看官网示例项目的时候也看到这个SlidingMenu,但是最终的效果并不是我们所期待的,至此笔者就在官方的论坛中寻找,最后也成功的寻找到的答案,下面笔者将带领带领大家实现SlidingMenu。
二、准备工作
实现SlidingMenu重点是需要一个第三方的类库,笔者已经把部分重要的方法注释了,下面是下载地址:
注:我们的项目不仅仅需要引用这个类库还需要引用自带的Mono.Android.Support.v4类库,可从 图 1.1 找到该类库。

图 1.1
三、正文
新建项目笔者就不多说了,然后我们按照第二步的要求引用需要的类库后在Resource/layout下新建一个视图并命名为menu,然后在其中拖放几个Button控件,而这个视图将是我们滑动菜单的界面,最后我们就可以打开MainActivity.cs并在其中写入如下代码:
1 protected override void OnCreate(Bundle bundle)
2 {
3 base.OnCreate(bundle);
4 SetContentView(Resource.Layout.Main);
5 //实例化
6 var sm = new SlidingMenu(this);
7 //指定滑动菜单的视图
8 sm.SetMenu(Resource.Layout.menu);
9 //将滑动菜单附加到Activity上
10 sm.AttachToActivity(this, SlidingMenuSharp.SlideStyle.Window);
11 }
其中需要说明的是AttachToActivity方法的第二个参数,这个参数指定了SlidingMenu如何附加到Activity上,在视觉效果上指定了Window则当滑动的时候ActionBar也会跟着滑动,如果是Content则ActionBar不会跟着滑动,我们可以查看图 1.2 和 1.3 分别是Window和Content情况下的效果(默认需要从边框开始滑动才可以,并不是全屏)。

图1.2

图1.3
但是上面的这种SlidingMenu可不是我们所希望的那种SlidingMenu,况且Xamarin的官方示例里面也有这种效果,所以下面我们要让滑动菜单只显示部分,并且可以通过滑动全屏的任意部分呼出菜单,所以我们将代码改写成如下所示:
1 protected override void OnCreate(Bundle bundle)
2 {
3 base.OnCreate(bundle);
4 SetContentView(Resource.Layout.Main);
5 var sm = new SlidingMenu(this);
6 sm.SetMenu(Resource.Layout.menu);
7 //指定主界面显示的宽度
8 sm.BehindOffset = 100;
9 sm.TouchModeAbove = TouchMode.Fullscreen;
10 sm.AttachToActivity(this, SlidingMenuSharp.SlideStyle.Content);
11 }
其中需要说明的是BehindOffset属性,通过注释我们可以知道它是用来指定滑动菜单完全显示后主界面的可视部分的宽度,也可以BehindOffsetRes来指定,只是这个属性必须使用资源的标识符来赋值。我们除了可以指定主界面也可以指定滑动菜单显示的宽度,对应的属性就是BehindWidth和BehindWidthRes。
现在我们的SlidingMenu已经有点样子了,但是还没有完全结束,后面我们将会不断的美化它,让它更加符合实际项目的需要。
首先我们需要讲解的是BehindScrollScale属性,它的效果就是控制滑动菜单在划出时滑动的强度,取值范围为0~1,我们可以通过图 1.4 和 1.5 看出取值为0和1时候的滑动效果。

图1.4

图 1.5
通过图1.4和图1.5我们可以清楚的看到这个属性的作用,你会发现当设置为1的时候跟ViewPager很相似了。
还有另一个属性就是FadeDegree和FadeEnabled,第一个是控制渐变效果的强度,第二个则决定是否使用渐变效果,我们还是通过图片来演示FadeDegree在0和1的情况下分别是什么样的效果,图 1.6 和 图 1.7分别对应取值为0和1时的效果。

图1.6

图1.7
通过图1.6和1.7我们可以清楚的看出在刚滑动的时 候他们的颜色是不同的,并且在不断滑动的过程中会渐渐变淡,而这个属性的作用就是用来控制它。然而还有一个比较严重的问题就是滑动菜单和我们的主界面之间 没有分割线,但是我们又不能直接用一条线,这样显的很不美观,那么我们就可以自己设置一个渐变效果,首先我们需要在Resource/drawable下新建一个xml文件,并命名为shadow,在其中写入如下内容:
1 <?xml version="1.0" encoding="utf-8" ?>
2 <shape xmlns:android="http://schemas.android.com/apk/res/android">
3 <gradient
4 android:endColor="#00000000"
5 android:centerColor="#11000000"
6 android:startColor="#33000000" ></gradient>
7 </shape>
通过以上内容我们指定了一个渐变效果的,剩下的我们需要使用这个资源:
1 var sm = new SlidingMenu(this);
2 sm.SetMenu(Resource.Layout.menu);
3
4 sm.FadeEnabled = true;
5 sm.FadeDegree = 1f;
6 sm.BehindOffset = 100;
7 sm.ShadowDrawableRes = Resource.Drawable.shadow;
8 sm.ShadowWidth = 15;
9 sm.BehindScrollScale = 0f;
10 sm.TouchModeAbove = TouchMode.Fullscreen;
11 sm.AttachToActivity(this, SlidingMenuSharp.SlideStyle.Content);
12 }
这里我们通过ShadowDrawableRes属性使用这个资源,并通过ShadowWidth属性控制它的宽度,最后我们运行程序就可以看到一个渐变的分割线了图1.8:

图1.8
上面我们只是把滑动菜单都放在了左边,实际上我们可以将滑动菜单放在右边或者两边都有,比如在原本的代码上加上这句代码后就可以在左边呈现了。
1 sm.Mode = MenuMode.Right;
2 sm.SetSecondaryMenu(Resource.Layout.menu);
第一个属性用来控制滑动菜单的模式,第二个就是指定右边的滑动菜单的内容。讲到这里大家获取会疑惑怎么才好监听滑动菜单里的事件呢?其实滑动菜单就是整个Activity的一部分,所以在其中的控件都是可以通过FindViewById获取到的,当然笔者建议读者采用Fragment将代码分离,SlidingMenu的SetContent方法可以直接改变主界面的视图。
除了我们自己新建SlidingMenu,我们还可以让活动继承SlidingFragmentActivity类,这样我们就直接可以通过控制SlidingMenu属性,而不需要实例化一个,也不需要调用AttachToActivity附加到Activity上,比如我们将上面的代码改写成如下所示
1 protected override void OnCreate(Bundle bundle)
2 {
3 base.OnCreate(bundle);
4 SetContentView(Resource.Layout.Main);
5 SetBehindContentView(Resource.Layout.menu);
6 SlidingMenu.FadeEnabled = true;
7 SlidingMenu.FadeDegree = 1f;
8 SlidingMenu.BehindOffset = 100;
9 SlidingMenu.ShadowDrawableRes = Resource.Drawable.shadow;
10 SlidingMenu.ShadowWidth = 15;
11 SlidingMenu.BehindScrollScale = 0f;
12 SlidingMenu.Mode = MenuMode.Right;
13 SlidingMenu.SetSecondaryMenu(Resource.Layout.menu);
14 SlidingMenu.TouchModeAbove = TouchMode.Fullscreen;
15 }
我们需要注意SetBehindContentView方法,这个方法必须调用,但是它的功能实际上跟SetMenu是一样的,是用来设置滑动菜单的界面的,读者通过查看最终的结果可以发现ActionBar又跟着主界面动了,但是我们没了AttachToActivity方法就不好指定枚举了,这个时候我们需要使用SetSlidingActionBarEnabled方法,并传入false即可。
读者在使用实际的app中一定会发现SlidingMenu呈现的动画会有许多中,当然我们也有许多种呈现方式,只需要给BehindCanvasTransformer属性赋值即可,内置的动画有ZoomTransformer、SlideTransformer和ScaleTransformer,当然他们都是类,是需要初始化的,我们通过下图来演示不同的动画效果如何:

ZoomTransformer动画

SlideTransformer动画

ScaleTransformer动画
Xamarin.Android开发实践(十八)的更多相关文章
- Xamarin.Android开发实践(八)
Xamarin.Android其他类型的服务 一.前言 前面我们已经学了关于服务的很多知识,但是对于真实的开发那些远远不够,通过这节我们将学习其他类型的服务,比如前台服务.IntentService和 ...
- Xamarin.Android开发实践(五)
原文:Xamarin.Android开发实践(五) 一.服务的生命周期 服务与活动一样,在它的整个生命周期中存在着一些事件,下图可以很好解释整个过程以及涉及到的方法: 在真实的使用中,Service来 ...
- Xamarin.Android开发实践(四)
原文:Xamarin.Android开发实践(四) Xamarin.Android下获取与解析JSON 一.新建项目 1.新建一个Android项目,并命名为为NetJsonList 2.右击引用,选 ...
- Xamarin.Android开发实践(三)
原文:Xamarin.Android开发实践(三) 一.前言 用过Android手机的人一定会发现一种现象,当你把一个应用置于后台后,一段时间之后在打开就会发现应用重新打开了,但是之前的相关的数据却没 ...
- Xamarin.Android开发实践(二)
原文:Xamarin.Android开发实践(二) 一.准备 开始学习本教程前必须先完成该教程http://www.cnblogs.com/yaozhenfa/p/xamarin_android_qu ...
- Xamarin.Android开发实践(一)
原文:Xamarin.Android开发实践(一) 一.准备工作 1.创建一个空的解决方案,并命名为Phoneword 2.右击解决方案 新建->新建项目 并命名为Phoneword_Droid ...
- Xamarin.Android开发实践(十五)
Xamarin.Android学习之应用程序首选项 一.前言 任何App都会存在设置界面,如果开发者利用普通控件并绑定监听事件保存设置,这 一过程会非常的枯燥,而且耗时.我们可以看到Android系统 ...
- Xamarin.Android开发实践(十四)
Xamarin.Android之ListView和Adapter 一.前言 如今不管任何应用都能够看到列表的存在,而本章我们将学习如何使用Xamarin去实现它,以及如何使用适配器和自定义适配器(本文 ...
- Xamarin.Android开发实践(十六)
Xamarin.Android之Fragment Walkthrough 利用Fragment设计能够兼容不同屏幕的应用 这里我们先围观下最后的成果图,给读者打打气: 普通手机上显示的结果: 在平板上 ...
随机推荐
- Docker系列之(三):Docker微容器Alpine Linux
1. 前言 使用Docker创建容器时,基础镜像通常选择Ubuntu或Centos,不管哪个镜像的大小都在100MB以上. Alpine Linux是一个面向安全的轻型的Linux发行版. Alpin ...
- Linux(Ubuntu)下面SecureCRT 完全破解
转载声明:本文来自http://www.boll.me/archives/680 相关说明: 上篇发了个Linux(Ubuntu) 下 SecureCRT 7 30天循环破解在启动的时候会多输入一次确 ...
- 微信也有土豪版 针对iPhone 6/6 Plus进行优化
土豪们最近都上手iPhone 6/6 Plus了,烦恼的是iPhone 6/Plus增大了屏幕和分辨率,由此带来了不少应用的适配问题,排版乱了,app周边多了一片空白,是不是很煞风景?微信团队昨天放出 ...
- 修改php.ini以达到 屏蔽错误信息
那是因为php.ini中关闭了错误显示,将错误写成了文件,这是人为设置的结果,display_errors =on就好了. 不过不显示错误倒安全点,建议调试时打开,然后提供服务时关闭. 提供一点资料给 ...
- SGU-169 Numbers(找规律)
题目链接:http://acm.sgu.ru/problem.php?contest=0&problem=169 解题报告: P(n)定义为n的所有位数的乘积,例如P(1243)=1*2*3* ...
- 快还要更快,让PHP 7 运行更加神速
导读 PHP 7 比5.x 快上很多,即使只有单纯的版本升级就已经很有感,不过大家还是希望它变得越来越快,这时再做些小调整就会更有fu,Let's try it! 事前准备 说到PHP 7,那一定跑不 ...
- Unity3D如何制作透贴和使用透贴模型
http://momowing.diandian.com/post/2012-10-25/40040842845 Unity3D如何制作透贴和使用透贴模型??解决办法!!! 问题: 同事通过3DMAX ...
- 教程Xcode 4下编译发布与提交App到AppStore
地址:http://www.cocoachina.com/bbs/simple/?t55825.html 教程Xcode 4下编译发布与提交App到AppStore 先说一下这个是我在网上看到的一个帖 ...
- C++简单使用Jsoncpp来读取写入json文件
一.源码编译 C++操作json字符串最好的库应该就是jsoncpp了,开源并且跨平台.它可以从这里下载. 下载后将其解压到任意目录,它默认提供VS2003和VS2010的工程文件,使用VS2010可 ...
- Coursera台大机器学习课程笔记11 -- Nonlinear Transformation
这一节讲的是如何将线性不可分的情况转为非线性可分以及转换的代价.特征转换是机器学习的重点. 最后得出重要的结论是,在做转换时,先从简单模型,再到复杂模型. 参考:http://www.cnblogs. ...