[中文是转的]
1、onInterceptTouchEvent()是用于处理事件(类似于预处理,当然也可以不处理)并改变事件的传递方向,也就是决定是否允许Touch事件继续向下(子控件)传递,一但返回True(代表事件在当前的viewGroup中会被处理),则向下传递之路被截断(所有子控件将没有机会参与Touch事件),同时把事件传递给当前的控件的onTouchEvent()处理;返回false,则把事件交给子控件的onInterceptTouchEvent()
2、onTouchEvent()用于处理事件,返回值决定当前控件是否消费(consume)了这个事件,也就是说在当前控件在处理完Touch事件后,是否还允许Touch事件继续向上(父控件)传递,一但返回True,则父控件不用操心自己来处理Touch事件。返回true,则向上传递给父控件(注:可能你会觉得是否消费了有关系吗,反正我已经针对事件编写了处理代码?答案是有区别!比如ACTION_MOVE或者ACTION_UP发生的前提是一定曾经发生了ACTION_DOWN,如果你没有消费ACTION_DOWN,那么系统会认为ACTION_DOWN没有发生过,所以ACTION_MOVE或者ACTION_UP就不能被捕获。)
1、onInterceptTouchEvent()是用于处理事件(类似于预处理,当然也可以不处理)并改变事件的传递方向,也就是决定是否允许Touch事件继续向下(子控件)传递,一但返回True(代表事件在当前的viewGroup中会被处理),则向下传递之路被截断(所有子控件将没有机会参与Touch事件),同时把事件传递给当前的控件的onTouchEvent()处理;返回false,则把事件交给子控件的onInterceptTouchEvent()
2、onTouchEvent()用于处理事件,返回值决定当前控件是否消费(consume)了这个事件,也就是说在当前控件在处理完Touch事件后,是否还允许Touch事件继续向上(父控件)传递,一但返回True,则父控件不用操心自己来处理Touch事件。返回true,则向上传递给父控件(注:可能你会觉得是否消费了有关系吗,反正我已经针对事件编写了处理代码?答案是有区别!比如ACTION_MOVE或者ACTION_UP发生的前提是一定曾经发生了ACTION_DOWN,如果你没有消费ACTION_DOWN,那么系统会认为ACTION_DOWN没有发生过,所以ACTION_MOVE或者ACTION_UP就不能被捕获。)
final int viewId = view.getId();
final int action = event.getActionMasked() & MotionEvent.ACTION_MASK;
final int actionIndex = event.getActionIndex();
switch (action) {
case MotionEvent.ACTION_UP:
// 这里的view有错误:假如先按住方向不松,再按子弹不松;
// 接着松开方向;最后松开子弹;那么,子弹按钮将不会得到释放
view.setPressed(false);
m_offsetX = m_offsetY = 0;
int x = (int)event.getRawX(), y = (int)event.getRawY();
if (m_fireRect.contains(x, y)) {
if (R.id.fire != viewId)
findViewById(R.id.fire).setPressed(false);
} else if (m_padRect.contains(x, y)) {
if (R.id.pad != viewId)
findViewById(R.id.pad).setPressed(false);
// 做关于雪地的滑行
int gridx = pMe.GetGrid().x;
int gridy = pMe.GetGrid().y;
if (GameWorld.SNOW == GameWorld.Instance().GetTerrain(gridx, gridy, GameWorld.TERRAIN_TYPE_ALL) ||
GameWorld.SNOW == GameWorld.Instance().GetTerrain(gridx + 1, gridy + 1, GameWorld.TERRAIN_TYPE_ALL) ) {
pMe.Slide();
} else {
pMe.SetDir(Dir.NONE);
}
}
break;
case MotionEvent.ACTION_MOVE:
// 先调整事件的坐标相对原点
event.offsetLocation(m_offsetX, m_offsetY);
//Log.d(TAG, "DOWN X " + event.getX(actionIndex) + " Y " + event.getY(actionIndex));
ButtonType type = GetButton(event.getX(actionIndex), event.getY(actionIndex));
switch (type) {
case UP:
case DOWN:
case LEFT:
case RIGHT:
DoMove(type);
break;
case FIRE:
if (pMe.Fire()) {
AudioPool.Play(m_soundId[AudioID.AUDIO_FIRE.ordinal()], GetCurVolume(), 0);
}
break;
default:
pMe.SetDir(Dir.NONE);
break;
} break;
case MotionEvent.ACTION_DOWN:
//Log.d(TAG, "First ( " + m_offsetX + " , " + m_offsetY + " )");
view.setPressed(true);
switch (viewId) {
case R.id.fire:
m_offsetX = m_fireRect.left;
m_offsetY = m_fireRect.top;
if (pMe.Fire()) {
AudioPool.Play(m_soundId[AudioID.AUDIO_FIRE.ordinal()], GetCurVolume(), 0);
}
break;
case R.id.pad:
m_offsetX = m_padRect.left;
m_offsetY = m_padRect.top;
type = GetButton(event.getRawX(), event.getRawY());
switch (type) {
case UP:
case DOWN:
case LEFT:
case RIGHT:
pMe.StopSlide();
DoMove(type);
break;
default:
pMe.SetDir(Dir.NONE);
break;
}
default:
break;
}
break;
case MotionEvent.ACTION_POINTER_DOWN:
// 先调整事件的坐标相对原点
event.offsetLocation(m_offsetX, m_offsetY);
Log.d(TAG, "ACTION_POINTER_DOWN X " + event.getX(actionIndex) + " Y " + event.getY(actionIndex));
type = GetButton(event.getX(actionIndex), event.getY(actionIndex));
switch (type) {
case UP:
case DOWN:
case LEFT:
case RIGHT:
findViewById(R.id.pad).setPressed(true);
DoMove(type);
break;
case FIRE:
findViewById(R.id.fire).setPressed(true);
if (pMe.Fire()) {
AudioPool.Play(m_soundId[AudioID.AUDIO_FIRE.ordinal()], GetCurVolume(), 0);
}
break;
default:
break;
}
break;
case MotionEvent.ACTION_POINTER_UP:
// 先调整事件的坐标相对原点
event.offsetLocation(m_offsetX, m_offsetY);
Log.d(TAG, "ACTION_POINTER_UP X " + event.getX(actionIndex) + " Y " + event.getY(actionIndex));
type = GetButton(event.getX(actionIndex), event.getY(actionIndex));
switch (type) {
case UP:
case DOWN:
case LEFT:
case RIGHT:
findViewById(R.id.pad).setPressed(false);
pMe.SetDir(Dir.NONE);
break;
case FIRE:
findViewById(R.id.fire).setPressed(false);
break;
default:
findViewById(R.id.pad).setPressed(false);
findViewById(R.id.fire).setPressed(false);
pMe.SetDir(Dir.NONE);
break;
}
break;
default: // FOR OTHER EVENTS
break;
}