Hiten's Blog.

Hiten's Blog.

Glide4.8源码拆解(四)Bitmap解析之下采样浅析

前言

Glide归根结底是一个图片加载框架,它一定会涉及到BitmapFactory相关API把Bitmap读取到内存;可能大家已经很熟悉如何高效的加载Bitmap(比如使用inSample等),这一章还是要看一看Glide是如何玩转的;

本文主要分析这两个类:

  • DownsampleStrategy
  • Downsampler

从”Glide会对原图进行放大”案例开始

假设我们有一张宽高100x200的网络图片,需要加载到300x300像素的ImageView上(scaleType属性为CenterCrop),用Glide加载,不做任何处理会得到多大的Bitmap?

Glide4.8源码拆解(三)Registry和数据转换流程

前言

Registry是Glide中非常重要的知识,可以把它理解成连结各个核心功能模块的集中营或者挂载中心,这一章节就来分解它是如何建立和运作的:

本章要讨论的内容:

  • Registry的基本构成;
  • 各个模块的功能和介绍;
  • 数据的转换流程;

从Registry开始

Registry是一个组件管理类,它的主要用途是扩展和替换Glide组件,这些组件包括加载,编码,解码等逻辑;Registry内部支持的模块类型如下:

Glide4.8源码拆解(二)核心加载流程

前言

上一篇文章中介绍了Glide基本的调用流程,总结起来就是Engine是真正加载资源的入口,SingleRequest起到连接RequestManagerTargetEngine的纽带关系,本文将承接上文,探讨Glide的加载流程。

本章要讨论的内容:

  • Engine的工作流程;
  • 内存缓存ActiveResource原理剖析;
  • 内存缓存MemoryCache基本原理;
  • EngineJob和DecodeJob的工作原理;

在讨论Engine之前,还是从调用它的地方开始SingleReques.onSizeReady

从Engine开始

Glide4.8源码拆解(一)基本调用流程

前言

Glide是一款功能强大的图片加载框架,它功能强大,用法简单且易于扩展,同时也是Google推荐的Android平台图片加载库,堪称优秀。

本章拆解思路

这算是开篇第一章吧,我准备从入口类和简单的调用流程说起,包括但不限于:

  • Glide的构造
  • RequestManager和生命周期监听
  • Request和配置的收集
  • Target以及触发异步加载

Glide对象初始化

从with()说起

为何要从with()方法,明明初始化代码在get()方法中:

WindowManager调用流程源码分析

前两天写Activity启动流程时挖个坑,ActivityThread调用Activity.resume后,紧接着调用WindowManager.addView()用来正在的显示View,之前讲的很草率,现在感觉有必要写一下WindowManager的调用流程。

本文基于android8.1.0_r15分支分析

WindowManager简单介绍

首先WindowManager是一个接口继承自ViewManager,它作用是用于窗口的管理,我们平时的使用比较多的是addView方法和LayoutParams参数,addView定义在基类ViewManager中,源码:

Activity启动流程源码分析

最近我开始学习framework,不想一上来就研究到c/c++层进程启动原理什么的,首先得从四大组件的启动流程入手学习,所以我决定写几篇博文,来记录整个过程的学习心得。

关于Activity的启动流程,我准备分成两个部分来写:app进程篇和system进程篇,作为一个应用层开发者,其实掌握前者已经够用了,第二篇作为提高,毕竟多了解一点也没有坏处,就这样吧。

本文主要基于android8.1.0_r15代码分支调试分析;

需要掌握的知识:

  • Activity生命周期
  • AIDL原理
  • Handler机制
[Android Gradle] 搞定Groovy闭包这一篇就够了

努力的人,应该像好色那样好学

做Android开发的同学,对Gradle肯定不陌生,我们用它配置、构建工程,可能还会开发插件来促进我们的开发,我们必须了解Gradle,而不仅限于只会当配置构建工具,我想学习它,于是就有了这一系列的文章。

看到这篇博客,能可能会学到什么?

  • 了解Groovy,我们并不需要精通,试着把它当java来写
  • 理解Groovy闭包,闭包是必须要理解的,特别是delegate
  • 利用闭包来实现自己的DSL

开发环境:

开发工具:Intellij Ideal
jdk版本:jdk1.8
sdk版本:groovy sdk 2.4.10
具体用Ideal创建groovy的教程,比较简单,自行摸索
工程如下

Git分支管理策略浅识

崔同学说逃避解决不了问题,那就勇敢面对。

两年前看过阮一峰老师的文章,认识了git分支管理策略,但那时项目代码是用SVN管理,接触git是因为github,github一直停留在单人单分支的阶段。后来换工作了必须用git,发现分支管理的强大之处,所以写一篇记录一下。

如何管理好git分支,国外的nvie发表了博客 a-successful-git-branching-model, 文章讲解了他是如何让自己的Git仓库保持整洁,阮一峰老师说的也是基于nvie的思想,推荐大家看完阮老师的文章,好好感悟感悟,然后在再来纠正一下我的理解,哈哈。

自定义头部悬停的下拉刷新控件

VRefreshLayout

一个竖直方向的下拉刷新控件,支持自定义Header,可配置参数,最重要的特点是刷新时头部置顶显示,且不影响列表滑动

为什么要做头部置顶显示

现在越来越多的App下拉刷新时是置顶显示的,大家可以看手机京东,天猫商城,小米商城,汽车之家等APP,我们在下拉刷新时,头部的刷新视图是保持显示的,这样在滚动列表的时候,用户可以知道当前正在刷新状态,而传统的下拉刷新库,比如Android-PullToRefreshandroid-Ultra-Pull-To-Refresh,是不支持的头部置顶显示的,用户往下翻看时,刷新状态就可能被隐藏;google的SwpieRefreshLayout是置顶层显示的,但是它的内容区域的不会跟着动的,且可定制性太差。

<基础>你是否留意过“位运算”

长时间阅读Android SDK源码,会发现Google喜欢用位运算,伴随的是代码中会定义一堆int类型的常量,乍一看很懵逼,特别是所在View相关的类里边,比如这些常量你可熟悉:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
static final int FLAG_CLIP_CHILDREN = 0x1;

private static final int FLAG_CLIP_TO_PADDING = 0x2;

static final int FLAG_INVALIDATE_REQUIRED = 0x4;

private static final int FLAG_RUN_ANIMATION = 0x8;

static final int FLAG_ANIMATION_DONE = 0x10;

private static final int FLAG_PADDING_NOT_NULL = 0x20;

private static final int FLAG_ANIMATION_CACHE = 0x40;

static final int FLAG_OPTIMIZE_INVALIDATE = 0x80;

static final int FLAG_CLEAR_TRANSFORMATION = 0x100;

avatar
Hiten
头像是我家小海豚,睡成一条虫了
FRIENDS
hanks