Я использую библиотеку CustomSnackBar из GITHUB,

Проверьте это: https: //github.com/TakeoffAndroid/CustomSnackBar/blob/master/app/src/main/java/com/takeoffandroid/customsnackbar/SnackBar.java

Это так полезно для настройки моей закусочной.

Но я хочу ОТКЛЮЧИТЬ анимацию открытия закусочной, теперь она открывается с нижнего экрана с некоторой продолжительностью (Y-перевод).

Есть ли способ показать закусочную без анимации, отключить анимацию или уменьшить продолжительность анимации до 0 (нуля) ??

  • Версия Android Studio: 2.1
  • compileSdkVersion 23
  • buildToolsVersion "23.0.3"
  • Design Lib: com.android.support:design:23.3.0 Заранее спасибо,
2
Chandrahasan 10 Май 2016 в 21:37

2 ответа

Лучший ответ

В текущей версии ( design-24.1.0 ) простое исправление кажется невозможным, но есть способ взломать его (см. Ниже)

Внутри Snackbar вызывается метод showView для отображения снекбара.

final void showView() {
    [...]

    if (ViewCompat.isLaidOut(mView)) {
        if (shouldAnimate()) {
            // If animations are enabled, animate it in
            animateViewIn();
        } else {
            // Else if anims are disabled just call back now
            onViewShown();
        }
    }

    [...]
}

private boolean shouldAnimate() {
        return !mAccessibilityManager.isEnabled();
}

showView является окончательным, поэтому мы ничего не можем сделать, плюс мы не можем прикоснуться ни к одному из кодов, определяющих, следует ли анимировать панель закусок.

Что касается самой анимации, методы animateViewIn и animateViewOut являются частными, и весь код внутри полагается на закрытые поля или константы.

Изменить:

Что я делаю для имитации отсутствия анимации, так это видимость ручки Snackbar

Snackbar snackbar = Snackbar.make(view, message, Snackbar.LENGTH_INDEFINITE);

snackbar.getView().setVisibility(View.INVISIBLE);

[...]

snackbar.setCallback(new Snackbar.Callback() {
      @Override
      public void onShown(Snackbar snackbar) {
        super.onShown(snackbar);

        snackbar.getView().setVisibility(View.VISIBLE);
      }
    });

snackbar.show();

И поскольку в моем случае я контролирую закрытие Snackbar, я могу это сделать

  snackbar.getView().setVisibility(View.GONE);

  snackbar.dismiss();

К сожалению, я не думаю, что этот последний шаг будет легким для недетерминированных Snackbar. Способ взломать это - запланировать setVisibility (View.INVISIBLE) на длительность LENGTH_SHORT и LENGTH_LONG.

В SnackbarManager . У нас нет доступа к константам, но мы можем скопировать и вставить

private static final int SHORT_DURATION_MS = 1500;
private static final int LONG_DURATION_MS = 2750;

Затем в вашем коде внутри Callback.onShown ()

handler.postDelayed(new Runnable() {
          @Override
          public void run() {
            snackbar.getView().setVisibility(View.INVISIBLE);
          }
        }, LONG_DURATION_MS or SHORT_DURATION_MS)

Сам не тестировал, может, стоит вызвать перед onShown. Если кто-то попробует, отредактируйте пост или дайте мне знать в комментариях.

4
Maragues 22 Июл 2016 в 08:14

Для пользователя kotlin вы можете попробовать следующий код:

showError(message: String, viewGroup: ViewGroup) {

val duration: Long = 2000

val snackBar = Snackbar.make(viewGroup, message, duration.toInt())
snackBar.withColor(ContextCompat.getColor(this, com.sdei.sdeiarchitecture.R.color.colorAccent))

val params = snackBar.view.layoutParams as FrameLayout.LayoutParams
params.gravity = Gravity.TOP
snackBar.view.layoutParams = params

val messageTv = snackBar.view.findViewById(com.google.android.material.R.id.snackbar_text) as TextView
messageTv.textSize = 20.0f

snackBar.view.visibility = View.INVISIBLE
snackBar.addCallback(object : Snackbar.Callback() {
    override fun onShown(snackbar: Snackbar?) {
        super.onShown(snackbar)
        snackbar!!.view.visibility = View.VISIBLE
        Handler().postDelayed({
            snackbar.view.visibility = View.INVISIBLE
        }, duration)
    }
})

snackBar.show()

}

Надеюсь, это поможет вам.

1
Rahul Sharma 10 Янв 2019 в 07:38