QMUI 2 提了很久很久了,在蜗牛般的开发速度下(加班过多,效率低下),终于来了首个对外版本。 你可以前往官网下载 QMUIDemo 体验体验,然后前往Github 给个 star 吧。

这个版本主要是做了以下几个主要修改:

支持库迁移到 Androidx, 最低支持版本升级到 API 19。

支持夜间模式,QMUI 做得更通用一点,提供了换肤功能。

重构 QMUIPopup 与 QMUITabSegment等组件,提供更丰富的功能。

移除旧的以背景切图来实现分隔线的实现方式与相关资源,采用 QMUILayout 方案为替代。

首先要说的是,这个版本与 1.x 版本并不完全兼容,有很多资源的增删改和组件接口与实现的变更,所以升级到 2.x 版本可能需要稍费一点时间,特别是资源配置的变更,可能导致虽然编译没问题,但是UI显示却不正确的现象。 (特别是在文档还没有完善的情况下,这个锅我背了,但还是不可能那么快完善)

引入 QMUI 2

def qmui_version = '2.0.0-alpha02'

implementation "com.qmuiteam:qmui:$qmui_version"

implementation "com.qmuiteam:arch:$qmui_version"

kapt "com.qmuiteam:arch-compiler:$qmui_version" // use annotationProcessor if java

Androidx

迁移到 androidx 的呼声在 github 上是非常高的,一部分人是想要查看源码方便一点,另一部分人我估计是并不知道 jetifier 的方式可以在编译时将 support 包转换为 androidx。

另一个修改是最低支持版本提升到了 API 19。 目前都 2019 年,我都想直接提升到 API 21 了,但还是不敢太激进,只能慢慢来吧。

Dark Mode / 换肤

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

一种是在 value-night, drawable-night 放置 Dark Mode 资源。 当 Dark Mode 打开时,Activity会被重新创建, 然后从 *-night 目录读取资源。

另一种是在 AndroidManifest 文件中为 Activity 的 configChanges 加上 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_blue、R.style.app_skin_dark、R.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 重写

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

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

一个简单的使用例子:

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 的重写,其它组件也都有很大的改动:

QMUITabSegment 大面积重写,提供了两张图片切换、不同 Tab 不同设置等功能,扩展也更加灵活。

QMUIBottomSheet.BottomListSheetBuilder 添加了很多人期待的居中设置

QMUICommonListItemView 更改父类为 ConstraintLayout, 重写布局,可以设置高度 wrap_content 以支持超长标题或副标题

提供了 QMUISlider 组件

...

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

android qmui简书,QMUI 2 终于来了相关推荐

  1. android计步器简书,自定义View-仿QQ运动步数进度效果

    自定义View-仿QQ运动步数进度效果 一.写在前面 (1) 图一,仿QQ步数运行效果 (2) 图二,完整的圆效果 完整代码请看这 二.正文开始 (1)首先来个三部曲,自定义属性,布局设置,属性获取 ...

  2. android 仿简书评论,Android 开发仿简书登录框可删除内容或显示密码框的内容

    简书App 是我很喜欢的一款软件.今天就模仿了一下他的登录框.先上图: 好了下面上代码,自定义ImgEditText 继承与EditText.重写一些方法. package lyf.myimgedit ...

  3. android 仿简书评论,Android仿简书搜索框效果的示例代码

    前言 之前用简书的时候一直是在web端,后来下载了客户端,看到了搜索的那个动画,就尝试的去写了,没写之前感觉挺容易的,写了之后,就感觉里面还是有些要注意的东西的.话不多说,直接上图. Activity ...

  4. android jsoup简书,jsoup爬虫简书首页数据做个小Demo

    昨天LZ去面试,遇到一个大牛,被血虐一番,发现自己基础还是很薄弱,对java一些原理掌握的还是不够稳固,比如java反射注解,知道一点就是说不出来,很尴尬... 生命不止,学习不止啊 之前那个项目 Q ...

  5. Android仿简书、淘宝等APP View弹出效果

    在用简书App的时候觉得这个View的弹出效果特别好,而且非常平滑. 先看看效果: 主要是scale,alpha,translation几个普通动画组合,这里不再分析. 实现效果图: 代码:https ...

  6. android仿简书编辑器,类似zine,简书的app移动编辑器-Light Seven

    原标题:类似zine,简书的app移动编辑器-Light Seven 无论你是否从事文字编辑工作,我相信每个人都会接触到文字编辑.既然接触到文字编辑,顺理成章的就会接触到文字编辑的应用和软件. 在生活 ...

  7. android qmui简书,QMUI_Android/qmui_style_widget.xml at master · Tencent/QMUI_Android · GitHub

    false @dimen/qmui_tab_segment_indicator_height @dimen/qmui_tab_segment_text_size @dimen/qmui_tab_seg ...

  8. android 心跳 简书,如何高效维持网络长连接:手把手教你实现 自适应的心跳保活机制...

    前言 当实现具备实时性需求时,我们一般会选择长连接的通信方式 而在实现长连接方式时,存在很多性能问题,如 长连接保活 今天,我将 手把手教大家实现自适应的心跳保活机制,从而能高效维持长连接 目录 示意 ...

  9. android profiler 简书,使用AndroidStudio提供的Android Profiler工具和mat进行内存泄漏分析...

    废话不多说直接说流程 给项目中集成LeakCanary工具进行内存泄漏检测.发现有内存泄漏后该工具会进行提示 有内存泄露后我们需要使用as的profiler工具进行分析并获取到.hprof文件,步骤如 ...

最新文章

  1. 如何禁止使用本地administrator进行共享连接
  2. NR 5G 用户平面协议
  3. Java多线程之线程间协作 notify与wait的使用
  4. Java多线程和并发(三),Thread类和Runnable接口
  5. Flink 容错机制:Checkpoints、Savepoints
  6. Angular 依赖注入的一个常见错误 NullInjectorError, No provider for XXX
  7. JavaScript中数组slice和splice的对比小结
  8. 统计学习笔记(1) 监督学习概论(1)
  9. 制造业物料清单BOM、智能文档阅读、科学文献影响因子、Celebrated Italian mathematician ZepartzatT Gozinto 与 高津托图...
  10. const 和 #define 区别总结
  11. 挖掘城市ip_企鹅号助力城市品牌IP化进程
  12. Windows下检测文件的MD5值
  13. ubuntu iptables 共享上网
  14. Node.js验证码模块captchapng
  15. 降维系列之 SNE与t-SNE
  16. 在东京大学感受_东京最好的街头小吃在哪里找到
  17. Mac安装虚拟机详细步骤
  18. 帝国 loginjs.php,帝国CMS页面JS调用登录状态loginjs.php中获取会员头像的方法
  19. 【重要通知】红帽RHCE7.0版本考试即将下线
  20. linux打印机验证密码,HP LaserJet Pro打印机远程管理员密码泄露漏洞

热门文章

  1. spring boot 通过配置文件控制是否启用启动类上的注解
  2. 微软加速器上海首航,岂安科技入驻全球校友圈
  3. 微信发送Json数据解析失败问题
  4. 四、对select下拉框的处理需要标签为tagName为select的标签才方便进行操作
  5. 污水处理软件c语言代码,污水处理方法代码简表
  6. 在html中,通过添加close-popup类关闭popup时,不能关闭popup跳出层
  7. spring mybatis 配置多数据源
  8. MBSE建模学习之七:用例和用例图的说明
  9. oracle12c 隐藏列的值
  10. Jetpack-ViewModel