-
EventBus 使用及源码分析
EventBus 是我们日常开发中使用很频繁的一个三方库,原因很简单,使用 EventBus 可以很容实现解耦,不需要设置很多回调接口,如在 Fragment 和 Activity 之间的通讯,不同 Activity 之间、不同的线程之间,不同的 Service 之间等,使用 EventBus 会减少很多代码,而且看起来更加简洁,在 Android Studio 中点击左侧的小安卓图标可以很方便从事件发送的位置跳转到事件接收的位置,或者从事件接收的位置跳转到事件的发送位置,如果你还没试过这...…
-
属性动画详解
1. 动画分类Android 中动画分为 3 种:View 动画(视图动画)、帧动画、属性动画。(1)帧动画:将一系列的图片按照顺序播放,每一张图片就是动画中的一帧,连续播放后就形成了动画,使用起来比较简单,缺点是当图片过多或者过大是,容易导致 OOM。(2)View 动画:动画变化分为 4 种,平移、缩放、旋转、透明度,通过这 4 种动画其中的一种变换或者组合变换,使视图完成一种渐进式的动画效果。(3)属性动画:是在 Android 3.0(API 11)才提供动画库。属性动画不仅可以使...…
-
数据库学习之 greenDAO 源码分析
概述greenDAO 主要使用起来方便的地方,就是使用 @Entity 注解实体类后,只需要build工程,DaoMaster、DaoSession和对应的 Dao 文件就会自动生成,所以对于 greenDAO 来说,需要分析的主要就是 DaoMaster、DaoSession 和 xxDAO 这几部分。DaoMaster:使用 greenDAO 的切入点。 DaoMaster 保存数据库对象(SQLiteDatabase)并管理特定模式的 DAO 类(而不是对象)。 它有静态方法来创建表...…
-
自定义 View - onDraw 过程详解
之前两篇文章分析了 onMeasure 过程和 onLayout 过程,不熟悉的童鞋可以回头去复习下,本篇文章来分析绘制过程的最后一个 onDraw 过程。这个过程的绘制使用到的 Paint 和 Canvas 在之前也有讲解到,在本篇的练习代码中有使用到,不会具体讲解这些知识点,不熟悉的话可以看看我之前的文章自定义 View - Paint 详解自定义 View - Canvas 详解View 绘制过程绘制过程也不复杂,在 View draw 方法的源码中注释写的也很详细,先给出一张图。图...…
-
自定义 View - layout 过程详解
在上一篇文章 自定义 View - Measure 详解 中讲了 View 的 Measure 过程,还不熟悉的童鞋可以翻过去看看。View 的 3 个过程是按照顺序执行的:measure –> layout –> draw测量(measure)过程是确定这个 View 的大小,布局(layout)过程是确定 View 的位置。layout 过程相比于 measure 过程简单,因为它主要就是确定自己的位置,即 left、top、right、bottom 四个点的位置。布局过程...…
-
数据结构与算法学习-二叉堆及堆排序
1. 二叉堆定义(1)堆是一个完全二叉树(2)堆中每一个节点的值都必须大于等于(或小于等于)其子树中每个节点的值。第一点,堆必须是一个完全二叉树。,除最后一层,其他层的节点个数都是满的,最后一层的节点都靠左排列。第二点,堆中的每个节点的值必须大于等于(或者小于等于)其子树中每个节点的值。也可以理解为,堆中每个节点的值都大于等于(或者小于等于)其左右子节点的值。这里我们借助于堆这种数据结构实现的排序算法,就叫作堆排序。这种排序方法的时间复杂度非常稳定,是O(nlogn),并且它还是原地排序算...…
-
自定义 View - Measure 详解
上图就是 View 绘制的主要过程,View 的绘制是从顶层的 DecoraView – ViewGroup(可能多个 ViewGroup)再到 View,按照这个流程从上往下,依次measure(测量),layout(布局),draw(绘制)。其中 Measure 过程是相对复杂的一个,但是其实我们梳理出来需要掌握测量过程的知识点,就很清楚了,下面就来一起看看 Measure 过程。Measure 过程实际上就是确定这个 View 或者 ViewGroup 的宽高,确定了宽高,然后进行布...…
-
自定义 View - Canvas 详解
1.CanvasCanvas 是我们绘制各种图形或文字时主要的操作对象,因为绘制绘制过程调用的都是它的 drawXX 方法。官方给出的 Canvas 的解释: The Canvas class holds the “draw” calls. To draw something, you need 4 basic components: A Bitmap to hold the pixels, a Canvas to host the draw calls (writing into th...…
-
异步线程之 HandlerThread 和 IntentService
本篇主要讲解一下 HandlerThread 和 IntentService,其中 IntentService 内部使用了 HandlerThread,而 HandlerThread 是一个 Thread,内部使用到了 Handler 消息机制,对 Handler 消息机制还不熟悉的话,可以看看之前的两篇文章 消息机制 - Handler 使用 和 深入理解 Handler 消息机制下面就来看下 HandlerThread 和 IntentService 的用法和原理分析。1 Handle...…
-
数据结构与算法学习-二分查找及其变形
二分查找1、二分查找针对的是一个有序集合,查找思想主要采用分治思想。每次都通过跟区间的中间元素对比,将待查找的区间缩小为之前的一半,直到找到要查找的元素。要查找的元素比中间的元素小,则将范围缩小为集合的前半部分,如果待查找的元素比中间的元素大,则将将范围缩小为集合的后半部分,然后重复这个过程,直到找到元素的下标为止。2、二分查找的时间复杂度:O(logn)3、二分查找的局限性:(1)二分查找依赖的是顺序表结构,简单点说就是数组(2)二分查找针对的是有序数据,也就是说集合排好序后,才能使用二...…
-
数据结构与算法学习-二叉查找树
二叉查找树之前整理了两篇关于二叉树的文章:征战二叉树-第一站征战二叉树-第二站这两篇都是基于二叉树,以及一些练习题,本篇主要对二叉查找树做一个实现,即增删改查,实际上二叉查找树也很容易理解,满足的条件就是左子节点的值小于根节点,右子节点的值大于根节点。代码实现public class BinarySearchTree<T extends Comparable<? super T>> {private Node<T> root;private static...…
-
数据结构与算法学习-排序算法(二)
很早之前整理过一篇排序算法,这次又整理了一下,增加了计数排序、归并排序和桶排序,需要的拿走不谢!各种排序算法实现public class Sort {/*** 交换数组中两个位置的数值** @param arr* @param i* @param j*/public static void swap(int[] arr, int i, int j) {int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}/*** 冒泡排序** @param ar...…
-
深入理解 Handler 消息机制
上一篇 - 消息机制 Handler 使用 文章讲了 Handler 的一个概述和基本的使用方法,这里还有一点需要强调一下:对于初学者一定要将你创建的子线程区分开,Handler 是你在子线程执行完,准备进行线程切换执行其他操作时才开始使用 Handler本篇主要对 Handler 的工作原理进行分析,即 Handler、Looper、MessageQueue 三者是如何工作的,从源码层面来分析下,本篇的主要内容如下:Looper首先来说 Looper,实际上 Handler 最开始是和 ...…
-
动画还可以这么玩?使用 Toast 显示 or Dialog 显示
本篇不是讲解动画的设计,而是分析动画在使用过程中,如何合理显示遇到的一些坑,主要是由于特定场景引起的。问题相信大家都见过这样的点赞动画,点赞之后图片能够飘一会。思路:动画其实并不难,通过一个自定义 View,大小为显示动画的范围,通过一个 ImageView显示图片,然后通过动画根据设计的路径改变位置,透明度和大小,显示特定的时长。思路有了,然后就是实现,实现完成之后就出现了坑,坑不在这个动画上,而是使用的场景。看一下这个图典型的 RecyclerView 的多布局,这样的布局如果设计:思...…
-
消息机制 - Handler 使用
消息机制提到消息机制,很快想到 Handler,没错,Android 的消息机制主要就是 Handler 的运行机制,另外也不能缺少 Looper 和 MessageQueue。很多人认为 Handler 的作用是用来更新 UI 操作的,多数情况下, Handler 的确用来更新 UI,由于 Android 机制的限制,UI 操作只能在主线程完成,所以当进行一些耗时操作,如网络请求,IO 操作,或者一些其他需要在子线程中进行的延迟操作,结束时,可能需要将数据更新到 UI 上,这时候需要使用...…
-
自定义 View 实战一 - 轻松显示星级
需求前面几篇文章主要都是在介绍一些自定义 View 的基础知识,本篇就来一起编写一个小 Demo,来感受感受。自定义 View 的编写,来源于产品的无理需求,有了需求,首先是要看现有的控件能否满足需求,或者控件的组合能否满足,现有的控件满足的话,就不必去造一个轮子,费时费力。再有,考虑产品的开发周期和开发质量,周期允许,质量要求较高,那么需要考虑使用自定义 View,能够带来性能上的提升。还有一点,如果类似的 View 有重复使用的情况,也要考虑使用自定义 View。好了,下面就来一起试试...…
-
自定义View-Paint详解
上一篇 文章对自定义单一 View 进行了初步的介绍,对绘制的流程有了一个概念,本篇将对 Paint 部分进行详细 的介绍。上一篇中给出一张图,自定义 View 部分设计的知识点,对于 Paint 部分,也是很大的一块,Paint 的 API 很多,有各种样式,各种效果,颜色设置,抗锯齿,文字设置等。绘制的过程可以想象为画画,有画布和画笔。画布就是 Canvas,画笔是 Paint。canvas.drawCircle(300, 300, 200, paint);像这样一个过程,就是用这两样...…
-
到年底,你的心飞了么
这个标题随意取的,到年底了,有了一点自己的感想。这段时间有点身心俱疲的感觉,平时虽然加班很多,也没什么感觉,反而到年底,心可能飞了,所以这种疲态就显出来了。学习的动力也不足了,在将近一年的时间里,虽然有进步,但是还有很多东西需要学习,内心还是有紧迫感,有点神经紧张,没有平时的那种踏实感,平时相对比较简单,两点一线,早上8点53的地铁,晚上9点40的地铁,很充实。年底公司也有年会,在年会之前,公司组织全公司的人去看了一场电影《燃点》,关于创业的片子,希望能够感染员工,能够保持一颗创业的心态,...…
-
博客换新地址啦
1、博客域名更换新的博客地址:http://blog.ralf.wang旧的博客地址:https://ralfnick.github.io新的博客地址域名解析会更快一点,购买域名时,被广告吸引了,就随手买了半年的 DNS 域名解析加速,仅限于半年额,快来踩踩吧!2、更换域名过程我比较懒,不想折腾这些东西,更何况是要花钱的。。。原因是之前的博客中有很多图片不能访问了,七牛云的免费图床不能使用了,开始的方案只能是购买域名,并做备案才能继续使用图床,七牛云的测试域名3天就会收回。无奈之下就购买了...…
-
LRU简单实现-了解一下?
LRU 算法LRU 是一种作为缓存的算法,像 CPU 缓存,数据库缓存,浏览器缓存。以及在移动端开发时的图片安缓存,采用 LRU 缓存策略的应用很广泛。在面试中也是常常考察的一个点。当然也有其他缓存方法,常见的策略有三种:先进先出策略 FIFO(First In,First Out)、最少使用策略 LFU(Least Frequently Used)、最近最少使用策略 LRU(Least Recently Used)。下面就来一起实现一下 LRU 算法。实现主要思路:采用链式结构,越早加入...…