13 Aug 2014
public class DensityUtil {
public static int px2dp(Context context, float pxValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (pxValue / scale + 0.5f);
}
public static int dp2px(Context context, float dpValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dpValue * scale + 0.5f);
}
public static int px2sp(Context context, float pxValue) {
final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
return (int) (pxValue / fontScale + 0.5f);
}
public static int sp2px(Context context, float spValue) {
final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
return (int) (spValue * fontScale + 0.5f);
}
}
11 Aug 2014
A: Branch A
B: Branch B
git log A.. B
means:

git log A... B
means:

08 Aug 2014
Bitmap bmp_9patch = BitmapFactory.decodeResource(getResources(), R.drawable.ic_background);
NinePatch np = new NinePatch(bmp_9patch, bmp_9patch.getNinePatchChunk(), null);
Rect rect = new Rect(0, 0, 2000, 50);
np.draw(canvas, rect);
29 Jul 2014
在Android中,所谓消费了一个touch事件均以返回值的真假来确定。true = 已消费;false = 未消费
Activity.dispatchTouchEvent
dispatchTouchEvent()的处理流程代码:
public boolean dispatchTouchEvent(MotionEvent ev) {
if(!onInterceptTouchEvent()){
for(View child : children){
if(child.dispatchTouchEvent(ev))
return true;
}
}
return super.dispatchTouchEvent(ev);
}
ViewGroup.onInterceptTouchEvent一个完整的touch事件是指从ACTION_DOWN到ACTION_UP/ACTION_CANCEL,之间可能包括许多ACTION_MOVE。其中ACTION_DOWN是一个开始事件也是最重要的一个事件,是否处理ACTION_DOWN会直接影响到其是否能接受到后续事件。
-
当ViewGroup的onInterceptTouchEvent()返回true时,其目标子view会接受到ACTION_CANCEL事件,其表明目标子View将不再接受后续的所有touch事件,而后续的touch事件都将交由ViewGroup的onTouchEvent()来处理。
-
当ViewGroup的onInterceptTouchEvent()返回false时,那么这个事件不会交给本ViewGroup的onTouchEvent()处理,而是往下传递。
-
ViewGroup提供了一个requestDisallowInterceptTouchEvent(boolen),它的作用是当某个子View不希望它的父ViewGroup和祖先ViewGroup通过onInterceptTouchEvent()截获touch事件时,给这个方法传递true 。
-
当没有子View消费掉touch event时,ViewGroup.onTouchEvent()将被调用。
View.onTouchEvent
-
如果View想处理一个Touch Event,那么它必须处理ACTION_DOWN事件,否则将接收不到任何后续事件。
-
当onTouchEvent返回true,意味着这个事件被消费掉了,false则会将该事件上传到ViewGroup的onTouchEvent()来处理。

ref: Google Android Doc
ref: Youbube
28 Jul 2014
当我们建立了一个git库的时候,实际上我们就拥有了3棵目录树,分别是:工作区、暂存区和分支区。
工作区
工作区就是你项目的当前目录。
暂存区
暂存区是Git跟其他版本控制工具(CVS、SVN)最大的一个区别,是Git独有的。
当你使用
git add
的时候,实际上只是把工作区中的文件放到了暂存区中,在你的版本库中还没有你的文件,只有在你使用
git commit
后,才真正把你的文件提交到了版本库中。
分支区
分支区是真正用来管理你项目文件的地方。在新建的git库中自动会产生一个master分支,而HEAD即是指向这个master分支的游标。
如何查看各区域的目录树
查看工作目录
要查看工作目录中的目录树是最简单的,跟git根本没有关系,直接
ls -l
查看暂存区目录树
git write-tree | xargs git ls-tree
查看master分支目录树
git ls-tree HEAD
这里的HEAD指向master分支。
如果想查看子目录下的内容,跟linux的ls一样,可以加上-r参数。
git ls-tree -r HEAD