Как добиться этого эффекта в Snackbar - PullRequest
0 голосов
/ 08 сентября 2018

Вот изображение: enter image description here

Есть несколько функций:

  • Выйти и немедленно исчезнуть.
  • У него есть запас. Поскольку эффект по умолчанию соответствует ширине родительского элемента.

Теперь я уже решил проблему с запасом. Но я не знаю, как добиться эффекта анимации. А вот и мой код:

snackbar_animation.xml:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="500"
android:fillAfter="true"
android:shareInterpolator="true">

<alpha
    android:fromAlpha="0.1"
    android:toAlpha="1" />

<scale
    android:fromXScale="0.5"
    android:fromYScale="0.0"
    android:toXScale="1"
    android:toYScale="1"/>

</set>

MainActivity:

public class MainActivity extends AppCompatActivity implements View.OnClickListener{

private Button snackbar;
private CoordinatorLayout coordinatorLayout;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.snackbar_test);

    coordinatorLayout = findViewById(R.id.coordinator);

    snackbar = findViewById(R.id.show_snackbar);
    snackbar.setOnClickListener(this);
}

@Override
public void onClick(View view) {
    switch (view.getId()){
        case R.id.show_snackbar:
            showSnackbar();
            break;
    }
}

private void showSnackbar(){
    Snackbar snackbar = Snackbar.make(coordinatorLayout,"i am a snack bar",Snackbar.LENGTH_SHORT);

    View sbView = snackbar.getView();

    // add animation
    Animation animation = AnimationUtils.loadAnimation(this,R.anim.snackbar_animation);
    sbView.setAnimation(animation);

    // modify margin
    CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) sbView.getLayoutParams();
    params.setMargins(params.leftMargin + 50,
            params.topMargin,
            params.rightMargin + 50,
            params.bottomMargin + 50);

    sbView.setLayoutParams(params);

    // show snackbar
    snackbar.show();
}

activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/coordinator"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent">

    <Button
        android:id="@+id/show_snackbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="8dp"
        android:paddingTop="10dp"
        android:text="show snackbar" />

</android.support.design.widget.CoordinatorLayout>

Если есть что-то еще, что мне нужно знать об этом вопросе, просто прокомментируйте ниже этот вопрос. Например: оценить анимацию или другие вещи. Я новичок в анимации, поэтому, если вы знаете отличные учебные материалы, скажите мне, Спасибо.

1 Ответ

0 голосов
/ 08 сентября 2018

Прочтите это . setAnimation() просто ставит в очередь анимацию. На самом деле ничего не начинается. SnackBar также не вызывает startAnimation, когда его показывают.

Однако, даже если вы используете startAnimation(), ваш код, вероятно, не будет работать как есть. Вам необходимо изначально установить масштаб вашего SnackBar на 0, чтобы он имел правильное начальное значение.

Вы должны использовать SnackBar#setCallback() и затем запустить анимацию шоу в методе onShow(). Установите анимацию отклонения в методе onDismiss().

...