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.xml
和slide_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);
}
}
``