代码
对话框样式的Activity,除了使用系统的Dialog样式的Theme外,我们还可以自己设置Window的参数来进行自定义。
当然还是可以使用 DialogFragment
来实现。
SecondActivity.java
public class SecondActivity extends AppCompatActivity {
public static final double SMALL_WIN_H_SCALE = 0.67;
public static final double SMALL_WIN_W_SCALE = 0.72;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActionBar actionBar = getSupportActionBar();
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setHomeButtonEnabled(true);
actionBar.setDisplayOptions(ActionBar.DISPLAY_HOME_AS_UP, ActionBar.DISPLAY_HOME_AS_UP);
actionBar.setHomeAsUpIndicator(R.drawable.close_button);
}
@Override
public void onAttachedToWindow() {
super.onAttachedToWindow();
overridePendingTransition(R.anim.activity_dialog_close_enter, R.anim.activity_dialog_close_exit);
resizeActivity();
}
@Override
public void finish() {
super.finish();
overridePendingTransition(R.anim.activity_dialog_close_enter, R.anim.activity_dialog_close_exit);
}
@Override
public boolean onSupportNavigateUp() {
finish();
return super.onSupportNavigateUp();
}
private void resizeActivity(){
WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams();
setFinishOnTouchOutside(true);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
layoutParams.copyFrom(getWindow().getAttributes());
layoutParams.gravity = Gravity.CENTER;
DisplayMetrics displayMetrics = getResources().getDisplayMetrics();
//layoutParams.x = 200;
layoutParams.width = (int) (displayMetrics.widthPixels * SMALL_WIN_W_SCALE);
layoutParams.height = (int) (displayMetrics.heightPixels * SMALL_WIN_H_SCALE);
layoutParams.dimAmount = 0.7f;
layoutParams.alpha = 1.0f;
getWindow().setAttributes(layoutParams);
getWindow().setBackgroundDrawableResource(android.R.color.transparent);
View view = getWindow().getDecorView();
if(view != null) {
view.setBackgroundResource(R.drawable.dialog_activity_bg);
}
}
}
dialog_activity_bg.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
<!-- 填充颜色 -->
<solid android:color="#ffffffff" />
<!-- 边框宽度 -->
<!-- <stroke android:width="3dp" /> -->
<!-- 圆角半径 -->
<corners android:radius="8dp" />
<!-- 内边距 -->
<!--<padding
android:bottom="13dp"
android:left="13dp"
android:right="13dp"
android:top="13dp" />-->
</shape>
dialog_exit_interpolator.xml
<?xml version="1.0" encoding="utf-8"?>
<pathInterpolator
xmlns:android="http://schemas.android.com/apk/res/android"
android:controlX1="0.33"
android:controlY1="0"
android:controlX2="0.66"
android:controlY2="1"/>
activity_dialog_close_enter.xml
<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="180"
android:fromAlpha="1.0"
android:toAlpha="1.0">
</alpha>
activity_dialog_close_exit.xml
<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="180"
android:fromAlpha="1.0"
android:interpolator="@interpolator/dialog_exit_interpolator"
android:toAlpha="0">
</alpha>
style.xml
<style name="DialogTransparentTheme" parent="Theme.AppCompat.Light">
<item name="colorPrimary">@color/dodgerblue</item>
<item name="colorPrimaryDark">@color/dodgerblue</item>
<item name="colorAccent">@color/dodgerblue</item>
<item name="android:windowIsTranslucent">true</item>
</style>
AndroidManifest.xml
<activity android:name=".ThirdActivity"
android:label="ThirdActivity"
android:theme="@style/DialogTheme">
</activity>
设置点击空白区域Activity不消失
调用
setFinishOnTouchOutside(false);