クラスをカスタマイズせずにスワイプでSwipeRefreshLayout
ドラッグアニメーションを無効にすることは可能ですか?
呼び出してみてください:
setEnabled(false)
swipeRefreshLayoutビューで。
さて、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;
}
_
スワイプを無効にする簡単な方法の1つは、同期をトリガーする距離を、到達するには大きすぎる値に設定することです。
mSwipeLayout.setDistanceToTriggerSync(999999);