android - setcolorschemecolors - swiperefreshlayout recyclerview
SwipeRefreshLayout deshabilita la animaciĆ³n de arrastre al deslizar hacia abajo (3)
¿Es posible desactivar la animación de arrastre SwipeRefreshLayout
al deslizar hacia abajo sin personalizar la clase?
Bueno, deshabilitar SwipeLayoutAnimanion parecía ser una tarea bastante simple, pero implica la replicación de la clase android.support.v4.widget.SwipeRefreshLayout
dentro del proyecto.
El buceo en el código fuente revelará que SwipeRefreshLayout
consta de tres clases:
- android.support.v4.widget.SwipeRefreshLayout
- android.support.v4.widget.SwipeProgressBar
- android.support.v4.widget.BakedBezierInterpolator
Las tres clases deberían estar incluidas en el proyecto. Entonces SwipeRefreshLayout
se puede personalizar de la siguiente manera:
Agregue un nuevo método público que controlará cualquiera de los diseños, debe seguir o no el gesto de deslizar hacia abajo:
private boolean mLayoutMovementEnabled = true;
public void setLayoutMovementEnabled(boolean enabled) {
mLayoutMovementEnabled = enabled;
}
Todos los cálculos relacionados se realizan dentro de onTouchEvent()
. Para deshabilitar el diseño siguiendo el movimiento,
updateContentOffsetTop((int) (offsetTop));
cadena debe ser cambiado a
if (mLayoutMovementEnabled) updateContentOffsetTop((int) (offsetTop));
La rutina completa modificada está abajo.
@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;
}
Intenta llamar:
setEnabled(false)
en su vista SwipeRefreshLayout.
Una forma simple de desactivar el deslizamiento es establecer la distancia para activar la sincronización a un valor demasiado alto para ser alcanzado.
mSwipeLayout.setDistanceToTriggerSync(999999);