前段时间模仿网易云音乐UI使用DataBinding做了一个App:CloudReader,今天把其中的类似歌单详情页单独拿出来说一下,我觉得其中还是有些干货的,关联到的知识点还比较有价值,而且也有很多需要注意的地方。

效果图对比:

网易云音乐App原图:

模仿的效果图:

建议大家直接看CloudReader项目应用里的效果,里面的内容部分有加载中的loading图,效果更逼真。

基本布局:

FrameLayout

—– MyNestedScrollView // 为了Api23下的滑动兼容

—- LinearLayout // 内容部分

—– RelativeLayout

—- ImageView // Toolbar后面的背景图

—- Toolbar // 标题栏

由于篇幅原因,不能做详细的介绍,这里就简单介绍实现这种效果的思路:

实现思路:

1、Activity设置自定义Shared Element切换动画

2、透明状态栏(透明Toolbar,使背景图上移)

3、Toolbar底部增加和背景一样的高斯模糊图,并上移图片(为了使背景图的底部作为Toolbar的背景)

4、上下滑动,通过NestedScrollView拿到移动的高度,同时调整Toolbar的背景图透明度

1、Activity设置自定义元素共享切换动画

大家可以发现页面跳转时图片移动的是一个曲线路径,我们可以定制View的过渡切换效果,这是Material Design中比较常见的用法,Api21以上才有效。需要在开启页面时使用ActivityOptions.makeSceneTransitionAnimation(),其中定义共享的view和transitionName。然后在对应的Activity里创建ArcMotion对象。ArcMotion是PathMotion子类,是个曲线路径,对应代码片:

// Activity设置自定义 Shared Element切换动画

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {

//定义ArcMotion

ArcMotion arcMotion = new ArcMotion();

arcMotion.setMinimumHorizontalAngle(50f);

arcMotion.setMinimumVerticalAngle(50f);

//插值器,控制速度

Interpolator interpolator = AnimationUtils.loadInterpolator(this, android.R.interpolator.fast_out_slow_in);

//实例化自定义的ChangeBounds

CustomChangeBounds changeBounds = new CustomChangeBounds();

changeBounds.setPathMotion(arcMotion);

changeBounds.setInterpolator(interpolator);

changeBounds.addTarget(binding.include.ivOnePhoto);

//将切换动画应用到当前的Activity的进入和返回

getWindow().setSharedElementEnterTransition(changeBounds);

getWindow().setSharedElementReturnTransition(changeBounds);

}

// 开启

Intent intent = new Intent(context, MovieDetailActivity.class);

intent.putExtra("bean", positionData);

ActivityOptionsCompat options =

ActivityOptionsCompat.makeSceneTransitionAnimation(context,imageView, CommonUtils.getString(R.string.transition_book_img));//与xml文件对应

ActivityCompat.startActivity(context, intent, options.toBundle());

值得注意的是:因为加载图片要一点时间,切换页面时就会出现闪烁的情况,而如果取的是缓存就不会有这样的问题,所以这里有个小技巧,就是起初Glide加载的图片就指定固定的大小(.override(120,120)),这样图片就会被缓存起来,等到跳转时就取缓存。具体还请大家看项目源码。

2、透明状态栏

// 为头部是View的界面设置状态栏透明

StatusBarUtil.setTranslucentImageHeader(this, 0, binding.titleToolBar);

其中内容根布局不要设置android:fitsSystemWindows="true",这样会额外添加一个状态栏。其中StatusBarUtil,是一个为Android App 设置状态栏的工具类。这里向大家推荐郭霖大神的一篇文章:Android状态栏微技巧,带你真正理解沉浸式模式,里面讲解了透明状态栏和沉浸式状态栏的渊源和有关设置用法。

3、Toolbar的背景图

仔细分析后发现网易云音乐的Toolbar的背景其实显示的是高斯模糊图的底部,所以这里基本套路是Toolbar是透明的,后面背景图取的是高斯模糊图的底部一部分。

调整Toolbar背景图位置

// Toolbar的高度

int toolbarHeight = binding.titleToolBar.getLayoutParams().height;

// Toolbar+状态栏的高度

final int headerBgHeight = toolbarHeight + StatusBarUtil.getStatusBarHeight(this);

// 使背景图向上移动到图片的最底端,保留Toolbar+状态栏的高度

