android里是不是有个矛盾的问题,如果下一级的onTouchEvent返回true 那么他的上一级的onTouchEvent就不会被调用,如果返回false,那么他本身的ACTION_MOVE 动作又不能被识别,如果想两者兼顾就不行吗

解决方案 »

  1.   

    重写 onTouchEvent 方法 就可以解决这一点 、、
      

  2.   

    哥哥们,就是重写 onTouchEvent  的 ,返回true,事件传不到父,返回false,自身move动作不会执行。(是一个这样的效果:在Gallery 的item里,有一个scrollview(里面是文本), 上下滑动scrollview滚动,左右滑动Gallery 滚动)
      

  3.   

    返回true,就代表了自己处理,返回false交给父类处理,这有什么矛盾的,要不这样,子类父类同时处理你怎么把他们分开。
    你要的效果逻辑已经很清楚了,上下滑动你处理scrollview,左右滑你处理Gallery就好了,都返回true
      

  4.   

    返回true前重新new一个MotionEvent再用dispatchTouchEvent交给他的上一级处理试试
      

  5.   

    这是个办法,或者你重载的时候不调BASE.onTouchEvent 
      

  6.   

    dispatchTouchEvent不是向下分派用的吗,怎样重新new一个MotionEvent再用dispatchTouchEvent交给他的上一级处理
      

  7.   

    @Override
        public boolean onTouchEvent(MotionEvent ev) {        if (ev.getAction() == MotionEvent.ACTION_DOWN && ev.getEdgeFlags() != 0) {
                // Don't handle edge touches immediately -- they may actually belong to one of our
                // descendants.
                return false;
            }
            
            if (!canScroll()) {
                return false;
            }        if (mVelocityTracker == null) {
                mVelocityTracker = VelocityTracker.obtain();
            }
            mVelocityTracker.addMovement(ev);        final int action = ev.getAction();
            final float y = ev.getY();        switch (action) {
                case MotionEvent.ACTION_DOWN:
                    /*
                    * If being flinged and user touches, stop the fling. isFinished
                    * will be false if being flinged.
                    */
                    if (!mScroller.isFinished()) {
                        mScroller.abortAnimation();
                    }                // Remember where the motion event started
                    mLastMotionY = y;
                    break;
                case MotionEvent.ACTION_MOVE:
                    // Scroll to follow the motion event
                    final int deltaY = (int) (mLastMotionY - y);
                    mLastMotionY = y;                if (deltaY < 0) {
                        if (mScrollY > 0) {
                            scrollBy(0, deltaY);
                        }
                    } else if (deltaY > 0) {
                        final int bottomEdge = getHeight() - mPaddingBottom;
                        final int availableToScroll = getChildAt(0).getBottom() - mScrollY - bottomEdge;
                        if (availableToScroll > 0) {
                            scrollBy(0, Math.min(availableToScroll, deltaY));
                        }
                    }
                    break;
                case MotionEvent.ACTION_UP:
                    final VelocityTracker velocityTracker = mVelocityTracker;
                    velocityTracker.computeCurrentVelocity(1000, mMaximumVelocity);
                    int initialVelocity = (int) velocityTracker.getYVelocity();                if ((Math.abs(initialVelocity) > mMinimumVelocity) && getChildCount() > 0) {
                        fling(-initialVelocity);
                    }                if (mVelocityTracker != null) {
                        mVelocityTracker.recycle();
                        mVelocityTracker = null;
                    }
            }
            return true;
        }这是scrollview 中的 onTouchEvent 源码。 LZ可以在判断为 ACTION_MOVE 时 返回 true,再其他action时返回false 让上一层去处理这个操作。
      

  8.   


    public boolean dispatchTouchEvent (MotionEvent event)
    Pass the touch screen motion event down to the target view, or this view if it is the target.
    Parameters
    View的dispatchTouchEvent是可以直接分派触摸事件到指定的view上的 手册上没说是向下分派,可以试试 我没验证过哈
      

  9.   


    不用那么麻烦吧?你只用判断scrollview 里接受的动作是不是 上下滑动,如果是就consume 掉,如果不是就return false。
      

  10.   

    这样不行吧,dispatchTouchEvent 参数里没有指定的view,如何指定,分派到上一级
      

  11.   

    还有fishmen26兄,这样也不行啊,你说"在判断为 ACTION_MOVE 时 返回 true,再其他action时返回false" 可是 当ACTION_DOWN里返回false的话,根本就没有其他动作了,更别说ACTION_MOVE 了
      

  12.   


    哥,你可以不对ACTION_DOWN这个操作进行判断三。
    判断的条件只有一个,是否进行了ACTION_MOVE操作
      

  13.   

    我悔过,自己没有搞清楚问题就乱发言了。经过研究发现情况是这样子的:如果两个view是包含关系(就是楼主说的情况),那么同一时间只能由一个view来处理这个事件。
    如果想捕获多个操作,只能在两个不属于包含关系的view中分别进行处理。