SwipeRefreshLayout禁用下拉拖动动画

39

是否有可能在向下滑动时禁用SwipeRefreshLayout的拖动动画,而无需进行类自定义?


没有办法。即使使用子类也是不可能的(没有反射)。 - Blackbelt
3个回答

76

尝试拨打:

setEnabled(false)
在您的SwipeRefreshLayout视图上。

1
不,这会完全禁用控件,而不仅仅是动画。这不是所需的。 - Alexander Zhak
7
调用此方法会禁用手势,但仍可以通过调用 setRefreshing(true) 方法以编程方式显示刷新动画。 - carloshwa
@AlexanderZhak,这对我来说并没有禁用内部的ListView。我仍然可以点击列表视图中的项目,将它们向侧面滑动等操作,而且ListView的行为就像没有SwipeRefreshLayout一样。 - Lahiru Chandima
如果您在onCreate()中调用setRefreshing(true)时遇到问题,支持库的24.2.0版本修复了一个错误: https://code.google.com/p/android/issues/detail?id=77712 - carloshwa
很高兴听到他们解决了这个问题。 - Alexander Zhak
显示剩余2条评论

12

Well, disabling SwipeLayoutAnimanion appeared to be a rather simple task, but it involves replication of android.support.v4.widget.SwipeRefreshLayout class inside one's project.

Diving in source code will reveal, that SwipeRefreshLayout consists of three classes:

All three classes should be included in the project. Then SwipeRefreshLayout can be customized as follows:

Add a new public method which will control either layout should follow the swipe down gesture or not:

private boolean mLayoutMovementEnabled = true;

public void setLayoutMovementEnabled(boolean enabled) {
    mLayoutMovementEnabled = enabled;
}

All related computations are performed inside onTouchEvent(). To disable layout following the movement,

updateContentOffsetTop((int) (offsetTop)); string should be changed to

if (mLayoutMovementEnabled) updateContentOffsetTop((int) (offsetTop));

The complete modified routine is below.

@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;
}


8

禁用滑动的简单方法之一是将触发同步的距离设置为无法达到的高值。

mSwipeLayout.setDistanceToTriggerSync(999999);

1
似乎SwipeRefreshLayout.setEnabled()的行为已经改变,而这实际上是目前唯一可行的解决方案——如果我仍然想显示进度指示器,但禁用手势。 - petrnohejl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接