binding.ivTitleHeadBg.setVisibility(View.VISIBLE);

ViewGroup.LayoutParams params = binding.ivTitleHeadBg.getLayoutParams();

ViewGroup.MarginLayoutParams ivTitleHeadBgParams = (ViewGroup.MarginLayoutParams) binding.ivTitleHeadBg.getLayoutParams();

int marginTop = params.height - headerBgHeight;

ivTitleHeadBgParams.setMargins(0, -marginTop, 0, 0);

binding.ivTitleHeadBg.setImageAlpha(0);

显示Toolbar背景图

监听图片显示,在显示之后将其设置为透明色,然后在滑动的时候渐变。这里值得注意的是在设置图片时不要设置加载中的图片,不然初始化时达不到透明的效果。

// 高斯模糊背景,加载后将背景设为透明

Glide.with(this).load(NeteasePlaylistActivity.IMAGE_URL_MEDIUM)

//.placeholder(R.drawable.stackblur_default)

.error(R.drawable.stackblur_default)

.bitmapTransform(new BlurTransformation(this, 14, 3))// 设置高斯模糊

.listener(new RequestListener() {//监听加载状态

@Override

public boolean onException(Exception e, String model, Target target, boolean isFirstResource) {

return false;

}

@Override

public boolean onResourceReady(GlideDrawable resource, String model, Target target, boolean isFromMemoryCache, boolean isFirstResource) {

// Toolbar背景设为透明

binding.titleToolBar.setBackgroundColor(Color.TRANSPARENT);

// 背景图初始化为全透明

binding.ivTitleHeadBg.setImageAlpha(0);

binding.ivTitleHeadBg.setVisibility(View.VISIBLE);

return false;

}

}).into(binding.ivTitleHeadBg);

其中引入的库应为如下,将官方Glide的额外扩展了,使其可以支持高斯模糊。

compile 'jp.wasabeef:glide-transformations:2.0.1'

4、上下滑动,渐变背景图透明度

由于NestedScrollView滚动监听只能在API23以上才能使用,这里为了兼容需要额外处理,定义滚动接口,具体:MyNestedScrollView

/** * 根据页面滑动距离改变Header透明度方法 */

private void scrollChangeHeader(int scrolledY) {

if (scrolledY < 0) {

scrolledY = 0;

}

float alpha = Math.abs(scrolledY) * 1.0f / (slidingDistance);

Drawable drawable = binding.ivTitleHeadBg.getDrawable();

if (drawable != null) {

if (scrolledY <= slidingDistance) {

// title部分的渐变

drawable.mutate().setAlpha((int) (alpha * 255));

binding.ivTitleHeadBg.setImageDrawable(drawable);

} else {

drawable.mutate().setAlpha(255);

binding.ivTitleHeadBg.setImageDrawable(drawable);

}

}

}

这样基本的效果就实现啦,其中如有需要还可以做些额外的处理,如当背景图不透明时切换标题等~

参考资料

总结

本人思考并实践了很多实现这个页面的方法,目前为止这个方案是最好的,效果体验几乎是一样,其中涉及到的知识点有:1、页面跳转共享元素曲线动画;2、透明状态栏;3、Glide监听图片加载状态和加载固定大小图片等;4、NestedScrollView在Api23下的滑动兼容。如果有更好的方案还请联系我,本次项目的源代码:https://github.com/youlookwhat/ScrollShapeUI。

