material-components/material-components-android · error · IllegalArgumentException

Invalid slide direction: > slideEdge <

Error message

Invalid slide direction: > slideEdge <

What it means

When a SlideDistanceProvider appear-animation starts, createTranslationAppearAnimator switches on the configured slideEdge and supports only Gravity.LEFT, TOP, RIGHT, BOTTOM, START and END. Any other gravity flag (single unsupported values like Gravity.CENTER, or composite/bitmask flags such as Gravity.CENTER_VERTICAL, Gravity.FILL, TOP|START) misses every case and hits the default branch, throwing IllegalArgumentException('Invalid slide direction: ' + slideEdge).

Source

Thrown at lib/java/com/google/android/material/transition/platform/SlideDistanceProvider.java:157

        return createTranslationYAnimator(view, originalY - slideDistance, originalY, originalY);
      case Gravity.RIGHT:
        return createTranslationXAnimator(view, originalX - slideDistance, originalX, originalX);
      case Gravity.BOTTOM:
        return createTranslationYAnimator(view, originalY + slideDistance, originalY, originalY);
      case Gravity.START:
        return createTranslationXAnimator(
            view,
            isRtl(sceneRoot) ? originalX + slideDistance : originalX - slideDistance,
            originalX,
            originalX);
      case Gravity.END:
        return createTranslationXAnimator(
            view,
            isRtl(sceneRoot) ? originalX - slideDistance : originalX + slideDistance,
            originalX,
            originalX);
      default:
        throw new IllegalArgumentException("Invalid slide direction: " + slideEdge);
    }
  }

  private static Animator createTranslationDisappearAnimator(
      View sceneRoot, View view, @GravityFlag int slideEdge, @Px int slideDistance) {
    final float originalX = view.getTranslationX();
    final float originalY = view.getTranslationY();
    switch (slideEdge) {
      case Gravity.LEFT:
        return createTranslationXAnimator(view, originalX, originalX - slideDistance, originalX);
      case Gravity.TOP:
        return createTranslationYAnimator(view, originalY, originalY + slideDistance, originalY);
      case Gravity.RIGHT:
        return createTranslationXAnimator(view, originalX, originalX + slideDistance, originalX);
      case Gravity.BOTTOM:
        return createTranslationYAnimator(view, originalY, originalY - slideDistance, originalY);
      case Gravity.START:
        return createTranslationXAnimator(

View on GitHub (pinned to ac7e18efee)

Solutions

  1. Pass one of the six supported edge constants: Gravity.LEFT, Gravity.TOP, Gravity.RIGHT, Gravity.BOTTOM, Gravity.START or Gravity.END.
  2. If the value comes from config, validate it against a whitelist before calling setSlideEdge (see validationCode).
  3. Normalize composite gravities first with Gravity.absoluteGravityValue / by extracting a single edge, instead of forwarding the raw flag.
  4. Prefer START/END over LEFT/RIGHT so RTL layouts slide correctly.

Example fix

// before
provider.setSlideEdge(Gravity.CENTER); // throws on createAppear

// after
provider.setSlideEdge(Gravity.END);
Defensive patterns

Strategy: type-guard

Validate before calling

static final Set<Integer> SUPPORTED_EDGES = new HashSet<>(Arrays.asList(
    Gravity.LEFT, Gravity.TOP, Gravity.RIGHT, Gravity.BOTTOM,
    Gravity.START, Gravity.END));

int normalizeSlideEdge(int edge) {
  return SUPPORTED_EDGES.contains(edge) ? edge : Gravity.END; // sane default
}

Type guard

static boolean isSupportedSlideEdge(@GravityFlag int edge) {
  return edge == Gravity.LEFT || edge == Gravity.TOP || edge == Gravity.RIGHT
      || edge == Gravity.BOTTOM || edge == Gravity.START || edge == Gravity.END;
}

Prevention

When it happens

Trigger: Calling setSlideEdge(Gravity.CENTER), Gravity.NO_GRAVITY (0), Gravity.FILL, or a combined bitmask like Gravity.BOTTOM|Gravity.CENTER_HORIZONTAL on a SlideDistanceProvider/MaterialSharedAxis-style provider; reusing a gravity constant parsed from XML (android:gravity values) without narrowing it to an edge.

Common situations: Copy-pasting a layout's android:gravity (e.g., center) into setSlideEdge; storing the slide edge in preferences as a generic gravity int; refactoring from a side-drawer gravity that uses composite flags; Gravity.NO_GRAVITY leaking through when a binding is unset.

Related errors


AI-assisted analysis of material-components/material-components-android@ac7e18efee (2026-08-14). Data as JSON: /api/errors/f9afc87538123f94. Report an issue: GitHub.