前言:自定义侧滑控件是一直是很多在app端的软件用的比较多的方式,本文来自

Mero技术博客授权本公众号独家发布文章,Mero技术博客blog地址:http://blog.csdn.net/qq_21004057,点击“阅读原文”,可看Mero技术博客其他文章。话不多说,我们看正文:

今天咱们来实现一个侧滑效果,简单而又轻巧。大家下载源码,直接参照源码,使用非常简单。我就不上传github,如果大家有需要的话,请在下面留言,给大家打包成类库。

大家知道侧滑菜单非常流行,包括现在的QQ侧滑菜单,酷狗的缩放动画的侧滑菜单,都是非常棒的。这个侧滑控件还是能满足大多数实际项目需求的。如果说简单而又有内涵,是不是霸气呢?我们现在就开始学习如何去自己写一个。效果图如下。

先带大家了解一下题外内容。大家知道什么是子节点,父节点吗?知道的话,本段可以略过了。其实这个说一下,是为了后面做铺垫的。在DDMS工具中,有个工具叫做Hierarchy。

,这个工具在哪呢?其实就在我们的DDMS界面。

大家看右图的右侧,就是这个界面的布局节点。节点的英文单词叫做node。

ok,了解了上面的内容之后,咱们就可以正式开始我们的侧滑项目了。

我们要实现侧滑,那么我们该继承哪个类呢?其实大家可以从View继承,不过太麻烦了。那么我们可以继承一个已经实现了滚动的控件HorizontalScrollView

我们先来看下侧滑的实质是什么样的,请允许我自画一个略显丑陋的图吧。

最外层其实就是一个HorizontalScrollView,里面包含了Menu布局界面和主界面。

1

自定义HorizontalScrollView

注意:实现第二个带有2个参数的构造方法,为什么实现第二个呢?当我们不需要定义新的属性的时候,我们只需要实现带有2个参数的构造方法。

public class SlidingMenu extends HorizontalScrollView{

public SlidingMenu(Context context, AttributeSet attrs) {

super(context, attrs);

}

}

2

主界面、菜单页布局文件

main.xml就是一个图片,具体的大家根据项目实际写。menu菜单代码如下:

随后,我们可以把这两个界面插入到HorizontalScrollView自身的布局中去,也就是我们项目自动生成的activity_main.xml布局。

大家注意了,menu菜单仅仅是左边的,还有部分显示的是主界面的。这个在后面的代码里会实现。

3

得到屏幕宽度并完善SlidingMenu

我们首先得到屏幕的宽度。为了后面的计算Menu菜单和主界面布局宽度作为铺垫。

在拿到了屏幕的宽度之后,我们就可以来计算menu菜单界面和主界面分别在屏幕中的宽度了。

我们很容易想到,总的宽度就是menu菜单加上主界面的宽度。我们可以清楚地看到menu菜单的宽度有个padding边距。这个右边距我设置的是100。感觉还可以。

    menu菜单页宽度 = 屏幕宽度 - 右边距

   主界面宽度 = 屏幕宽度

上面式子大家应该看懂了吧!看懂了就好办。

4

计算并重写onMeasure方法

getChildAt(int index)这个方法可以得到子节点,这里我们先得到父LinearLayout布局,再根据getChildAt方法得到子view的布局。

可能大家会问,为什么要这样得到2个view呢,其实ViewGroup是view的子类。通过上面的DDMS中的树形图可以很好的明白。我们可以知道这2个LinearLayout是同一级别的,都是在父LinearLayout节点的下面。

这样我们就实现了上图的效果,可实际上效果是这样吗?不好意思,到这里,我们虽然可以滑动,但是滑动起来可能不流畅。

怎么办呢?

这个时候,我们需要实现手势动作的监听

当我们向右边滑动的时候,主布局要隐藏大半部分,只留下了右边距宽度的可视,其他的都在不可视范围内。并不代表消失

5

初始化渲染布局

最后,我们需要初始化渲染布局位置。请注意了,初始化的时候我们的menu菜单完全隐藏,只留下主界面布局可视。所以我们需要重写onLayout方法。

6

SlidingMenu缩放动画及手势监听

在上文中,我们实现了普通的侧滑项目,继续完善上文。这个效果是仿QQ5.0和酷狗侧滑特效的。使用的话大家下载源码看demo,页很简单。同样,不上传github了。使用请下载源码直接复制进你的项目。

请把主界面的背景图片改成你自己的布局xml文件,使用include包含进去。include导入的主界面请使用LinearLayout父布局。

