web-dev-qa-db-ja.com

SwipeRefreshLayoutは下にスワイプするとドラッグアニメーションを無効にします

クラスをカスタマイズせずにスワイプでSwipeRefreshLayoutドラッグアニメーションを無効にすることは可能ですか?

38
Alexander Zhak

呼び出してみてください:

setEnabled(false)

swipeRefreshLayoutビューで。

71
carloshwa

さて、SwipeLayoutAnimanionを無効にすることはかなり単純なタスクのように見えますが、プロジェクト内での_Android.support.v4.widget.SwipeRefreshLayout_クラスの複製を伴います。

ソースコードを調べると、SwipeRefreshLayoutが3つのクラスで構成されていることがわかります。

3つのクラスすべてをプロジェクトに含める必要があります。次に、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;
}
_
12
Alexander Zhak

スワイプを無効にする簡単な方法の1つは、同期をトリガーする距離を、到達するには大きすぎる値に設定することです。

mSwipeLayout.setDistanceToTriggerSync(999999);
5
Sylvain Pennec