Android控件源码分析--AndroidResideMenu菜单
说明
早上看到一篇文章介绍了ResideMenu得使用,这是一个类似SlidingMenu的控件,感觉有点高尚大,反正我之前没见过,本着凑热闹的好奇心,立马clone把玩下,项目地址奉上:
https://github.com/SpecialCyCi/AndroidResideMenu.git

原理概述
在分析源代码之前,简单谈谈,这个效果在这里是如何实现的。
点击按钮画面缩小为50%同时向右侧滑动至中间位置,也可以向右滑动,然后那几个个菜单项就会带着动画出现,动画这里用的是nineoldandroids的兼容包,在整个过程中有三个东西要理解,一是菜单view,二是内容view,还有就是承载他们的父view,在点击后调用AnimatorSet组合动画把内容view向右改变,然后在把菜单view加进来。
实现分析
看过代码后其实这个的实现方式与其他的开源控件确实不太通,之前很少看到有用承载activity的节点view来做的。
怎么使用我就不说了,直接看作者的介绍;https://github.com/SpecialCyCi/AndroidResideMenu/blob/master/README_CN.md
// attach to current activity;
resideMenu = new ResideMenu(this);
resideMenu.setBackground(R.drawable.menu_background);
resideMenu.attachToActivity(this);
// create menu items;
String titles[] = { "Home", "Profile", "Calendar", "Settings" };
int icon[] = { R.drawable.icon_home, R.drawable.icon_profile, R.drawable.icon_calendar, R.drawable.icon_settings };
for (int i = 0; i < titles.length; i++){
ResideMenuItem item = new ResideMenuItem(this, icon[i], titles[i]);
item.setOnClickListener(this);
resideMenu.addMenuItem(item);
}
下面我们来看这个ResideMenu是怎么写的

scaleDown_activity是一个AnimationSet的实例,直接开始动画,view_decor当然就是承载activity的父view,最后把菜单加进来,你会发现这里加了两次,感觉非常奇怪,因为这个sv_menu本身是处在this里面的,

按道理来说一个view是不能同时处在来个节点当中,当时我就斯巴达了,原来这里作者其实写一个比较古怪的方法,先把sv_menu从this当中移除,在加到外面的view_dector中,也就是 if (sv_menu.getParent() != null) removeMenuLayout();这句话的用意,在菜单第一次加载时,我先出于this中,此时和sv_menu.getParent()是同一个指向,这样的写法在我看来味的作用就是可以减少view结构的层数,别无它用,所以完全可以这样来写:
话说回来作者的写法也许有其他考量,我暂时没注意到,修改后的代码可以正常运行。至于前一个 if (getParent() != null) view_decor.removeView(this);比较好理解就是把菜单view先移除,不过也没什么意义,这样每次都重新移除加入是出于什么考虑有待商榷,所以把这两个地方都改一下,就是:

只在第一次的时候才把菜单加入到view_dector里面再看看关闭菜单是怎么写的:

这几个AnimationSet的创建写的还是比较合理,放大还原这个里面只写了缩放的操作,缩小的里面还有缩放坐标点的设置,默认的话是view的中心,这不是我们希望的。


为了跟好的理解这个缩放的坐标点我花了一张示意图,箭头指向的点为屏幕宽度X1.5,高度为屏幕高度X0.5,view的高宽都缩放为50%,得到的就是红色的位置。

