Android Drawable之InsetDrawable

Overview

InsetDrawable 表示一个drawable根据指定的距离嵌入到另外一个drawable内部。(我们看到的其实还是同一张图片,只是会空出一些边距)当控件需要的背景比实际的边框小的时候比较适合使用InsetDrawable。

创建和使用

在xml文件中使用<inset>作为根节点来定义InsetDrawable。
语法为:

Android Drawable之TransitionDrawable

Overview

从Drawable的类继承图上可以看到TransitionDrawable是LayerDrawable的子类,但是不像LayerDrawable可以有多层drawable,TransitionDrawable只能管理两层drawable,并且提供了一个透明度变化的动画,可以控制从一层drawable过度到另外一层drawable的渐变动画效果。

在xml文件中使用<transition>作为根节点来定义TransitionDrawable,通过item子节点定义两层使用的drawable。

Android Drawable之LayerDrawable

Overview

一个LayerDrawable是一个可以管理一组drawable对象的drawable。在LayerDrawable的drawable资源按照列表的顺序绘制,所以列表的最后一个drawable绘制在最上层。
在xml文件中使用<layer-list>作为根节点来定义LayerDrawable,通过item子节点定义每一层的drawable,layer-list没有属性节点,只包含item子节点。

Android的Drawable体系

Overview

官方文档中对Drawable的定义为:可绘制物件的一般抽象(A Drawable is a general abstraction for 『something that can be drawn』)。『可绘制的』本身也是个抽象的概念,而且容易让我们联想到Android里另一个较抽象的概念『View』,我们知道View也是可以绘制的,那View是不是也可以称为Drawable呢?官方的文档中也有这样一句:Unlike a View, a Drawable does not have any facility to receive events or otherwise interact with the user. Drawable与View不同,Drawable不接受事件,无法与用户进行交互。也就是说与Drawable相比View更轻量级。

我们在开发中也经常对图片设置点击事件,明明可以接受和响应事件啊,但是仔细想想,响应事件的是ImageView,而不是我们显示在ImageView上的Drawable,所以这也正体现了View和Drawable的区别。

与Drawable相关的源码全在
android/platform/frameworks/base/graphics/java/android/graphics/drawable/包下。

Hexo优化之合并css和js请求

0x01 Tengine简介

介绍此功能之前需要先介绍一下Tengine,因为此功能依赖于Tengine。Tengine是由淘宝网发起的Web服务器项目。它在Nginx的基础上,针对大访问量网站的需求,添加了很多高级功能和特性,其中就包括我们需要用到的concat模块。该模块类似于apache中的mod_concat模块,用于合并多个文件在一个响应报文中。
请求参数需要用两个问号(’??’)例如:

http://example.com/??style1.css,style2.css,foo/style3.css

参数中某位置只包含一个‘?’,则’?’后表示文件的版本,例如:

http://example.com/??style1.css,style2.css,foo/style3.css?v=102234

0x02 Tengine安装和配置

之前我写过一篇记录编译安装Tengine+PHP-FPM运行 Wordpress 的过程,其中就写了Tengine的安装脚本,只是目前的最新版是2.1.2,再次贴一下安装脚本:

Hexo优化之使用Google Prettify高亮代码

虽然Hexo自带了代码高亮的功能,但是渲染生成后的代码是使用table,然后一大堆的tr、td标签。而且试了好几种方法都没能让代码自动换行。想起了之前在Wordpress上使用的Google Prettify插件,于是尝试使用prettify对代码进行高亮显示。

首先我们关闭Hexo的代码高亮功能,修改_config.yml:

highlight:
  enable: false
  line_number: false
  auto_detect: false
  tab_replace:

然后我们需要下载prettify,并引入css和js文件,

<link rel="stylesheet" href="/vendors/prettify/prettify.css" type="text/css">
...
<script src="/vendors/prettify/prettify.min.js" type="text/javascript"></script>

最后我们需要在网页加载完成之后调用即可。

$(window).load(function(){
 $('pre').addClass('prettyprint linenums').attr('style', 'overflow:auto;');
   prettyPrint();
 })

关于代码的自动换行,在你的css文件中添加如下的样式即可:

pre{
    word-break: break-all;
    word-wrap: break-word;
  }

另外关于代码高亮的主题,可以在这个网站http://jmblog.github.io/color-themes-for-google-code-prettify/选择一套你喜欢的主题替换上面的prettify.css即可。

Hexo优化之为外部链接添加nofollow

我们在写博客的时候不免会引用一些外部连接,如果我们不想给这些外部链接传递权重,我们可以给这些外部链接加上 rel=”nofollw” 属性。nofollow是一个HTML标签的属性值。它的出现为网站管理员提供了一种方式,即告诉搜索引擎”不要追踪此网页上的链接”或”不要追踪此特定链接”。
简单的说就是,如果A网页上有一个链接指向B网页,但A网页给这个链接加上了 rel=”nofollow” 标注,则搜索引擎不把A网页计算入B网页的反向链接。搜索引擎看到这个标签就可能减少或完全取消链接的投票权重。

Hexo优化之图片懒加载和CDN托管静态资源

将博客迁移到Hexo之后,抽点时间做了一些优化,现记录下来供同样使用Hexo的朋友一些参考。

0x01 图片懒加载

看了下Hexo官方网站上的几款主题,几乎都是使用jQuery Lazyload这款插件进行图片的懒加载。我记得以前关于这款插件的争论较大,有文章分析说它并未实现真正意义上的延迟加载图片,只是网页滚动到图片区域了将图片显示出来而已。查看了一下官网,发现在新版中已经改善。但是要求我们在插入图片时对img标签做一些修改。

jQuery_Lazyload_howtouse

博客迁移到Hexo

整整一年多的时间没有打理过博客了,趁这次整理博客的机会,将博客迁移到Hexo.

本地安装hexo

Hexo 是一个简单地、轻量地、基于Node的一个静态博客框架,所以本地需要nodejs的环境。然后根据官方的说明安装:

npm install hexo-cli -g
hexo init blog
cd blog
npm install

由于一些原因,npm install的时候会很慢,你可以使用淘宝的cnpm:http://npm.taobao.org/

适配器模式(Adapter)

意图Intent

Adapter Pattern:Convert the inface of a class into another interface clients expect.Adapter lets classes work together that couldn’t otherwise because of incompatible interface.
适配器模式:将一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。

其别名为包装器(Wrapper),适配器模式既可以作为类结构型模式,也可以作为对象结构型模式。