QMUI 2 终于来了,真香

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fll9pV71-1630583987798)(https://user-gold-cdn.xitu.io/2019/12/1/16ebd1b59678f50e?imageView2/0/w/1280/h/960/ignore-error/1)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gjq1lpio-1630583987800)(https://user-gold-cdn.xitu.io/2019/12/1/16ebd1b790c544eb?imageView2/0/w/1280/h/960/ignore-error/1)]

Android 10 提供了 Dark Mode 的支持,官方提供了两种实现方式:

  • 一种是在 value-night, drawable-night 放置 Dark Mode 资源。 当 Dark Mode 打开时,Activity会被重新创建, 然后从 *-night 目录读取资源。
  • 另一种是在 AndroidManifest 文件中为 ActivityconfigChanges 加上 uiMode, 不重新重建 Activity, 而走 onConfigurationChanged。在 onConfigurationChanged 里判断当前 uiMode, 然后做自定义处理。

第一种方式就是简单,但是它有两个弊端:

  • Dark Mode 切换时,它需要重建整个 Activity,一般情况还好,你感知不到重建这个过程,但是如果 View 特别大,单单创建 View 就非常耗时了,那么就会明显感知到黑屏(很多产品喜欢把界面逻辑搞得特别复杂,例如 ViewPager 嵌套 ViewPager, 再嵌套 ViewPager, 而且每个 Pager 都还巨复杂)
  • 另外一点就是,既然已经支持一套皮肤,为何不能多支持几套?例如全黑白版(伪墨水屏)

因此,QMUI 推荐采取第二种方式,因此 QMUI 提供了换肤功能的支持,夜间模式只是在 onConfigurationChanged 时调用一下换肤接口而已。 当然,开发者也可以创建 *-night 文件夹,并在里面配置 qmui 的各种 color/drawable 设置,以第一种方式去完成夜间模式的适配。 QMUI 只是将组建资源取值 Attr 化,使用何种方式,都是由使用者自己决定。

常规使用方式, 在 Application.onCreate() 里加入你的 skin 支持项:

QMUISkinManager skinManager = QMUISkinManager.defaultInstance(this);
skinManager.addSkin(1, R.style.app_skin_blue);
skinManager.addSkin(2, R.style.app_skin_dark);
skinManager.addSkin(3, R.style.app_skin_white);
skinManager.changeSkin(isDarkMode ? 2 : 1); 

R.style.app_skin_blueR.style.app_skin_darkR.style.app_skin_white 等就是不同 skin 下的配置, 然后在 Application.onConfigurationChanged 里监听 uiMode 的信息:

if((newConfig.uiMode & Configuration.UI_MODE_NIGHT_MASK) == Configuration.UI_MODE_NIGHT_YES){
    QDSkinManager.changeSkin(QDSkinManager.SKIN_DARK);
}else if(QDSkinManager.getCurrentSkin() == QDSkinManager.SKIN_DARK){
    QDSkinManager.changeSkin(QDSkinManager.SKIN_BLUE);
} 

当然,对于启动 LauncherActivity 的背景,是没有机会走到 QMUI 的换肤机制的,因此要退化到第一种 Dark Mode 的实现方案。

那么业务上我们如何对 View 来设置呢? 有以下方式:

  • 如果你采用的是 xml, 可以通过 QMUI 提供的 qmui_skin_xxx 的设置项来设置你 skin。
  • 如果你想在 java 代码中设置 skin, 那么需要采用 QMUISkinValueBuilder 来构建 value, 再通过 QMUISkinHelper.setSkinValue 来设置,稍显复杂,如果通过是 kotlin 的话,QMUI 提供了 View.skin 方法,可以快速实现。
  • 还有一种尚在开发的方式, 我把它叫做 skin-maker。 目的是可以让设计师通过点点点的方式进行 skin 设置,然后导出一份配置文件,放到工程里,通过字节码注入完成 skin 设置,这样可以将整个配置工作交给设计,不用每做个新业务都要考虑换肤。 理想是美好的,现实是目前做了一个 Demo 版,有兴趣的可以在 QMUIDemo 上体验体验,流程是通的,但还有很多问题没解决。

QMUIPopup 重写

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xLslCmFA-1630583987802)(https://user-gold-cdn.xitu.io/2019/12/1/16ebd1ba11deded7?imageView2/0/w/1280/h/960/ignore-error/1)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nUrq61l9-1630583987805)(https://user-gold-cdn.xitu.io/2019/12/1/16ebd1ba0f5a0192?imageView2/0/w/1280/h/960/ignore-error/1)]

QMUIPopup 之前的实现是比较糟糕的,采用了 .9.png 的方式实现了背景阴影,因为阴影是占位置的,所以边缘距离过大,如果 anchorView 在很边缘的位置,会出现箭头错位或者显示不理想的情况,很多人踩了这个坑,而解约方案只能是提供一个阴影小一点的背景图。

因此,这个版本完全重写了它,采用了 QMUILayout 的方式实现阴影,所以你想完全贴边也是可以的。 除此之外, 2.x 版本提供了 QMUIQuickActionQMUIFullScreenPopup , 前者样式来源于微信读书阅读器的快捷菜单,当然实现不一样(虽然微信读书上的那个也是我写的,但是当年的实现,不忍直视)。 后者可以用于实现微信读书各种想法浮层,去年读书各种浮层兴起,并且还有键盘交互,我算是有一些心得吧,也提取了出来。

一个简单的使用例子:

QMUIPopups.popup(getContext(), QMUIDisplayHelper.dp2px(getContext(), 250))
        .preferredDirection(QMUIPopup.DIRECTION_BOTTOM)
        .view(textView)
        .edgeProtection(QMUIDisplayHelper.dp2px(getContext(), 20))
        .offsetX(QMUIDisplayHelper.dp2px(getContext(), 20))
        .offsetYIfBottom(QMUIDisplayHelper.dp2px(getContext(), 5))
        .shadow(true)
        .arrow(true)
        .animStyle(QMUIPopup.ANIM_GROW_FROM_CENTER)
        .onDismiss(new PopupWindow.OnDismissListener() {
            @Override
            public void onDismiss() {
                Toast.makeText(getContext(), "onDismiss", Toast.LENGTH_SHORT).show();
            }
        })
        .show(v); 

组织形式比以前的舒服多了吧。

更多修改

当然,除了 QMUIPopup 的重写,其它组件也都有很大的改动:

  1. QMUITabSegment 大面积重写,提供了两张图片切换、不同 Tab 不同设置等功能,扩展也更加灵活。
  2. QMUIBottomSheet.BottomListSheetBuilder 添加了很多人期待的居中设置
  3. QMUICommonListItemView 更改父类为 ConstraintLayout, 重写布局,可以设置高度 wrap_content 以支持超长标题或副标题
  4. 提供了 QMUISlider 组件

最后,目前的版本没有经过充分的测试和实践,可能会存在比较多的问题,欢迎大家提 issue 。

文末

好了,今天的分享就到这里,如果你对在面试中遇到的问题,或者刚毕业及工作几年迷茫不知道该如何准备面试并突破现状提升自己,对于自己的未来还不够了解不知道给如何规划,可以来看看同行们都是如何突破现状,怎么学习的,来吸收他们的面试以及工作经验完善自己的之后的面试计划及职业规划。

这里放上一部分我工作以来以及参与过的大大小小的面试收集总结出来的相关的几十套腾讯、头条、阿里、美团等公司21年的面试专题,其中把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分免费分享给大家,主要还是希望大家在如今大环境不好的情况下面试能够顺利一点,希望可以帮助到大家~

还有 高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料 帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。

CodeChina开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》

【Android核心高级技术PDF文档,BAT大厂面试真题解析】

【延伸Android必备知识点】

中…(img-ipjana5o-1630583987806)]

【延伸Android必备知识点】

[外链图片转存中…(img-ZxBIMLAU-1630583987808)]

这里只是整理出来的部分面试题,后续会持续更新,希望通过这些高级面试题能够降低面试Android岗位的门槛,让更多的Android工程师理解Android系统,掌握Android系统。喜欢的话麻烦点击一个喜欢在关注一下~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值