px、dp、sp转换

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);
	}
}

git log 中的 ".." 和 "..."

A: Branch A B: Branch B

git log A.. B

means: 1

git log A... B

means: 2

绘制 9patch

 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);

Android 触摸事件处理流程

在Android中,所谓消费了一个touch事件均以返回值的真假来确定。true = 已消费;false = 未消费

Activity.dispatchTouchEvent

  • 一个touch事件首先会交给Activity.dispatchTouchEvent()进行分发给Activity的根View。当没有任何一个子View消费掉这个事件的时候,这个事件会交给Activity.onTouchEvent()来处理。

  • 当Activity.dispatchTouchEvent()返回true,意味屏蔽了所有的touch事件。

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()来处理。

Alt none Alt none Alt none

ref: Google Android Doc ref: Youbube

Git 中的工作区、暂存区和分支区

当我们建立了一个git库的时候,实际上我们就拥有了3棵目录树,分别是:工作区、暂存区和分支区。

工作区 工作区就是你项目的当前目录。

暂存区 暂存区是Git跟其他版本控制工具(CVS、SVN)最大的一个区别,是Git独有的。 当你使用

git add

的时候,实际上只是把工作区中的文件放到了暂存区中,在你的版本库中还没有你的文件,只有在你使用

git commit

后,才真正把你的文件提交到了版本库中。

分支区 分支区是真正用来管理你项目文件的地方。在新建的git库中自动会产生一个master分支,而HEAD即是指向这个master分支的游标。

a 如何查看各区域的目录树

查看工作目录 要查看工作目录中的目录树是最简单的,跟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