音乐歌单Android,[CloudReader]Android - 仿网易云音乐歌单详情页相关推荐

  1. 音乐歌单Android,仿网易云音乐歌单界面 Header滑动效果

    这是我的第一篇博客,做Android 开发2年多以来,曾经也有过写一些技术博客的想法,但因为有时候因为懒,有时候工作忙加班多而力不从心,所以迟迟没有开始写自己的博客.最近正好工作不忙,想写一些博客,记 ...

  2. 仿网易云android界面,Android - 仿网易云音乐歌单详情页

    前段时间模仿网易云音乐UI使用DataBinding做了一个App:CloudReader,今天把其中的类似歌单详情页单独拿出来说一下,我觉得其中还是有些干货的,关联到的知识点还比较有价值,而且也有很 ...

  3. 歌单助手:一键导出网易云音乐歌单列表,推荐你喜爱的专辑

    苏生不惑第191 篇原创文章,将本公众号设为星标,第一时间看最新文章. 关于网易云音乐之前写过很多文章了,有兴趣可以点击阅读: 那些你可能不知道的网易云音乐奇技淫巧 不想下载那么多音乐软件?全网音乐在 ...

  4. 音乐歌单Android,LitePager(仿网易云音乐-歌单广场效果)

    LitePager,一个轻量级的ViewPager,仿新版网易云歌单广场 使用方式: 添加依赖: implementation 'com.wuyr:litepager:1.0.0' APIs: Met ...

  5. Android自定义view之网易云推荐歌单界面

    系列文章目录 Android自定义view之网易云推荐歌单界面 文章目录 系列文章目录 前言 一.实现 1.自定义一个圆角图片控件(也可直接使用第三方框架) 2.进行布局摆设 3.图片切换动画效果 二 ...

  6. 网易云音乐歌单生成外链播放器

    (一)自己创建的歌单没有生成外链选项的解决方法 解决方法: 1.分享歌单 2.打开分享界面的歌单链接 3.打开歌单即可看到生成外链的点击链接 (二)网易云音乐歌单因为版权原因无法生成外链的解决方法 1 ...

  7. Python数据分析初探项目 基于Python数据可视化的网易云音乐歌单分析系统 大学编程作业(TUST 天津科技大学 2022年)

    Python 数据分析初探项目 基于 Python 数据可视化的网易云音乐歌单分析系统 大学编程作业(TUST 天津科技大学 2022 年) Python 数据分析初探项目 基于 Python 数据可 ...

  8. selenium切换iframe框架案例——翻页爬取网易云音乐歌单作者和名称

    翻页爬取网易云音乐歌单作者和标题 案例目的: 通过翻页selenium操作网易云音乐,介绍如何切换iframe框架以及如何使用selenium定位数据所在的节点. 代码功能: 输入下载的数据页数,自动 ...

  9. 用python爬取网易云音乐歌单列表

    本文分为两个部分:基础知识和正文,其中基础知识包括什么正则表达式以及Beautifulsoup4的使用. 一.正则表达式 正则表达式用于字符串查找.合法性检查以及作为程序员的工具箱使用. 字符串查找: ...

最新文章

  1. 一条 update 语句引起的事故,这回让开发长长记性!!
  2. ctimespan 获取毫秒_VC++中通过CTime类获取日期差
  3. Java黑皮书课后题第7章:7.14(计算gcd)编写方法,返回个数不确定的整数的最大公约数。编写一个测试程序,提示用户输入5个数字,调用该方法找出这些数的最大公约数,并显示这个最大公约数
  4. python从文件初始化失败_iOS 6:libpython2.7.a初始化导入错误
  5. windows7快捷键
  6. 软工作业 评价输入法
  7. Android Studio实现前后台分离的选课系统
  8. 数据库基础(2):简单查询和连接查询
  9. LeeCode 130 DFS
  10. python透明图片合并_Python用OpenCV合并图片,添加透明部分
  11. 我要多开梦幻手游PC端(梦幻手游PC端多开的简单分析及实现办法)
  12. 第十届蓝桥杯大赛个人赛省赛(软件类本科B组)做题笔记Partial
  13. linux 性能分析工具perf
  14. java 判断cmyk_JAI ImageIO的纯Java替代品,用于检测CMYK图像
  15. 什么时间吃nmn比较好,nmn服用产生效果和时间,请正确认识
  16. 【iOS】录音和音频合成
  17. 临近毕业,图像类SCI源刊哪本审稿快?
  18. 进击高手【第十二期】并查集
  19. 简单易懂且有趣的pycharm运行小游戏
  20. php四则运算出题器_php 四则运算

热门文章

  1. C++笔记 关于string的笔记
  2. cmd.exe启动参数详解
  3. c语言数学作业及答案,2004年9月全国计算机等级考试二级C语言笔试试题及答案...
  4. 守护客户数据价值:企业级NewSQL HTAP分布式云TBase架构详解
  5. 用PYTHON做一个简单的游戏脚本(基础,详细)
  6. DigiCert和GlobalSign单域名OV SSL证书对比评测
  7. JAVA音视频解决方案----视频基础知识
  8. 资产管理之RFID资产管理系统解决方案-RFID资产智能盘点-新导智能
  9. Android自动化测试工具调研
  10. wx.createSelectorQuery() 获取节点信息 获取不到解决方法