具备非常强的视觉差特效。

我们来回顾下上文中的内容。

  • 计算屏幕宽度

  • 计算menu菜单界面和主界面宽度

  • 设置触摸事件监听(onTouchEvent)

  • 设置初始布局位置(onLayout)

在了解上文内容之后,咱们现在加以拓展。咱们的目标效果是下面这样。

在上面这个效果图,我们可以看见有缩放动画,有透明度变化,有平移动画。

咱们的思路是怎么样的呢?咱们只需要在上篇基础上加上滚动事件监听。不过需要注意的是,计算缩放的进度技巧。

目前的动画效果的有scale,translate,rotate旋转等,还有透明度Alpha动画以及渐变动画等。咱们今天只用到了scale缩放和translate平移和透明度alpha变化。

我们需要导入一个快捷的View动画的帮助工具类,这个百度可以随便搜到,叫做nineoldandroids.jar。到最后我会提供给大家下载。里面的ViewHelper封装了动画帮助的方法。

ok,我们需要充写的方法是onScrollChanged方法。缩放进度怎么计算呢? 其实很简单,我们首先看到onScrollChanged(int l, int  t, int  oldl, int  oldt);这个方法,这个方法里面的参数

  1. l当前的水平滚动位置

  2. t当前的垂直滚动位置

  3. oldl之前的水平滚动位置

  4. oldt之前的垂直滚动位置

缩放的scale参数最大值是1,那么咱们随着手指的滑动缩放应该是多少好呢?

通过当前水平滚动的位置,我们可以得到缩放进度,即水平滚动的距离 / 总距离。而菜单页的总距离就是mMenuWidth。两者的比值就可以当做一个进度值。那么缩放的比例scale就等于1X进度。我们知道这些,于是我们可以将缩放的比例设置在0.7到1之间,scale缩放比例 = 0.7+0.3X进度比例 。然后透明度呢?我们可以同样采用这种方法进行设置,alpha透明度 = 0.8+0.2X进度比例,这个可以通过实际测试而定。

ViewHelper类是nineoldandroidsjar里面的,从上面看起来使用起来还是非常方便的。

加上上面的onScrollChanded方法,咱们以及实现了缩放等动画效果。那么我们要想更加精确地计算及得到更好体验的滑动效果,还需要在手势监听中计算。

当手势滑动的距离小于屏幕宽度的五分之一时候,我们滑不到预期位置,相反,我们可以滑动到预期位置。那么如何实现呢? 这个地方我采用的方式是通过判断menu菜单界面是否隐藏来作为判断值。

boolean flag = false;//用来标志菜单界面不可见

我们重写一下onTouchEvent方法。首先,我们得到按下的坐标位置,然后再得到松开的坐标位置,假设松开的横坐标为X2,按下时候的横坐标为X1.如果X2 - X1>0,就说明了向右滑动,反之,向左移动。那么我们可以对其绝对值进行判断,如果大于某个定值,就能滑到预期位置。小于就停在原位置

我们先声明一个标志来判断菜单界面是否可视,默认初始化是不可见的,所以设置为false。


具体代码如下:


好了,到这为止,咱们就完成了整个仿酷狗和QQ5.0集成控件。

最后提供给大家源码下载。

源码下载:http://download.csdn.net/detail/qq_21004057/9639121

第一时间获得博客更新提醒,以及更多android干货,源码分析,欢迎关注我的微信公众号,扫一扫下方二维码或者长按识别二维码,即可关注。

