控制[停止] GridViewPager

时间:2015-12-08 07:00:27

标签: android android-fragments android-viewpager android-view wear-os

我在“MainActivity”中设置了GridViewpager,其中包含各种片段作为Android Wear应用的单独屏幕。我的用例要求在某些屏幕上允许水平和垂直运动,但是,某些屏幕应该只允许水平运动(同样只允许垂直运动),直到执行某个动作。

我看了一些其他线程,展示了如何完全启用/禁用滚动。但是,我想单独控制垂直/水平运动。我试图自己实现它,但是这个实现似乎非常不可靠(当不允许水平或垂直运动时)。首先,在重复尝试时,它有时会产生轻微的抖动。其次,在主要是大ImageView的屏幕上,有时候尝试通过将手指放在ImageView本身上滚动(OnInterceptTouchEvent实现有问题?)时,它似乎根本不起作用。)

这是我的“LockableGridViiewPager.java”的代码:

public class LockableGridViewPager extends GridViewPager {

private boolean verticalScrollable = true;
private boolean horizontalScrollable = true;

float initialX, currentX, dx;
float initialY, currentY, dy;

public boolean isHorizontalScrollable() {
    return horizontalScrollable;
}

public void setHorizontalScrollable(boolean horizontalScrollable) {
    this.horizontalScrollable = horizontalScrollable;
}

public boolean isVerticalScrollable() {
    return verticalScrollable;
}

public void setVerticalScrollable(boolean verticalScrollable) {
    this.verticalScrollable = verticalScrollable;
}

public boolean isScrollable() {
    return isHorizontalScrollable() || isVerticalScrollable();
}

public LockableGridViewPager(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
}

public LockableGridViewPager(Context context, AttributeSet attrs) {
    super(context, attrs);
}

public LockableGridViewPager(Context context) {
    super(context);
}

@Override
public boolean onTouchEvent(MotionEvent ev) {
    switch (ev.getAction()) {
        case MotionEvent.ACTION_DOWN:
            if (isScrollable()) {
                initialX = ev.getX();
                initialY = ev.getY();

                super.onTouchEvent(ev);
            }

            return isScrollable();

        case MotionEvent.ACTION_MOVE:
            currentX = ev.getX();
            currentY = ev.getY();

            dx = Math.abs(currentX - initialX);
            dy = Math.abs(currentY - initialY);

            if (isHorizontalScrollable()) {
                if (dx > dy) {
                    return super.onTouchEvent(ev);
                }
            }


            if (isVerticalScrollable()) {
                if (dy > dx) {
                    return super.onTouchEvent(ev);
                }
            }

            return true;


        default:
            return super.onTouchEvent(ev);
    }
}

@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
    return isScrollable() && super.onInterceptTouchEvent(ev);
}
}

任何帮助将不胜感激。感谢。

1 个答案:

答案 0 :(得分:0)

您可以覆盖canScrollHorizo​​ntally()和canScrollVertically(),并根据您拥有的其他条件返回true或false。