搜尋

首頁  >  問答  >  主體

android - MotionEvent.ACTION_MOVE 在onTouchEvent返回false情况下事件仍然上传

viewpage里面放了一个imageview,MotionEvent.ACTION_MOVE里面设置imageview随着手指滑动,onTouchEvent是返回了true。纵向滑动没有问题,横向滑动会出现滑动一点点距离就划不动了,viewpage开始滑动。这是什么情况的。viewpage是横向的。

PHP中文网PHP中文网2773 天前720

全部回覆(1)我來回復

  • PHP中文网

    PHP中文网2017-04-17 17:49:46

    因為ViewPager.onInterceptTouchEvent()在一般情況下會攔截橫向的滑動, 所以你的圖片收不到MotionEvent.ACTION_MOVE動作.ViewPager.onInterceptTouchEvent()在一般情况下会拦截横向的滑动, 所以你的图片收不到MotionEvent.ACTION_MOVE动作.

    解决思路大致为:
    ViewPager.onInterceptTouchEvent()MotionEvent.ACTION_MOVE下有一下代码可以不拦截横向滑动

    if (dx != 0 && !isGutterDrag(mLastMotionX, dx) &&
                            canScroll(this, false, (int) dx, (int) x, (int) y)) {
                        // Nested view has scrollable area under this point. Let it be handled there.
                        mLastMotionX = x;
                        mLastMotionY = y;
                        mIsUnableToDrag = true;
                        return false;
                    }

    只要你能执行这段代码, ViewPager就不会拦截这次的横向滑动, 关键的方法应该是canScroll()

    源码如下

    protected boolean canScroll(View v, boolean checkV, int dx, int x, int y) {
            if (v instanceof ViewGroup) {
                final ViewGroup group = (ViewGroup) v;
                final int scrollX = v.getScrollX();
                final int scrollY = v.getScrollY();
                final int count = group.getChildCount();
                // Count backwards - let topmost views consume scroll distance first.
                for (int i = count - 1; i >= 0; i--) {
                    // TODO: Add versioned support here for transformed views.
                    // This will not work for transformed views in Honeycomb+
                    final View child = group.getChildAt(i);
                    if (x + scrollX >= child.getLeft() && x + scrollX < child.getRight() &&
                            y + scrollY >= child.getTop() && y + scrollY < child.getBottom() &&
                            canScroll(child, true, dx, x + scrollX - child.getLeft(),
                                    y + scrollY - child.getTop())) {
                        return true;
                    }
                }
            }
    
            return checkV && ViewCompat.canScrollHorizontally(v, -dx);
        }

    大致就是判断里面的子控件是否可以横向滑动
    因为你里面最后是一个ImageView, 所以最后关键就是
    ViewCompat.canScrollHorizontally(v, -dx);当v时ImageView的时候要返回true

    如果你使用的版本较高的话, 实际执行的就是ImageView.canScrollHorizontally()方法, 这里面的代码很简单, 就不贴出来了, 这个方法直接继承了View.canScrollHorizontally(), 返回的是false, 所以解决方案想到2个

    1. 用一个可以滑动的控件作为ImageView的父控件

    2. 重写ImageView.canScrollHorizontally(), 令到它返回true
      解決想法大致為:

      ViewPager.onInterceptTouchEvent()MotionEvent.ACTION_MOVE下有一下代碼可以不攔截橫向滑動
    3. rrreee
    只要你能執行這段程式碼, ViewPager就不會攔截這次的橫向滑動, 關鍵的方法應該是canScroll()

    源碼如下🎜 rrreee 🎜大致就是判斷裡面的子控制項是否可以橫向滑動🎜因為你裡面最後是一個ImageView, 所以最後關鍵就是🎜ViewCompat.canScrollHorizo​​ntally(v, -dx);當v時ImageView的時候要回傳true🎜 🎜如果你使用的版本較高的話, 實際執行的就是ImageView.canScrollHorizo​​ntally()方法, 裡面的程式碼很簡單, 就不貼出來了, 這個方法直接繼承了View .canScrollHorizo​​ntally(), 回傳的是false, 所以解決方案想到2個🎜
    1. 🎜用一個可以滑動的控制項作為ImageView的父控制項🎜🎜
    2. 🎜重寫ImageView.canScrollHorizo​​ntally(), 令到它回傳true🎜推薦方法1🎜🎜 🎜 🎜上面的分析沒有寫程式驗證, 可能有錯, 歡迎指正🎜

      回覆
      0
  • 取消回覆