是否可以在没有类自定义的情况下在向下滑动时禁用SwipeRefreshLayout
拖动动画?
问问题
26881 次
3 回答
76
尝试调用:
setEnabled(false)
在您的 SwipeRefreshLayout 视图上。
于 2014-12-28T15:06:38.953 回答
12
好吧,禁用 SwipeLayoutAnimanion 似乎是一项相当简单的任务,但它涉及到android.support.v4.widget.SwipeRefreshLayout
在一个项目中复制类。
深入研究源代码会发现,它SwipeRefreshLayout
由三个类组成:
- android.support.v4.widget.SwipeRefreshLayout
- android.support.v4.widget.SwipeProgressBar
- android.support.v4.widget.BakedBezierInterpolator
所有三个类都应包含在项目中。然后SwipeRefreshLayout
可以定制如下:
添加一个新的公共方法,该方法将控制任一布局是否应遵循向下滑动手势:
private boolean mLayoutMovementEnabled = true;
public void setLayoutMovementEnabled(boolean enabled) {
mLayoutMovementEnabled = enabled;
}
所有相关的计算都在内部进行onTouchEvent()
。要在移动后禁用布局,
updateContentOffsetTop((int) (offsetTop));
字符串应更改为
if (mLayoutMovementEnabled) updateContentOffsetTop((int) (offsetTop));
完整的修改例程如下。
@Override
public boolean onTouchEvent(MotionEvent event) {
final int action = event.getAction();
boolean handled = false;
switch (action) {
case MotionEvent.ACTION_DOWN:
mCurrPercentage = 0;
mDownEvent = MotionEvent.obtain(event);
mPrevY = mDownEvent.getY();
break;
case MotionEvent.ACTION_MOVE:
if (mDownEvent != null && !mReturningToStart) {
final float eventY = event.getY();
float yDiff = eventY - mDownEvent.getY();
if (yDiff > mTouchSlop) {
// User velocity passed min velocity; trigger a refresh
if (yDiff > mDistanceToTriggerSync) {
// User movement passed distance; trigger a refresh
startRefresh();
handled = true;
break;
} else {
// Just track the user's movement
setTriggerPercentage(
mAccelerateInterpolator.getInterpolation(
yDiff / mDistanceToTriggerSync));
float offsetTop = yDiff;
if (mPrevY > eventY) {
offsetTop = yDiff - mTouchSlop;
}
if (mLayoutMovementEnabled) updateContentOffsetTop((int) (offsetTop));
if (mPrevY > eventY && (mTarget.getTop() < mTouchSlop)) {
// If the user puts the view back at the top, we
// don't need to. This shouldn't be considered
// cancelling the gesture as the user can restart from the top.
removeCallbacks(mCancel);
} else {
updatePositionTimeout();
}
mPrevY = event.getY();
handled = true;
}
}
}
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
if (mDownEvent != null) {
mDownEvent.recycle();
mDownEvent = null;
}
break;
}
return handled;
}
于 2014-09-28T22:13:28.363 回答
8
禁用滑动的一种简单方法是将触发同步的距离设置为过高而无法达到的值。
mSwipeLayout.setDistanceToTriggerSync(999999);
于 2016-02-19T10:56:43.677 回答