Можно ли отключить анимацию перетаскивания SwipeRefreshLayout
при прокрутке вниз без настройки класса?
SwipeRefreshLayout отключить анимацию перетаскивания
Ответ 1
Попробуйте позвонить:
setEnabled(false)
в представлении SwipeRefreshLayout.
Ответ 2
Ну, отключение 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 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;
}
Ответ 3
Один простой способ отключить салфетки - установить расстояние, чтобы вызвать синхронизацию с некоторым значением, слишком высоким для достижения.
mSwipeLayout.setDistanceToTriggerSync(999999);