前言

Flow是Kotlin协程库中的库,用于异步返回多个值,官方介绍是参考RxJava等响应式流实现的,但是“拥有尽可能简单的设计, 对 Kotlin 以及挂起友好且遵从结构化并发”。本文主要参考Flow中文文档,梳理了学习过程中的要点和理解,以便日后查验。

正文

对于异步返回多个值的需求,集合(如List等)只能一次性返回多个值,而序列( Sequence )只支持阻塞代码,Flow则支持挂起函数异步返回多个值。

创建Flow

阅读全文 »

前言

最近在项目里面遇到了屏幕适配的问题,UI要求APP在不同手机上展示效果和设计稿保持“像素级”同步,在对比了几种屏幕适配方案之后,选择了基于今日头条的AndroidAutoSize适配方案。

本文主要简单分析其适配原理,以及在实际使用中遇到的一个问题,需要更深入了解原理可以阅读文末参考文献。

正文

UI给的设计稿一般都是以像素px为单位,而在Android开发中官方推荐的使用的单位是dp。

阅读全文 »

Xfermode是Android中用来指示Paint绘制的内容与View中已有内容的混合计算方式,也就是用来确定图形绘制到目标图形的时候,如何处理两个图形重合部分的颜色变化。共18个,分为Alpha合成和混合两种。

设要绘制的图形为src,已经绘制好的图形为dst

需要注意的是,这些图片除了要绘制的图形有着色之外,其他部分要为透明,并且包括透明区域在内的图片大小(宽高)要能完全覆盖另外一张图片的图形区域,否则绘制出的图形可能与预设的效果不一致

按照官方的定义,不同Xfermode绘制结果如下:

阅读全文 »

贝塞尔曲线是用节点和控制点绘制的高精度曲线,Android中常用的有二阶、三阶贝塞尔曲线。本文介绍使用贝塞尔曲线绘制折线图,并实现动画效果。

本文代码链接:https://github.com/jixiaoyong/library/blob/master/library/src/main/java/cf/android666/applibrary/view/BezierViewAnim.kt

贝塞尔曲线介绍

下图是二阶贝塞尔曲线绘制方法介绍,只要各个点满足条件:AD/AB = BE/BC = DF/DE,那么当沿着当前线段移动D、E点时,F点的运动轨迹就是一个贝塞尔曲线:

阅读全文 »

Android中绘制文字的方法如下:

1
2
3
4
5
6
7
8
9
10
11
12
/**
* Draw the text, with origin at (x,y), using the specified paint. The origin is interpreted
* based on the Align setting in the paint.
*
* @param text The text to be drawn
* @param x The x-coordinate of the origin of the text being drawn
* @param y The y-coordinate of the baseline of the text being drawn
* @param paint The paint used for the text (e.g. color, size, style)
*/
public void drawText(@NonNull String text, float x, float y, @NonNull Paint paint) {
super.drawText(text, x, y, paint);
}

其中y文字baseline的y坐标

下图表示Paint.FontMetrics中存储的文字的各种信息(来源:简书):

我们没法直接获取到baseline的坐标,所以只能从另外一个角度考虑:
因为在绘制文字时,文字的上下中心(即上图中的center)是确定的,我们只要计算出centerbaseline之间的偏移量,就可以计算出baseline的y坐标

阅读全文 »

二叉树的遍历根据根节点与左右子节点的遍历顺序的不同分为三种:

  • 前序遍历

    根左右:先遍历根节点,再左子树,再右子树(先从根节点开始,记录左节点直到没有)

    第一个为根节点

  • 中序遍历

    左根右:先左子树,再根子树,再右子树(从树的最左边的节点开始遍历)

  • 后序遍历

    左右根:先左子树,后右子树,再根节点

    最后一个为根节点

在遍历的时候,当父节点只有一个子节点时,依然要遵循以上三种遍历的先后顺序(没有该子节点则不写内容),以保证某一侧的子树(“左边的子树”或“右边的子树”)所有节点都被完全遍历,之后才可以根据遍历的规则切换到下一子树。

如如下子树:

1
2
3
4
5
6
7
      G
/ \
D M
/ \ / \
A F H Z
/
E
阅读全文 »

最近看到一个帖子,表示有人以"YYYY-MM-dd"格式化日期时,在2019-12-30时出现2020-12-30的BUG。

本文来简单分析一下为什么会出现这个情况。

根据JDK文档关于日期的定义y表示的是我们日常使用的年份,而Y表示的是Week year

先了解几个知识点:

Week year

阅读全文 »

Android中的跨进程通信IPC主要有以下几种方式:

  • BroadcastReceiver
  • ContentProvider
  • AIDL
  • Messenger
  • Socket
  • 文件

Linux 已经提供了管道、消息队列、共享内存和 Socket 等 IPC 机制

进程是资源分配的基本单位,线程是调度的基本单位。

一些基础知识

阅读全文 »

Photo by **[Pixabay ](https://www.pexels.com/@pixabay?utm_content=attributionCopyText&utm_medium=referral&utm_source=pexels)**from **[Pexels](https://www.pexels.com/photo/close-up-of-telephone-booth-257736/?utm_content=attributionCopyText&utm_medium=referral&utm_source=pexels)**

序列化:指将Java对象转化为字节流以便在网络、文件中保存、传输。

反序列化:指的是从字节流中恢复Java对象。

本文主要讨论Android和Java中实现序列化的4种方式,并探讨一下其实现原理。

Android & Java中实现序列化的方式有:

阅读全文 »

日常开发中,常用的存储键值对的数据结构是HashMap,根据Java笔记之HashMap保存数据Java笔记之计算Java对象的大小及其应用可以知道,HashMap存储键值对会占用比较多的内存控件,而对于内存限制较大的Android平台来说,为了避免这种浪费,官方推荐我们使用SpareArrayArrayMap,本文对这两个类的实现进行分析比较。

SpareArray以及他的衍生类都是以基本类型key,因为避免了自动装箱,并且用数组直接保存key、value(而非像HashMap那样将其封装为Node对象后再保存),因而节省了内存。

ArrayMap则支持所有类型的key,他是keyvalue全部保存在一个数组中n位为keyn+1位为value),避免了将其封装为Node对象带来的内存消耗。

当要保存的数据量比较小(小于几千个)的时候,如果KEY是基本类型,推荐使用SparseArray及其衍生类以节省内存,如果KEY是其他类型则使用ArrayMap;否则使用HashMap更加高效

SpareArray

阅读全文 »
0%