我在“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);
}
}
任何帮助将不胜感激。感谢。
答案 0 :(得分:0)
您可以覆盖canScrollHorizontally()和canScrollVertically(),并根据您拥有的其他条件返回true或false。