August 14th, 2016
http://androidweekly.net/issues/issue-218
Android 5.0 推出了VectorDrawable, 矢量图为处理多种屏幕尺寸的带来了很多好处. 这篇文章先介绍了VectorDrawable的使用, 然后主要讲如何实时操纵图像的改变, 用AnimatedVectorDrawable实现一个图像变形的效果.
文中的例子是Android和Apple的log在互相变化.
source code available
用Espresso写UI功能测试, 通常是: 定位UI元素, 然后与其交互, 检查UI元素的状态.
三种主要的组件是: ViewMatchers, ViewActions 和ViewAssertions.
一个简短的例子:
onView(withId(R.id.my_view)) // withId(R.id.my_view) - ViewMatcher
.perform(click()) // click() - ViewAction
.check(matches(isDisplayed())); //matches(isDisplayed()) - ViewAssertion
为了测试不受animation的影响, 有时候可能需要把设备上的Developer Options里的下面几个animation全关掉:
Window animation scale
Transition animation scale
Animator duration scale
然后这个文章里有具体的例子介绍如何写并且运行测试, 还附有相关源码.
创建在亚马逊的Fire TV上跑的Android应用.
文后可以点进part 2.
Complication是指手表上显示的除了小时和分钟之外的东西, 比如, 一个电池指示标志.
使用了Complication API之后, 用户就可以自己选一个地方, 然后从应用的列表中选一个东东来显示.
Wear应用是嵌入到一个主应用里面的, 当google play上主应用的apk被安装到手机上的时候, Wearable应用会自动安装在配对的设备上.
这篇文章详细介绍了如何创建一个Wear应用, 代码在github
官方文档: Watch Face Complications
官方sample: android-WatchFace
之前有一篇文章介绍了用装饰者模式来构建高度模块化的Android应用: Creating Highly Modular Android Apps
那篇文章里也有一个例子Decorator.
这篇文章讲同样采用装饰者思想的一个库: Router.
Router首先基于一个将URL映射到程序界面的库: routable-android
Router在此基础上做出了一些扩展和改进, 可以用一个map文件(YAML/JSON/XML)来定义基本的构架.
输入是URL(可以带参数), 根据map进行解析, 然后传到plugins, 然后每个plugin创造一部分的输出, 当左右plugins的工作结束后, 输出就可用了(输出是由多个plugins组装而成的).
文末附有sample.
这篇文章研究了在解析JSON响应的时候如何提高效率.
作者他们的应用Vimeo Android用了Retrofit来做网络请求, 用Gson来反序列化, 不好的一点就是有点慢, 因为Gson用反射来解析JSON. 为了改进,他们想要去除反射.
他们创建了自己的Gson TypeAdapters, 并且利用程序中各个不同大小的model来测量对比了了反序列化的时间.
他们的实验测试了不同的机器对于不同大小model的处理, 在多数情况下, 不用反射会提高性能, 但是也有例外, 在解析很大的model时, 在高性能的机器上, 反而是使用反射的情况比较快.
他们的库: stag-java
STAG: Speedy Type Adapter Generation.
讲如何写测试的系列文章, 有一个案例sample: GithubUsersSearchApp.
举例了一个MVP的真实例子, 然后给P写单元测试.
Presenter里有一个CompositeSubscription, 用来管理RxJava的subscriptions, detach的时候会注销所有的订阅, 防止了内存泄露和可能存在危险的view操作.
还创建了一个Contract接口, 把View和Presenter的接口定义写在里面.
这里面还有很机智的一点是把RxJava要用到的Scheduler也从presenter的构造函数传入, 这样在测试的时候就可以使用Schedulers.immediate()
, 而在View里面我们就按实际情况使用其他.
这应该是跟上面那条一个系列文章的第三篇.
介绍了如何用Retrofit和RxJava请求Github API然后解析到models.
后面是写单元测试, 步骤很清楚, given, when, then.
可以从中学习一下怎么给这种Retrofit + RxJava的程序写单元测试.
Bitbucket is a web-based hosting service for projects using Git.
讲了如何使用BitBucket或者Github作为一个private的Maven repository.
例子: WagonGitExample
Gradle 脚本: GitAsMaven
比较简单的一个文章, 如何set up Firebase的crash reporting.
其实Firebase Crash Reporting一旦构建好之后, 不需要加java代码, 所有uncaught的异常都是自动报告的.
Firebase Report Crashes.
神奇的AnimatedVectorDrawable, 这篇文章讲了用它来实现栅格地形图, 游戏里可以升降的草地的类似的东东. (看文章里的图吧, 我也形容不好.)
遗憾的是pathData animation当前在VectorDrawableCompat library暂不支持, 所以文中所讲的技术只能在api 21及其之上使用.
文中的例子有9个方块, 4个三角形, 把SVG作为矢量图VectorDrawable导入Android Studio, 然后给每一个path起名字.
本文只是part 1, 预告了下一篇文章将讲如何动画.
Source code available here: IsometricAnimatedVector
关于bottom nav bars的讨论.
Hamburger menu有时候感觉不是很理想, 是因为抽屉里的items总是隐藏状态, 用户不易发现和使用.
Bottom bar则把每一个item都时刻展现给用户, 在iOS上使用得很成功.
Google在2016年3月提供了Guides: Bottom navigation.
Stag通过减少反射改善了Gson的性能, 为你的model对象自动生成TypeAdapters.
一个基于routable-android的新的Android URL router, 摒弃了Activity/Intent依赖, 并加入了新的特性.