布局
/**
* 当此View分配大小和位置给子View时被调用。子类的派生类应该重写这个方法,并通过childView.layout(int, int, int,
* int)回调每个他们子类的onLayout(boolean, int, int, int, int)。
*
* 参数:
* changed 分配给子View的面积位置是否变化
* l 相对父类左边的位置
* t 相对父类顶边的位置
* r 相对父类右边的位置
* b 相对父类下边的位置
* */
protected void onLayout(boolean changed, int l, int t, int r, int b) {
...
}
事件
/**
* 实现这个方法去拦截所有的触屏事件. 由于通过此方法将事件分配给子View,所以可以监视所有的分配事件, 并且可以拿到任何点上的当前手势的所有权.
*
* 使用这个方法需要注意, 因为它和View.onTouchEvent(MotionEvent)有着复杂的交互作用,
* 使用的时候需要实现View.onTouchEvent(MotionEvent)且是正确方式. 事件将以下面的顺序传递:
*
* 1. 接受到down event.
* 2. 这个down event事件要么被此View的子View处理,要么被此View的onTouchEvent(MotionEvent)处理;
* 这意味着你需要实现onTouchEvent(MotionEvent)方法去返回true,
* 所以你需要继续处理其余的手势,而不是寻找一个父视图来处理.
* 此外,onTouchEvent(MotionEvent)返回true以后,onInterceptTouchEvent
* (MotionEvent)不会收到任何Touch事件,所有接下来的Touch事件发生在onTouchEvent(MotionEvent)里面。
* 3. 只要你从此方法返回false, 每个接下来的事件(up to and including the final up)
* 首先被投递到这儿,然后再传递到目标的onTouchEvent().(但如果此View的onTouchEvent(MotionEvent)返回了true,则不会接受到接下来的事件了)
* 4. 如果你返回true, 将不能接受到接下来的任何Touch事件:
* 目标View将接受到MotionEvent.ACTION_CANCEL,
* 所有接下来的事件将被传递到此View的onTouchEvent()方法,不再出现在这里.
*
* 在ViewGroup中被重写
*
* 参数:
* ev 即将分配到子View上的Touch事件。
* 返回值:
* 返回true去偷取子View的Touch事件,并且必须将事件分配给此View的onTouch(MotionEvent)发放.
* 当前的View将接受到ACTION_CANCEL事件, 接下来的所有Touch事件不会传递到这儿.
* */
public boolean onInterceptTouchEvent(MotionEvent ev) {
...
}
注释:请参见View中方法:onTouchEvent(MotionEvent ev)