Est-il possible de désactiver l'animation SwipeRefreshLayout
glisser sur glisser vers le bas sans personnalisation de classe?
Essayez d'appeler:
setEnabled(false)
sur votre vue SwipeRefreshLayout.
Eh bien, la désactivation de SwipeLayoutAnimanion semblait être une tâche assez simple, mais cela impliquait la réplication de la classe Android.support.v4.widget.SwipeRefreshLayout
Dans son projet.
Plonger dans le code source révélera que SwipeRefreshLayout
se compose de trois classes:
Les trois classes devraient être incluses dans le projet. SwipeRefreshLayout
peut alors être personnalisé comme suit:
Ajoutez une nouvelle méthode publique qui contrôlera soit la mise en page devrait suivre le geste de balayage vers le bas ou non:
private boolean mLayoutMovementEnabled = true;
public void setLayoutMovementEnabled(boolean enabled) {
mLayoutMovementEnabled = enabled;
}
Tous les calculs associés sont effectués à l'intérieur de onTouchEvent()
. Pour désactiver la mise en page après le mouvement,
updateContentOffsetTop((int) (offsetTop));
la chaîne doit être remplacée par
if (mLayoutMovementEnabled) updateContentOffsetTop((int) (offsetTop));
La routine modifiée complète est ci-dessous.
@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;
}
Un moyen simple de désactiver le balayage consiste à définir la distance de déclenchement de la synchronisation à une valeur trop élevée pour être atteinte.
mSwipeLayout.setDistanceToTriggerSync(999999);