【问题标题】:How to achieve this effect in Snackbar如何在 Snackbar 中实现这个效果
【发布时间】:2019-02-13 07:37:57
【问题描述】:

这是动图:

有几个特点:

  • 淡入并立即淡出。
  • 它有边距。因为默认效果是匹配父宽度。

现在我已经解决了边距问题。但我不知道如何实现动画效果。这是我的代码:

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>

主活动:

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>

如果我对这个问题还有什么需要了解的,请在这个问题下方评论。例如:价值动画或其他东西。我是动画新手,所以如果你知道很棒的学习资料,告诉我,谢谢。

【问题讨论】:

    标签: android animation material-design snackbar


    【解决方案1】:

    Read thissetAnimation() 只是对动画进行排队。它实际上并没有开始任何事情。 SnackBar 在显示时也不会调用startAnimation

    但是,即使您使用startAnimation(),您的代码也可能无法按原样运行。您最初需要将 SnackBar 的比例设置为 0,因此它处于正确的起始值。

    您应该使用SnackBar#setCallback(),然后在onShow() 方法中启动您的显示动画。在 onDismiss() 方法中设置您的关闭动画。

    【讨论】:

    • 其实setAnimation()也可以。让我困惑的是,动画xml的效果是如何完成的。因为snackbar有从下到上的默认动画,但是现在,我想要的效果是淡入。
    猜你喜欢
    • 2018-02-25
    • 1970-01-01
    • 1970-01-01
    • 2016-05-25
    • 1970-01-01
    • 1970-01-01
    • 2021-10-05
    • 1970-01-01
    • 2013-08-05
    相关资源
    最近更新 更多