其他的参考源代码,这里只做核心的代码分析。
Android控件源码分析--AndroidResideMenu菜单的更多相关文章
- 很不错的安卓FadingActionBar控件源码
这个我刚刚从一个github下载过来的,自己测试一下运行了,感觉还不错的,安卓FadingActionBar控件源码,现在就给大家分享一下,源码我已经上传到源码天堂那里了,想下载的朋友可以去那里下载吧 ...
- Android分包MultiDex源码分析
转载请标明出处:http://blog.csdn.net/shensky711/article/details/52845661 本文出自: [HansChen的博客] 概述 Android开发者应该 ...
- Android网络框架源码分析一---Volley
转载自 http://www.jianshu.com/p/9e17727f31a1?utm_campaign=maleskine&utm_content=note&utm_medium ...
- OpenGL—Android 开机动画源码分析一
.1 Android开机动画实现方式目前实现Android开机动画的方式主要是逐帧动画和OpenGL动画. ?逐帧动画 逐帧动画是一种常见的动画形式(Frame By Frame),其原理是在“连续的 ...
- [Android]开源中国源码分析之二---DrawerLayout
从启动界面到主界面之后的效果如图所示,采用的是v4包下的DrawerLayout, activity_main.xml文件如下: <!-- A DrawerLayout is intended ...
- Android消息机制源码分析
本篇主要介绍Android中的消息机制,即Looper.Handler是如何协同工作的: Looper:主要用来管理当前线程的消息队列,每个线程只能有一个Looper Handler:用来将消息(Me ...
- Android 开机动画源码分析
Android系统在启动SystemServer进程时,通过两个阶段来启动系统所有服务,在第一阶段启动本地服务,如SurfaceFlinger,SensorService等,在第二阶段则启动一系列的J ...
- Android开源框架源码分析:Okhttp
一 请求与响应流程 1.1 请求的封装 1.2 请求的发送 1.3 请求的调度 二 拦截器 2.1 RetryAndFollowUpInterceptor 2.2 BridgeInterceptor ...
- android hardware.c 源码分析
android的jni通过ID来找hal模块,使用了hw_get_module()函数,本文就通过这个函数的来分析一下hal层的模块是如何匹配的. 首先要了解三个结构体hw_module_t,hw_m ...
随机推荐
- loj#2574. 「TJOI2018」智力竞赛 (路径覆盖)
目录 题目链接 题解 代码 题目链接 loj#2574. 「TJOI2018」智力竞赛 题解 就是求可重路径覆盖之后最大化剩余点的最小权值 二分答案后就是一个可重复路径覆盖 处理出可达点做二分图匹配就 ...
- angular2项目关于动画的处理
animations动画在angular2官网里面已经讲解很详细了,那么动画功能在实际项目中应该如何组织文件,动画文件放在哪个位置,如何来组织结构使得动画模块和其他模块之间运作调理清晰呢,下面参照Ni ...
- Java基础-多线程-①线程的创建和启动
简单阐释进程和线程 对于进程最直观的感受应该就是“windows任务管理器”中的进程管理: (计算机原理课上的记忆已经快要模糊了,简单理解一下):一个进程就是一个“执行中的程序”,是程序在计算机上的一 ...
- tomcat配置问题
1.首先安装JDK和Tomcat(我的tomcat是解压缩版的) 2.配置JDK环境变量 3.配置tomcat环境变量 4.在MyEcliipse中配置JDK(可以使用MyEclipse自带的tomc ...
- yum安装与源码编译安装实际使用区别
总结一些我实际生产使用的区别: 1.yum安装不是说不行,都行,各有千秋. 2.yum安装目录不集中,但基本遵循Linux文件夹的作用去划分文件,比如配置文件通常在/etc下. 3.yum安装说的模块 ...
- AIX中vi编辑器使用
3.1 vi 简介 vi 是 UNIX 世界里使用非常普遍的全屏幕文本编辑器,几乎任何一种UNIX系统都会提供这套软件.AIX当然也支持这种编辑器.熟悉DOS下的文本处理后,用户在开始接触vi时也许会 ...
- android:ProgressDialog控件
ProgressDialog 和 AlertDialog 有点类似,都可以在界面上弹出一个对话框,都能够屏蔽 掉其他控件的交互能力.不同的是,ProgressDialog 会在对话框中显示一个进度条, ...
- android:Button控件
Button 是程序用于和用户进行交互的一个重要控件,相信你对这个控件已经是非常熟悉 了,因为我们在上一章用了太多次 Button.它可配置的属性和 TextView 是差不多的,我们 可以在 act ...
- springboot自定义http反馈状态码
最近在开发一些http server类型程序,通过spring boot构建一些web程序,这些web程序之间通过http进行数据访问.共享,如下图: 假设现在client发起一次保存数据的请求到se ...
- OS面试题(转载)
转载自:http://placement.freshersworld.com/power-preparation/technical-interview-preparation/os-intervie ...