happyhls

  • Home

  • About

  • Archives

Koa源代码分析

Posted on 2018-10-16 | Edited on 2018-10-17

Koa是最为常见和广泛使用的Node平台框架之一,阿里开源的Egg.js也是基于Koa扩展。那么Koa到底做了什么呢?洋葱头模型又是怎么一回事?Koa有哪些关键的组件?

本文为你娓娓道来。

Read more »

Fresco源代码分析之二:SimpleDraweeView如何拉取图片并绘制在屏幕上?

Posted on 2015-12-27 | Edited on 2018-10-03 | In Android , Fresco
Fresco源代码分析之二:SimpleDraweeView如何拉取图片并绘制在屏幕上? 引言在《Fresco源代码分析之1:Fresco的初始化 》文章中,仔细分析了Fresco.init(Context)方法中所做的工作。总结下来有一下几点: 初始化了 ImagePipelineFactory , 包括默认的ImagePipelineConfig(其中初始化了各种线程池、是否解码、旋转之类的设置、各种Cache的默认配置等等)。 初始化了默认的 SimpleDraweeView ,包括对应的ImagePipeline。 那么问题来了,当我们通过SimpleDraweeView的 setImageUri(Uri, Object) 方法调用的时候,Fresco到底做了哪些工作呢?图片是经过了哪些工作绘制在界面上的呢?这篇文章就来说说这些事情。 调用方法12345678910111213 \* Displays an image given by the uri. \* \* @param uri uri of the image \* @param callerContext ca ...
Read more »

Fresco源代码分析:1、Fresco的初始化

