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