鼠标滑过图标时(ImageButton), 在button的onTouch事件中,能检测到鼠标的滑动。
1. ViewRoot.javad ispatchMotion(MotionEvent event, boolean sendDone) 能检测到鼠标的事件。
boolean isDown = false;
private void dispatchMotion(MotionEvent event, boolean sendDone) {
int source = event.getSource();
int action = event.getAction();
if ((source & InputDevice.SOURCE_CLASS_POINTER) != 0) {
boolean isMouse = ((source & InputDevice.SOURCE_MOUSE) ^ InputDevice.SOURCE_MOUSE) == 0;
dispatchPointer(event, sendDone);
} else if ((source & InputDevice.SOURCE_CLASS_TRACKBALL) != 0) {
dispatchTrackball(event, sendDone);
} else {
// TODO
Log.v(TAG, "Dropping unsupported motion event (unimplemented): " + event);
if (sendDone) {
finishInputEvent();
}
}
}
2. 在ViewGroup.java中,接受自定义的事件。
在dispatchTouchEvent(MotionEvent ev)方法中,增加对事件的处理。
if (action == MotionEvent.ACTION_HOVER_MOVE) {
if (mMotionTarget != null) {
mMotionTarget = null;
}
// If we're disallowing intercept or if we're allowing and we didn't
// intercept
if (disallowIntercept || !onInterceptTouchEvent(ev)) {
// We know we want to dispatch the event down, find a child
// who can handle it, start with the front-most child.
final int scrolledXInt = (int) scrolledXFloat;
final int scrolledYInt = (int) scrolledYFloat;
final View[] children = mChildren;
final int count = mChildrenCount;
for (int i = count - 1; i >= 0; i--) {
final View child = children[i];
if ((child.mViewFlags & VISIBILITY_MASK) == VISIBLE
|| child.getAnimation() != null) {
child.getHitRect(frame);
if (frame.contains(scrolledXInt, scrolledYInt)) {
// offset the event to the view's coordinate system
final float xc = scrolledXFloat - child.mLeft;
final float yc = scrolledYFloat - child.mTop;
ev.setLocation(xc, yc);
if (child.dispatchTouchEvent(ev)) {
mMotionTarget = child;
return true;
}
// The event didn't get handled, try the next view.
// Don't reset the event's location, it's not
// necessary here.
}
}
}
return true; }
}
MotionEvent.ACTION_HOVER 的定义见下一篇。