Posted on 2015-12-24 | Edited on 2018-10-03 | In Fresco
Fresco源代码分析 之一 默认初始化Fresco被认为是现在最为好用的Android图片加载库,在之前的文章,有根据官方文档分析过Fresco的入门手册,但使用始终无法明白其具体是怎么样工作的,因为,我们还是要从源码上分析Fresco的工作原理。 Fresco的初始化在一般情况下,我们是使用默认的ImagePipeline配置来初始化Fresco的,代码如下: Fresco.initialize(this); 而实际上,Fresco一共提供了两个初始化方法 /** Initializes Fresco with the default config. */ public static void initialize(Context context) { // 初始化了ImagePipelineFactory的默认配置 ImagePipelineFactory.initialize(context); initializeDrawee(context); } /** Initializes Fresco with the specified config. */ publ ...
Read more »

Fresco学习笔记

Posted on 2015-08-03 | Edited on 2018-10-03 | In Fresco
Fresco学习笔记Fresco是Facebook出品的一款比较新的图片库,相比 Volley 或者 Picasso 具有很多优点,这篇文章主要是记录如何学习使用Fresco。 内容主要来自: http://fresco-cn.org/docs/getting-started.html 配置和使用引用Gradle添加lib dependencies { compile 'com.facebook.fresco:fresco:0.5.0+'} 使用网络权限初始化Fresco注意,初始化Fresco的代码必须位于setContentView(ResourceId)代码调用之前。 Fresco.initialize(context); xml布局文件命名空间使用SimpleDraweeView需要注意的是,Fresco的layout_width/height必须要设置,但不能使用wrap_content来根据图片自动调整布局大小,但根据layout_weight属性均分的时候,可以使用wrap_content属性。 加载图片Uri uri = Uri.parse(&qu ...
Read more »

EventBus源代码解析:2、消息的发布与处理

Posted on 2014-12-17 | Edited on 2018-10-03 | In Android , EventBus
在上一篇文章《EventBus源代码解析:1、初始化与订阅者注册》当中,我们主要分析了两个事情: EventBus初始化 订阅者的注册 我们通过分析,EventBus在初始化的时候,初始化了几个集合,分别用来根据EventType和Event Handler所在的类索引对应的Handler方法;并且也同时初始化了用于不同ThreadMode的Poster。订阅者在注册的时候,EventBus会解析要注册的类,分析其所有的方法,从中找出Event的Handler方法(即public修饰的以onEvent开头),然后根据EventType保存到相应的List中。 但我们一直没有分析到一个分析,那就是,EventBus到底是如何去Post消息的呢?接下来我们就去分析这个问题。按照我们的老套路,还是从最常用的代码入手: 12MessageEvent event = new MessageEvent(System.currentTimeMillis(), "Message Sequence " + mSequence.getAndIncrement());EventBus.getDefaul ...
Read more »

EventBus源代码解析:1、初始化与订阅者注册

Posted on 2014-12-16 | Edited on 2018-10-04 | In Android , EventBus
和以前一样,我们同样从我们最经常使用的代码入手,分析EventBus到底是如何进行工作的。所以,第一步,我们先分析EventBus的初始化代码,看看初始化代码当中,都做了哪些工作? 一:初始化单例模式12345678910public static EventBus getDefault() { if (defaultInstance == null) { synchronized (EventBus.class) { if (defaultInstance == null) { defaultInstance = new EventBus(); } } } return defaultInstance;} 首先,我们最经常使用的EventBus的默认配置,其实就是一个我们常用的单例模式: 首先尝试获取defaultInstance,如果defaultInstance为null,说明默认 ...
Read more »

自定义View:3、编写自己的ViewGroup

Posted on 2014-12-13 | Edited on 2018-10-04 | In Android , View
前面我们已经分析过两种自定义View的方法: 自定义View:1、定制自己的饼形图 自定义View:2、组合视图 今天我们来继续学习第三种自定义View的方法,继承ViewGroup,实现自己的Layout。什么意思呢?其实前两种自定义View的方法,我们都是编写的具体的每一个View,然后整合到我们现有的Layout(比如LinearLayout,RelativeLayout等等)当中,但很多情况下,自定义View并不能完全满足我们的需求,或者说,我们想要使用现成的控件,但我们希望我们的界面上,我们可以完全自己来控制如何摆放这些控件。那这个时候怎么做呢? 我们先来看一下我们想要实现的效果是什么样子的? 简单分解一下上面我们要实现的需求: 每一小块为自定义View(称之为磁贴),大小共有3中规格,分别是:横向占据屏幕1/4(size=one),横向占据屏幕1/2(size=two),横向占据屏幕全部(size=four)。其高度始终为屏幕1/4。颜色与文字均可以通过XML直接指定。 要求在XML定义各个View之后,要求能够从左上角开始能够自动占据铺满屏幕。 好了,要求说完了 ...
Read more »

自定义View:2、组合视图

Posted on 2014-12-09 | Edited on 2018-10-04 | In Android , View
昨天联系了自定义View的第一类,直接继承View自己画图。其实很多情况下,我们并不需要自己去从头开始画图,而是将现有的各种视图组合在一起,方便我们的使用。那这种情况下该怎么做呢? 我们先来看看实现的效果怎么样(下图中,我将组合视图与CardView和RecyclerView结合在一起,看起来效果还蛮不错的): 其实操作起来也很简单,与直接继承View的办法类似,一共3个步骤: 编写Layout,可以在代码中设置Layout,也可以直接通过XML配置Layout,然后在代码中直接解析就可以。 编写属性 组合在一起成为一个新的View 使用我们新的编写的View 很简单吧?我们依次来看,具体应该怎么来做。 一:编写对应的Layout代码如下: 12345678910111213141516171819202122232425262728293031323334<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/ ...
Read more »

自定义View:1、定制自己的饼形图

Posted on 2014-12-08 | Edited on 2018-10-04 | In Android , View
Android本身为我们提供了View,但很多情况下,仍然无法满足我们自己的需求,那么这个时候就需要自己定制View。自定义View的办法有很多,我们从最基础的开始。 上图就是我们要实现的效果,具体的我们依次来列举一下: 首先要画出上面的界面 饼形图,饼的面积代表其进度。 在饼形图中间可以设定是否显示数字进度。 要可以设置饼形图的各种参数,包括颜色,大小等等 要能够通过UI中其他的控件比如SeekBar来设置饼形图的参数。 要有回调函数能够使得其他的控件接收到饼形图中进度的变化。 当手指按在饼形图上时,要能够不断自增进度。 好了,上面就是我们规划的需求,那么我们来依次编写代码,首先来分析我们需要做的工作有哪些? 资源文件 attrs.xml中准备饼形图可设置的参数,这样我们可以直接在Layout中设置饼形图的各个参数 程序代码 覆写onMeasure方法来设置界面的大小 覆写onDraw()方法来绘图 设计各种回调函数(Listener) 覆写onTouchEvent()设计触摸事件 资源文件首先,我们需要在attrs.xml中为饼形图设计各种参数,我们将饼形图名 ...
Read more »

App Components : Intents and Intent Filters (译)

Posted on 2014-11-29 | Edited on 2018-10-03 | In Android , App Components
API Guides:http://developer.android.com/guide/components/intents-filters.html Intent是一种消息组件,用来从一个app component向另外一个app component请求一个动作。在系统内部Intent的传递流程如下: 虽然在components中有着灵活变化的通信方式,但有3种最基本的用法: 启动activity 启动service 发布broadcast Intent的类型主要有两种: 显式的Intent(Explicit intents):显式Intent会通过名字(完整的类名)指定要启动的组建。因为在在自己的程序中,我们知道具体的要启动的activity或者service的类名,所以一般程序内部会使用这种方式来启动。 隐式的Intent(Implicit intents):不会指定具体的要启动的类名,但会定义一种相对通用的action请求以允许其他的程序来处理。 如果使用显示的Intent的话,那么系统会立刻启用Intent指定的系统组件;但如果使用隐式的Intent,Andro ...
Read more »
12…9

happyhls

85 posts
31 categories
39 tags
© 2018 happyhls
Powered by Hexo v3.7.1
|
Theme – NexT.Mist v6.4.2