Android Activity 从底部弹出

1. 前言

在Android开发中,常常需要实现从底部弹出一个Activity的效果,比如菜单、对话框等等。本文将介绍如何使用Android的动画和样式来实现从底部弹出的效果,并给出相应的代码示例。

2. 实现思路

要实现从底部弹出的效果,首先需要定义一个样式,该样式定义了Activity的进入和退出动画。然后,在需要弹出的Activity中应用该样式,并在代码中调用相应的动画效果。

3. 定义样式

首先,我们需要在res/values/styles.xml文件中定义一个样式,命名为BottomDialogStyle

<style name="BottomDialogStyle" parent="@android:style/Theme.Dialog">
    <item name="android:windowAnimationStyle">@style/BottomDialogAnimation</item>
</style>

<style name="BottomDialogAnimation">
    <item name="android:windowEnterAnimation">@anim/slide_in_bottom</item>
    <item name="android:windowExitAnimation">@anim/slide_out_bottom</item>
</style>

上述代码中,我们通过继承Theme.Dialog样式来创建BottomDialogStyle,并定义了windowAnimationStyle属性为BottomDialogAnimation。接着,我们定义了BottomDialogAnimation样式,其中windowEnterAnimation属性为slide_in_bottom动画,windowExitAnimation属性为slide_out_bottom动画。

4. 定义动画

接下来,我们需要在res/anim目录下定义两个动画文件,分别为slide_in_bottom.xmlslide_out_bottom.xml

slide_in_bottom.xml

<set xmlns:android="
    <translate
        android:duration="300"
        android:fromYDelta="100%"
        android:toYDelta="0%" />
</set>

slide_out_bottom.xml

<set xmlns:android="
    <translate
        android:duration="300"
        android:fromYDelta="0%"
        android:toYDelta="100%" />
</set>

上述代码中,我们使用了TranslateAnimation来实现从底部弹出的效果。slide_in_bottom.xml中,我们将fromYDelta属性设置为100%,表示从底部开始进入,toYDelta属性设置为0%,表示动画结束时位于屏幕上方的位置。slide_out_bottom.xml中,我们将fromYDelta属性设置为0%,表示从当前位置开始退出,toYDelta属性设置为100%,表示动画结束时位于屏幕下方的位置。

5. 应用样式和启动动画

在需要弹出的Activity的onCreate()方法中,将样式应用到当前Activity,并启动动画:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setTheme(R.style.BottomDialogStyle); // 应用样式
    setContentView(R.layout.activity_bottom_dialog);

    // 启动进入动画
    overridePendingTransition(R.anim.slide_in_bottom, 0);
}

@Override
public void finish() {
    super.finish();
    // 启动退出动画
    overridePendingTransition(0, R.anim.slide_out_bottom);
}

上述代码中,我们通过调用setTheme()方法将BottomDialogStyle应用到当前Activity。在setContentView()之后,我们调用overridePendingTransition()方法启动进入动画,其中R.anim.slide_in_bottom表示进入动画。在finish()方法中,我们调用overridePendingTransition()方法启动退出动画,其中R.anim.slide_out_bottom表示退出动画。

6. 示例代码

下面是一个完整的示例代码,实现了从底部弹出一个菜单的效果:

// MainActivity.java
public class MainActivity extends AppCompatActivity {

    private Button btnOpenMenu;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        btnOpenMenu = findViewById(R.id.btn_open_menu);
        btnOpenMenu.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                openMenu();
            }
        });
    }

    private void openMenu() {
        Intent intent = new Intent(MainActivity.this, MenuActivity.class);
        startActivity(intent);
    }
}
``