打造狂拽炫酷的主流自定义侧滑控件(仿酷狗和QQ5.0)相关推荐

  1. 安卓自定义日期控件(仿QQ,IOS7)

    还记得上篇:高大上的安卓日期时间选择器,本篇是根据上篇修改而来,先看下qq中日期选择的效果: 鉴于目前还没有相似的开源日期控件,因此本人花费了一些时间修改了下之前的日期控件,效果如图: 虽说相似度不是 ...

  2. 安卓自定义日期控件(仿QQ,IOS7)续

    本篇是在原来的基础上修改了界面效果,使其更加接近ios7,qq等日期选择控件,看图: 源码地址:http://download.csdn.net/detail/baiyuliang2013/87601 ...

  3. (升级版)构建狂拽炫酷屌的MySQL监控平台

    作者:罗小波,<千金良方--MySQL性能优化金字塔法则>作者之一. 熟悉MySQL体系结构,擅长数据库的整体调优,喜好专研开源技术,并热衷于开源技术的推广,在线上线下做过多次公开的数据库 ...

  4. 大数据不是你想有就能有,如何才能“狂拽炫酷吊炸天”

    如今,大数据正成为了各大企业都争相推拥的热词,其发展的如火如荼,迅疾如风,猛烈似火.从互联网领域的BAT到各类智能硬件,几乎所有的企业都正在谈大数据. 在这样一股大数据的洪流之下,专门做大数据分析的公 ...

  5. 京东电器“220V带电新人类”:找寻狂拽炫酷吊炸天的科技感

    忽如一夜春风来,进入2018年,各大电商公司开的实体店已蔚然成风,遍地开花之下,究竟这些实体店有何魅力吸引到用户?各家到底做得如何? 没有体验就没有发言权. 于是乎,就在昨日(10月27日),北京市朝 ...

  6. C语言小项目之“究极无敌螺旋丸极爆炸狂拽炫酷五彩棒的”通讯录之*派小猩*作品

    C语言小项目之"究极无敌螺旋丸极爆炸狂拽炫酷五彩棒的"通讯录之派小猩作品 项目概述 基于C语言开发一个多功能的通讯录 功能目录 1.增加 2.删除 3.查找 4.修改 5.显示 6 ...

  7. Photoshop和WPF双剑配合,打造炫酷个性的进度条控件

    现在如果想打造一款专业的App,UI的设计和操作的简便性相当重要.UI设计可以借助Photoshop或者AI等设计工具,之前了解到WPF设计工具Expression Blend可以直接导入PSD文件或 ...

  8. java自定义日历控件_【无私分享】修订版干货!!!一个炫酷的自定义日历控件,摆脱日历时间选择烦恼,纯福利~...

    可能不少的小伙伴都有看楼主昨天发的自定义日历控件,虽然实现功能不多,但也还算将就吧. 但是看了的小伙伴就很心急了,说楼主上传到gitHub的东西有问题,楼主下载来看了看,基本都没问题吧,没弄好的小伙伴 ...

  9. 【无私分享】修订版干货!!!一个炫酷的自定义日历控件,摆脱日历时间选择烦恼,纯福利~...

    可能不少的小伙伴都有看楼主昨天发的自定义日历控件,虽然实现功能不多,但也还算将就吧. 没有看的小伙伴如果有兴趣的话可以去看看:http://www.cnblogs.com/liushilin/p/57 ...

  10. Android插件化开发指南——实践之仿酷狗音乐首页(自定义ImageView控件)

    文章目录 1. 前言 2. 基础环境--实现RecyclerView的网格布局 3. 自定义ImageView 3. 后记 1. 前言 拟定实现效果部分为下图的歌单列表部分,也就是图中红线框出来的部分 ...

最新文章

  1. 论文不必参考任何文献?看到作者,网友大呼失敬了
  2. RAID磁盘阵列——扫盲篇
  3. UVA10341解方程(二分)
  4. cmd52命令发送 mmc_Linux SD/MMC/SDIO驱动分析(新)
  5. Android高效开发:
  6. What's VPC (by quqi99)
  7. python3 django连接mysql 数据库
  8. centos7安装samba遇到的问题
  9. 构建插件式的应用程序框架(四)----服务容器
  10. 关于strcpy的安全函数的选择
  11. apk改之理 java源码_ApkIDE改之理最新版+环境包下载
  12. u盘1kb快捷方式病毒修复_修复“无法为2097152KB对象堆保留足够的空间” JFrog Artifactory启动错误...
  13. Sentinel-哨兵机制
  14. Todd's Matlab讲义第5讲:二分法和找根
  15. win10 的局部截图功能
  16. 新猿木子李:0基础学python培训教程 Python操作Excel之修改数据
  17. gazebo plugins
  18. pta 天梯赛的善良(C语言实现)
  19. Get Request
  20. 财报汇总 | 迪卡侬、飞利浦、霍尼韦尔、3M​、百胜中国等12家企业公布最新业绩

热门文章

  1. linux把test目录打包,linux复制、压缩打包、解压缩等操作
  2. Mybatis 实现MySQL的:无数据插入,有数据更新
  3. ​观点|我离开AI行业的5个理由
  4. xUtils3 图片加载模块
  5. Maven--可选依赖
  6. 来一发,网页下拉刷新
  7. codeforces 463A Caisa and Sugar 解题报告
  8. 全数字FM接收机 --(1)结构
  9. 西游记与面向对象编程
  10. 基于强化学习和析取图模型的统一调度框架