android的多点触摸(附自己的部分代码)

[中文是转的]
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;
}



                
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值