web-dev-qa-db-fra.com

SwipeRefreshLayout désactiver l'animation de glisser sur glisser vers le bas

Est-il possible de désactiver l'animation SwipeRefreshLayout glisser sur glisser vers le bas sans personnalisation de classe?

38
Alexander Zhak

Essayez d'appeler:

setEnabled(false)

sur votre vue SwipeRefreshLayout.

71
carloshwa

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;
}
12
Alexander Zhak

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);
5
Sylvain Pennec