一、先看看效果图
实现半屏弹窗,背景半透明,可以使用Dialog或Activity来实现。
二、动画效果
实现从下往上弹出,从上往下关闭。
从下往上弹出:anim_slide_in_bottom.xml
<?xml version="1.0" encoding="utf-8"?><set xmlns:android="/apk/res/android"android:shareInterpolator="false"><translateandroid:duration="300"android:fromXDelta="0%"android:toXDelta="0%"android:fromYDelta="100%"android:toYDelta="0%"/></set>
从上往下弹出:anim_slide_out_bottom.xml
<?xml version="1.0" encoding="utf-8"?><set xmlns:android="/apk/res/android"android:shareInterpolator="false"><translateandroid:duration="300"android:fromXDelta="0%"android:toXDelta="0%"android:fromYDelta="0%"android:toYDelta="100%"/></set>
无动画效果no_anim.xml
<?xml version="1.0" encoding="utf-8"?><set xmlns:android="/apk/res/android"><translateandroid:duration="300"android:interpolator="@android:anim/decelerate_interpolator"android:fromXDelta="0%"android:toXDelta="0%"android:fromYDelta="0%"android:toYDelta="0%"/></set>
三、Dialog实现半屏弹窗
<resources><style name="bottom_dialog_bg_style" parent="@android:style/Theme.Dialog"><!-- 无标题 --><item name="android:windowNoTitle">true</item><item name="android:background">@android:color/transparent</item><!-- 背景透明 --><item name="android:windowBackground">@android:color/transparent</item><!-- 边框 --><item name="android:windowFrame">@null</item><!-- 是否浮现在activity之上 --><item name="android:windowIsFloating">true</item><!-- 半透明 --><item name="android:windowIsTranslucent">true</item><!-- 模糊 --><item name="android:backgroundDimEnabled">true</item><!-- 遮罩层 --><item name="android:backgroundDimAmount">0.5</item></style><style name="show_dialog_animStyle"><item name="android:windowEnterAnimation">@anim/anim_slide_in_bottom</item><item name="android:windowExitAnimation">@anim/anim_slide_out_bottom</item></style></resources>
bottom_dialog_layout.xml
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="300dp"android:background="@drawable/corner_background"></LinearLayout></RelativeLayout>
corner_background.xml
<?xml version="1.0" encoding="utf-8"?><layer-list xmlns:android="/apk/res/android"><item><shape android:shape="rectangle"><padding android:top="1dp" /><corners android:topLeftRadius="6dp"android:topRightRadius="6dp"android:bottomLeftRadius="0dp"android:bottomRightRadius="0dp"/><gradient android:angle="90" android:startColor="@android:color/white" android:endColor="@android:color/white" /></shape></item></layer-list>
CustomBottomDialog
import android.app.Dialog;import android.content.Context;import android.os.Bundle;import android.support.annotation.NonNull;import android.view.Gravity;import android.view.ViewGroup;import android.view.Window;public class CustomBottomDialog extends Dialog {public CustomBottomDialog(@NonNull Context context) {super(context, R.style.bottom_dialog_bg_style);}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.bottom_dialog_layout);setWindowTheme();setCancelable(true);setCanceledOnTouchOutside(true);}private void setWindowTheme() {Window window = this.getWindow();// 设置弹出位置window.setGravity(Gravity.BOTTOM);// 设置弹出动画window.setWindowAnimations(R.style.show_dialog_animStyle);// 设置对话框大小window.setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);}}
三、Activity半屏弹窗
public class TestActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.bottom_dialog_layout);overridePendingTransition(R.anim.anim_slide_in_bottom, R.anim.no_anim);}@Overridepublic void finish() {super.finish();overridePendingTransition(R.anim.no_anim, R.anim.anim_slide_out_bottom);}}
<style name="bottom_activity_bg_style" parent="Theme.AppCompat.Light.NoActionBar"><!-- 无标题 --><item name="android:windowNoTitle">true</item><item name="android:background">@android:color/transparent</item><!-- 背景透明 --><item name="android:windowBackground">@android:color/transparent</item><!-- 边框 --><item name="android:windowFrame">@null</item><!-- 是否浮现在activity之上,如果设置为true则类似于展示成dialog,所以界面左右两边会有空边 --><item name="android:windowIsFloating">false</item><!-- 半透明 --><item name="android:windowIsTranslucent">true</item><!-- 模糊 --><item name="android:backgroundDimEnabled">true</item><!-- 遮罩层 --><item name="android:backgroundDimAmount">0.5</item></style>
Activity的方式和Dialog的方式类似,只是需要修改一下动画添加方式和style。另外效果也有不同,如果需要做成dialog类型,设置android:windowIsFloating是关键。
两种添加进入和退出动画的方式:
1、style方式
<item name="android:windowEnterAnimation">@anim/anim_slide_in_bottom</item><item name="android:windowExitAnimation">@anim/anim_slide_out_bottom</item>
2、在activity当中添加overridePendingTransition
3、有些情况下,把module做成aar插件时,通过overridePendingTransition,使用R.anim.anim_slide_in_bottom方式读取不到anim资源。
try {int anim_slide_in_bottom= getApplication().getResources().getIdentifier("anim_slide_in_bottom", "anim", getApplication().getPackageName());int no_anim= getApplication().getResources().getIdentifier("no_anim", "anim", getApplication().getPackageName());overridePendingTransition(anim_slide_in_bottom, no_anim);} catch (Exception e) {e.printStackTrace();}
作者:沧水巫云
博客:/amir_zt/
以上原创,转载请注明出处,谢谢。
/amir_zt/article/details/114922218