说明

早上看到一篇文章介绍了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菜单的更多相关文章

  1. 很不错的安卓FadingActionBar控件源码

    这个我刚刚从一个github下载过来的,自己测试一下运行了,感觉还不错的,安卓FadingActionBar控件源码,现在就给大家分享一下,源码我已经上传到源码天堂那里了,想下载的朋友可以去那里下载吧 ...

  2. Android分包MultiDex源码分析

    转载请标明出处:http://blog.csdn.net/shensky711/article/details/52845661 本文出自: [HansChen的博客] 概述 Android开发者应该 ...

  3. Android网络框架源码分析一---Volley

    转载自 http://www.jianshu.com/p/9e17727f31a1?utm_campaign=maleskine&utm_content=note&utm_medium ...

  4. OpenGL—Android 开机动画源码分析一

    .1 Android开机动画实现方式目前实现Android开机动画的方式主要是逐帧动画和OpenGL动画. ?逐帧动画 逐帧动画是一种常见的动画形式(Frame By Frame),其原理是在“连续的 ...

  5. [Android]开源中国源码分析之二---DrawerLayout

    从启动界面到主界面之后的效果如图所示,采用的是v4包下的DrawerLayout, activity_main.xml文件如下: <!-- A DrawerLayout is intended ...

  6. Android消息机制源码分析

    本篇主要介绍Android中的消息机制,即Looper.Handler是如何协同工作的: Looper:主要用来管理当前线程的消息队列,每个线程只能有一个Looper Handler:用来将消息(Me ...

  7. Android 开机动画源码分析

    Android系统在启动SystemServer进程时,通过两个阶段来启动系统所有服务,在第一阶段启动本地服务,如SurfaceFlinger,SensorService等,在第二阶段则启动一系列的J ...

  8. Android开源框架源码分析:Okhttp

    一 请求与响应流程 1.1 请求的封装 1.2 请求的发送 1.3 请求的调度 二 拦截器 2.1 RetryAndFollowUpInterceptor 2.2 BridgeInterceptor ...

  9. android hardware.c 源码分析

    android的jni通过ID来找hal模块,使用了hw_get_module()函数,本文就通过这个函数的来分析一下hal层的模块是如何匹配的. 首先要了解三个结构体hw_module_t,hw_m ...

随机推荐

  1. bzoj4946: [Noi2017]蔬菜 神烦贪心

    题目链接 bzoj4946: [Noi2017]蔬菜 题解 挺神的贪心 把第次买的蔬菜拆出来,记下每种蔬菜到期的日期,填第一单位蔬菜比其他的要晚 按价格排序后,贪心的往前面可以填的位置填就可以了.找可 ...

  2. look-into-oracle-redo

    https://fritshoogland.wordpress.com/2018/02/05/a-look-into-oracle-redo-part-2-the-discovery-of-the-k ...

  3. OKHttpUtil工具类

    导入jar包下载链接 http://square.github.io/okhttp/ package com.common.util; import java.io.IOException; impo ...

  4. OS面试题(转载)

    转载自:http://placement.freshersworld.com/power-preparation/technical-interview-preparation/os-intervie ...

  5. GraphQL入门1

    1. 资源: 主站: https://graphql.org/ 中文站: http://graphql.cn 入门视频: https://graphql.org/blog/rest-api-graph ...

  6. 把tree结构数据转换easyui的columns

    很多时候我们的datagrid需要动态的列显示,那么这个时候我们后台一般提供最直观的数据格式tree结构.那么需要我们前端自己根据这个tree结构转换成easyui的datagrid的columns. ...

  7. 教育单元测试mock框架优化之路(中)

    转载:https://sq.163yun.com/blog/article/169564470918451200 三.间接依赖的bean的mock替换 对于前面提供的@Mock,@Spy+@Injec ...

  8. jsp使用c:forEach报错 javax.servlet.jsp.PageContext.getELContext()Ljavax/el/ELContext的问题

    今天发现了一个折磨我一天的问题: 在jsp文件中使用 <c:forEach items="${checkResult}" var="item"> & ...

  9. HTML解析库Gumbo简单使用记录

    目录 Gumbo简介 使用记录 1.GumboNode的类型 2.简单的使用 Gumbo简介 Gumbo是谷歌开源的一个纯C编写的HTML解析库,性能很好,就是用起来比较麻烦. github地址htt ...

  10. nginx启动常遇到的问题

    问题1: nginx: [emerg] open() "/opt/soft/nginx/mime.types" failed (2: No such file or directo ...