Android--仿QQ侧滑菜单
首先还是先看一下效果图吧,这个示例在网上能找到很多,我主要在此是做一个小结和一些代码的分析,当是自己在学习过程中的一个积累,因为网上同样的文章很多,所以也无法探究最初的来源是哪里了。

我们可以从效果图看出,实际上主界面和菜单是两个图,只是在滑动的过程中,菜单逐渐出现,主界面逐渐消失的过程,能实现这个效果的控件还是比较多的,比如:GirdView、ScrollView等滚动视图控件。在此使用的是HorizontalScrollView。
我们可以通过查看API来了解HorizontalScrollView的基本信息。HorizontalScrollView用于布局的容器,可以放置让用户使用滚动条查看的视图层次结构,允许视图结构比手机的屏幕大. HorizontalScrollView 是一种 框架布局, 这意味着你可以将包含要滚动的完整内容的子视图放入该容器; 该子视图本身也可以是具有复杂层次结构的布局管理器.一般使用横向的 LinearLayout 作为子视图,使用户可以滚动其中显示的条目. HorizontalScrollView 只支持水平方向的滚动。
一、自定义一个类,用来继承HorizontalScrollView。
public class SlidingMenu extends HorizontalScrollView { public SlidingMenu(Context context) {
super(context, null, 0);
} public SlidingMenu(Context context, AttributeSet attrs) {
super(context, attrs, 0); } public SlidingMenu(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
}在完成这个类的创建之后,我们会发现,此处有三个构造方法,所以我们先介绍一下这三个构造方法,对于理解自定义控件也是有帮助的。
1.只有一个参数的构造方法:一般是在java代码创建视图的时候被调用,如果是从xml填充的视图,就不会调用这个.
2.有两个参数的构造方法:这个是在xml创建但是没有指定style的时候被调用。
3.三个参数的构造方法:这个就很容易理解了,是有指定的style的时候被调用。
二、完成布局文件
在一开始的时候说过,该效果的时候就是主界面和菜单两个界面平行排列在HorizontalScrollView布局容器中,当有滑动事件发生的时候再慢慢移动一个,从而显示出另外一个。
所以布局文件的完成就相对比较简单了。
activity_main.xml:(其中涉及到自定义属性的部分在后面讲解)
<com.ithaha.SlidingMenu.SlidingMenu xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/id_menu"
xmlns:tools="http://schemas.android.com/tools"
xmlns:zhy="http://schemas.android.com/apk/res/com.ithaha.SlidingMenu"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:scrollbars="none"
zhy:rightPadding="100dp" > <LinearLayout
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:orientation="horizontal" > <include layout="@layout/layout_menu" /> <LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/qq" > <Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="toggleMenu"
android:text="切换菜单" />
</LinearLayout>
</LinearLayout> </com.ithaha.SlidingMenu.SlidingMenu>layout_menu.xml:
这儿就是一些简单的菜单显示了,由于代码过长且无特别之后就不在此贴出,具体的可以参看源码。
三、完成自定义的类,实现主要功能
在完成之前两个步骤之后,我们可以先运行程序看一下。运行程序后,发现界面已经是可以左右滑动的了,只是效果太差了(效果图如下),所以我们需要重写一些方法来使界面更加的美观合理了。
![]()
从刚才运行的效果图可以看到,界面图片大小和屏幕尺寸有明显的不搭配,所以我们首先需要重写的第一个方法是:
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
评估视图及其内容,以决定其宽度和高度.此方法由
measure(int, int)调用,子类可以重载以提供更精确、更有效率的衡量其内容尺寸的方法protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
/**
* 显示的设置一个宽度
*/
if (!once) {
// 返回指定位置的视图。
LinearLayout wrapper = (LinearLayout) getChildAt(0);
ViewGroup menu = (ViewGroup) wrapper.getChildAt(0);
ViewGroup content = (ViewGroup) wrapper.getChildAt(1); // 菜单的宽度 = 屏幕的宽度 - 需要所留出来的边界
mMenuWidth = mScreenWidth - mMenuRightPadding;
// 菜单宽度的一半
mHalfMenuWidth = mMenuWidth / 2;
// 重新加载宽度
menu.getLayoutParams().width = mMenuWidth;
content.getLayoutParams().width = mScreenWidth; }
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}由于只是定义了mMenuRightPadding(菜单界面所需要距离右边界的距离),但是没有实际给值,所以现在的程序运行出来,只是两个完整的界面,如果给mMenuRightPadding赋值以后,那么就会有一个较好的效果了。但是由于mMenuRightPadding我们把它设置成为了一个自定义属性,所以在此也就顺便复习一下自定义属性的使用了。
自定义属性的简单使用:
1.需要在布局文件中先声明出一个命名空间:xmlns:ithaha="http://schemas.android.com/apk/res/com.ithaha.SlidingMenu"
xmlns : XML命名空间的缩写,为固定格式。
ithaha:属性名的前缀。就如我们使用控件自带属性一样,属性名字前面有一个android:
http://schemas.android.com/apk/res/ : 为固定格式
com.ithaha.SlidingMenu:所加载属性的包名
2.在res/values/下新建一个attrs.xml的文件
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- 声明属性集的名称 -->
<declare-styleable name="SlidingMenu"> <!-- 声明一个属性 name是rightPadding 类型是 dimension-->
<attr name="rightPadding" format="dimension"/> </declare-styleable>
</resources>3.在.java文件中加载出属性(见源码)
4.在布局文件中使用。
四、最终功能的完善
完成之前三个步骤之后,能达到一个基本的效果了,但是界面的切换是自己在屏幕上滑动了多少距离,界面就切换多少,使用起来不是很方便,所以我们在此继续改善。
public boolean onTouchEvent(MotionEvent ev) {
int action = ev.getAction();
switch (action) {
// Up时,进行判断,如果显示区域大于菜单宽度一半则完全显示,否则隐藏
case MotionEvent.ACTION_UP:
int scrollX = getScrollX();
if (scrollX > mHalfMenuWidth) {
this.smoothScrollTo(mMenuWidth, 0);
isOpen = false;
} else {
this.smoothScrollTo(0, 0);
isOpen = true;
}
return true;
}
return super.onTouchEvent(ev);
}通过判断手指在屏幕上滑动的距离,然后直接将界面进行相应的移动就能达到我们想要的效果了。
五、源码下载
Android--仿QQ侧滑菜单的更多相关文章
- iOS仿QQ侧滑菜单、登录按钮动画、仿斗鱼直播APP、城市选择器、自动布局等源码
iOS精选源码 QQ侧滑菜单,右滑菜单,QQ展开菜单,QQ好友分组 登录按钮 3分钟快捷创建高性能轮播图 ScrollView嵌套ScrolloView(UITableView .UICollecti ...
- 仿QQ侧滑菜单<大自然的搬运工-代码不是我的>
1.记录下效果图 2.二个工具类 package myapplication.com.myapplicationfortest.utils; import android.util.Log; /** ...
- 如鹏网仿QQ侧滑菜单:ResideMenu组件的使用笔记整理+Demo
ResideMenu菜单 课堂笔记: https://github.com/SpecialCyCi/AndroidResideMenu Github:如何使用开源组件1. 下载 下载方式: 1. 项目 ...
- android开发学习 ------- 仿QQ侧滑效果的实现
需要做一个仿QQ侧滑删除的一个效果: 一开始是毫无头绪,百度找思路,找到 https://blog.csdn.net/xiaxiazaizai01/article/details/53036994 ...
- Android仿QQ ios dialog,仿QQ退出向上菜单
Android仿QQ ios dialog,仿QQ退出向上菜单 EasyDialog两种模式 仿QQ退出向上菜单,自己定义向上菜单 github地址:https://gith ...
- 自定义控件?试试300行代码实现QQ侧滑菜单
Android自定义控件并没有什么捷径可走,需要不断得模仿练习才能出师.这其中进行模仿练习的demo的选择是至关重要的,最优选择莫过于官方的控件了,但是官方控件动辄就是几千行代码往往可能容易让人望而却 ...
- 再造 “手机QQ” 侧滑菜单(三)——视图联动
代码示例:https://github.com/johnlui/SwiftSideslipLikeQQ 本 文中,我们将一起使用 UINavigationController 来管理主视图,并实现点击 ...
- Android 仿QQ首页的消息和电话的切换,首页的头部(完全用布局控制)
Android 仿QQ首页的消息和电话的切换,首页的头部(完全用布局控制) 首先贴上七个控制布局代码 1.title_text_sel.xml 字体颜色的切换 放到color文件夹下面 <?xm ...
- Android之自定义侧滑菜单
先来上图: 我们把主界面从左向右拉动,可以看到地下有一层菜单页,从透明渐渐变得不透明,从小渐渐变大,感觉上觉得菜单页是从屏幕外面被拉到屏幕中的.下面的代码实现这个DEMO: 首先是自定义控件Slidi ...
- android仿QQ的SlideMenu
这其实很简单就可以实现,只需要自定义一个View继承自HorizontalScrollView 1,新建一个项目,再新建一个MySlideMenu继承HorizontalScrollView publ ...
随机推荐
- 树莓派加入定时任务实现花生壳定时重启(linux的定时任务)
由于花生壳在linux下不稳定,联系开机一个星期左右会挂掉,所以要使用定时任务实现每小时刷新一次/启动一次. 使用的是linux下的定时任务crontab去实现. 实现步骤: 1.编辑/etc/cro ...
- C#自定义控件的开发:Pin和Connector
C#自定义控件的开发:Pin和Connector 2009-08-03 14:46 wonsoft hi.baidu 我要评论(0) 字号:T | T 本文介绍了如何使用智能设备扩展C#自定义控件. ...
- ArcGIS10的GDB文件解析(初步)
早就应该写一写关于esri的一些改变 参考http://resources.arcgis.com/zh-cn/help/main/10.1/index.html#//006z000000tr00000 ...
- 线程暴长~Quartz中创建Redis频繁后导致线程暴长
在最近项目开发过程中,在进行任务调度处理过程中,出现了一个问题,它的线程数暴长,从20多个可以到1000多个,如果你的服务器性能好的话,可以到10000多个,太恐怖了,就算你的服务再好,早晚有一天也会 ...
- java实现抓取某公司官网新闻
这里先说一下,实习期的一个项目,当时并没有该合作公司的获取新闻的接口,但是项目又急着上线,所以总监就让我来做一个简单的抓取,现将主要的工具类NewsUtil.java贴出来供大家参考. NewsUti ...
- Win7激活后添加grub引导Linux最简单方法
因为Win7(Vista同理)的激活方式是通过grub摸你OEM的Slic信息,所以主引导分区MBR被这个grub占用,以此才能激活WIn7.但是如果想同时安装Linux在别的分区,就会产生问题:gr ...
- S5PV210开发系列四_uCGUI的移植
S5PV210开发系列四 uCGUI的移植 象棋小子 1048272975 GUI(图形用户界面)极大地方便了非专业用户的使用,用户无需记忆大量的命令,取而代之的是能够通过窗体.菜单 ...
- 实时数据采集传输软件LDM配置
本环境一共两个机器:cma.ldm87.gov.cn(hostname)机器作为upstream LDM,cma.ldm84.gov.cn(hostname)机器作为downstream LDM.下面 ...
- perl 变量详解
http://www.perlmonks.org/?node_id=933450 use strict; use Devel::Peek; my $a; Dump($a); $a=4; Dump($a ...
- 【ZZ】大数据架构师基础:hadoop家族,Cloudera系列产品介绍
http://www.36dsj.com/archives/17192 大数据我们都知道hadoop,可是还会各种各样的技术进入我们的视野:Spark,Storm,impala,让我们都反映不过来.为 ...
