Android 控制GridViewPager的[停止]垂直和水平[滑动]运动

Android 控制GridViewPager的[停止]垂直和水平[滑动]运动,android,android-fragments,android-viewpager,android-view,wear-os,Android,Android Fragments,Android Viewpager,Android View,Wear Os,我在我的“MainActivity”中设置了一个GridViewpager,其中包含各种片段,作为Android Wear应用程序的单独屏幕。我的用例要求在某些屏幕上同时允许水平和垂直运动,但是,在执行某个动作之前,某些屏幕应该只允许水平运动(同样也只允许垂直运动) 我查看了一些其他线程,它们显示了如何完全启用/禁用滚动运动。但是,我想分别控制垂直/水平运动。我自己也尝试过实现它,但这种实现似乎非常不可靠(当水平或垂直运动被禁止时)。首先,在反复尝试时,它有时会发出轻微的抖动。其次,在主要使用大

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

我查看了一些其他线程,它们显示了如何完全启用/禁用滚动运动。但是,我想分别控制垂直/水平运动。我自己也尝试过实现它,但这种实现似乎非常不可靠(当水平或垂直运动被禁止时)。首先,在反复尝试时,它有时会发出轻微的抖动。其次,在主要使用大型
ImageView
的屏幕上,当试图将手指放在ImageView本身上滚动时,它有时似乎根本不起作用(interceptouchevent实现中的
有问题吗?)

下面是我的“LockableGridViiewPager.java”的代码:


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

您可以覆盖CanScrollHorizontal()和CanScrollVertical(),并根据其他条件返回true或false。

您可以覆盖CanScrollHorizontal()和CanScrollVertical()然后根据您拥有的其他条件返回true或false。

我试图在我的自定义
GridViewPager
类中重写这些方法,并简单地返回
false
,但它似乎没有做任何更改。官方文件也没有提到这些功能。但是,
canScrollHorizontal()
ViewPager
类的官方文档中有,它说该方法用于“检查”滚动功能。我做得对吗?我试图在自定义的
GridViewPager
类中重写这些方法,并简单地返回
false
,但似乎没有做任何更改。官方文件也没有提到这些功能。但是,
canScrollHorizontal()
ViewPager
类的官方文档中有,它说该方法用于“检查”滚动功能。我做得对吗?
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);
}
}