100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > 自定义半屏弹窗Dialog或Activity背景半透明

自定义半屏弹窗Dialog或Activity背景半透明

时间:2020-10-11 22:38:23

相关推荐

自定义半屏弹窗Dialog或Activity背景半透明

一、先看看效果图

实现半屏弹窗,背景半透明,可以使用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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。