实现一个网易云音乐的 BottomSheetDialog,程序员必学之一

2021年09月15日 阅读数:1
这篇文章主要向大家介绍实现一个网易云音乐的 BottomSheetDialog,程序员必学之一,主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。

博客:http://www.cnblogs.com/linguanh/git

GitHub : https://github.com/af913337456/程序员

腾讯云专栏: https://cloud.tencent.com/developer/user/1148436/activitiesgithub


[Github 开源地址](面试

)markdown

目录

  • 前序
  • 直观对比下 gif 效果
    • Android SDK 自带的 BottomSheetDialog
    • 网易云音乐 的 BottomSheetDialog
    • 我开源 的仿网易云音乐 BottomSheetDialog
  • 核心代码简述

前序:

由于APP 须要参照网易云音乐的 BottomSheetDialog 的效果,找了一圈没找到,因此动手写了一个,涉及圈子里常常露面的知识点有下面三点,也是个实战应用。固然,也能够把它当作一个典型的事件分发综合教例。架构

  • 事件分发系列的--冲突处理 & 分发顺序
  • View 绘制流程的--Measure 模式
  • 相对屏幕取 View 的坐标

先来直观对比下 gif 效果

  • 首先是-- Android SDK 自带的 BottomSheetDialog
  • 而后是--网易云音乐 的 BottomSheetDialog
  • 最后是--我开源 的仿网易云音乐 BottomSheetDialog

首先是-- Android SDK 自带的 BottomSheetDialog

下面的 gif 图是一个Android SDK 自带的 BottomSheetDialog 内部加了 RecyclerView 列表控件的效果ide

实现一个网易云音乐的 BottomSheetDialog,程序员必学之一

能够看出:布局

  • 下滑动做会收起,隐藏掉 dialog
  • 上滑会彻底展开
  • 展开后,才能滑动 RecyclerView 内部

其次学习

  • 若是你内部使用的是 ListView 列表控件,你会发现会有其余奇怪的状况。

而后是--网易云音乐 的 BottomSheetDialog

下面的 gif 图是一个Android 版 网易云音乐BottomSheetDialog效果.net

实现一个网易云音乐的 BottomSheetDialog,程序员必学之一

能够看出:

  • 下滑动做会有范围回弹,也就是下滑到必定距离才会收起,隐藏掉 dialog
  • 上滑不给展开
  • 可以在半展开的状况下,内嵌滑动列表控件,例如 listView
  • 和列表控件滑动不冲突,在列表控件滑尽的时候,能够下滑隐藏dialog

最后是--我开源 的仿网易云音乐 BottomSheetDialog

实现一个网易云音乐的 BottomSheetDialog,程序员必学之一

能够看出,效果和网易云的同样

核心代码简述

SDK 的 BottomSheetDialog 内部布局的结构以下:

--FrameLayout
--|--CoordinatorLayout
--|--|--FrameLayout
--|--|--|--Our ContentView // 最后是咱们设置的 ContentView 

CoordinatorLayout 在 Action_Move 事件时,必要的时候对其子 View 进行事件拦截,因此有第一个 gif 看到的效果,具体不详说。

第一个步骤 --- 防止 CoordinatorLayoutOur ContentView 拦截事件

这里使用 ListView 作例子,设置onTouch,在内部作适当时候的适当阻止CoordinatorLayout 拦截事件。


// ListView
setOnTouchListener(
    new OnTouchListener() {
        @SuppressLint("ClickableViewAccessibility")
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            if (bottomCoordinator == null)
                return false;
            // 拿出当前列表第一个可见 item 的 pos
            int firstVisiblePos = getFirstVisiblePosition();
            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:

# 总结

Android架构学习进阶是一条漫长而艰苦的道路,不能靠一时激情,更不是熬几天几夜就能学好的,必须养成平时努力学习的习惯。**因此:贵在坚持!**

上面分享的字节跳动公司2021年的面试真题解析大全,笔者还把一线互联网企业主流面试技术要点整理成了视频和PDF(实际上比预期多花了很多精力),包含知识脉络 + 诸多细节。
![](https://s2.51cto.com/images/20210912/1631459576540726.jpg)

**[CodeChina开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》](https://ali1024.coding.net/public/P7/Android/git)**

**【Android高级架构视频学习资源】**

Android部分精讲视频领取学习后更加是如虎添翼!进军BATJ大厂等(备战)!如今都说互联网寒冬,其实无非就是你上错了车,且穿的少(技能),要是你上对车,自身技术能力够强,公司换掉的代价大,怎么可能会被裁掉,都是淘汰末端的业务Curd而已!现现在市场上初级程序员泛滥,这套教程针对Android开发工程师1-6年的人员、正处于瓶颈期,想要年后突破本身涨薪的,进阶Android中高级、架构师对你更是如鱼得水,赶快领取吧!