基本的Dialog
Android系统对话框使用详解(最详细)
日常项目几乎使用不到,一般都是自定义Dialog
Dialog和Popupwindow的区别:
1)Dialog是非阻塞线程的,Popupwindow是阻塞线程的。
2)Dialog没法设置宽为整个屏幕宽,总有点边界。Popupwindow可以。
自定义Dialog
设置Dialog的样式
<!-- dialog样式 -->
<style name="dialog_custom" parent="@android:style/Theme.Dialog">
<!--Dialog的windowFrame框为无-->
<item name="android:windowFrame">@null</item>
<!--是否显示title-->
<item name="android:windowNoTitle">true</item>
<!--是否浮现在activity之上-->
<item name="android:windowIsFloating">true</item>
<!--是否半透明-->
<item name="android:windowIsTranslucent">true</item>
<!--是否有覆盖-->
<item name="android:windowContentOverlay">@null</item>
<!--动画-->
<item name="android:windowAnimationStyle">@style/dialog_animation2</item>
<!--dialog的背景(框框以外的)是否模糊-->
<item name="android:backgroundDimEnabled">true</item>
<!--设置背景(框框以外的)模糊的透明度-->
<item name="android:backgroundDimAmount">0.6</item>
<!--窗口(框框以内)背景色-->
<item name="android:windowBackground">@android:color/transparent</item>
</style>
<!--dialog底部弹出动画-->
<style name="dialog_animation1" parent="android:Animation">
<item name="android:windowEnterAnimation">@anim/dialog_enter1</item>
<item name="android:windowExitAnimation">@anim/dialog_exit1</item>
</style>
<!--dialog拉伸压缩动画-->
<style name="dialog_animation2" parent="android:Animation">
<item name="android:windowEnterAnimation">@anim/dialog_enter2</item>
<item name="android:windowExitAnimation">@anim/dialog_exit2</item>
</style>
在res下的anim文件夹中新建dialog_enter2.xml和dialog_exit2.xml文件
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<!--拉伸-->
<scale
android:interpolator="@android:anim/accelerate_interpolator"
android:fromXScale="1.0"
android:toXScale="1.0"
android:fromYScale="0.0"
android:toYScale="1.0"
android:pivotX="0%"
android:pivotY="100%"
android:fillAfter="false"
android:duration="400"/>
</set>
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<!--压缩-->
<scale
android:interpolator="@android:anim/accelerate_interpolator"
android:fromXScale="1.0"
android:toXScale="1.0"
android:fromYScale="1.0"
android:toYScale="0.0"
android:pivotX="0%"
android:pivotY="100%"
android:fillAfter="false"
android:duration="400"/>
</set>
自定义Dialog布局
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/rectangle_20dp_white">
<ImageView
android:id="@+id/imageView"
android:layout_width="180dp"
android:layout_height="180dp"
android:layout_centerHorizontal="true"
android:scaleType="centerInside" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_marginBottom="20dp"
android:text="我在听,请说话"
android:textColor="@color/black" />
</RelativeLayout>
预览
自定义Dialog
public class CustomDialog extends Dialog {
private Context context; // 上下文
public CustomDialog(Context context) {
super(context, R.style.dialog_custom); //dialog的样式
this.context = context;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
View view = View.inflate(context, R.layout.dialog_voice, null);
setContentView(view);
Window window = getWindow();//获取当前窗口
WindowManager windowManager = ((Activity) context).getWindowManager();
WindowManager.LayoutParams layoutParams = window.getAttributes();//获取当前窗口的参数
layoutParams.gravity = Gravity.CENTER;//设置居中显示
DisplayMetrics d = context.getResources().getDisplayMetrics(); // 获取屏幕宽、高用
layoutParams.width = (int) (d.widthPixels * 0.6); // 高度设置为屏幕的0.6
layoutParams.height = (int) (d.widthPixels * 0.6); // 高度设置为屏幕的0.6
layoutParams.y = 30;//垂直方向偏移
window.setAttributes(layoutParams);//设置窗口参数
window.getDecorView().setPadding(0, 0, 0, 0);//默认有padding,设置padding为0
setCanceledOnTouchOutside(true);// 点击Dialog外部消失
ImageView imageView = view.findViewById(R.id.imageView);
Glide.with(context).load(R.drawable.voice).into(imageView);//使用Glide加载gif图片
//给图片设置监听
imageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dismiss();
}
});
}
}
使用实例
public class DialogActivity extends BaseActivity {
private TextView textView;
private CustomDialog dialog;//定义diglog
@Override
public int getLayoutId() {
return R.layout.ui_activity_dialog;
}
@Override
public void initData() {
}
@Override
public void initView() {
textView = (TextView) findViewById(R.id.textView);
dialog = new CustomDialog(this);//创建实例
}
@Override
public void initListener() {
textView.setOnClickListener(this);
}
@Override
public void viewsClick(View view) {
int id = view.getId();
if (id == R.id.textView) {
dialog.show();//show
}
}
}
注意点
1)设置Dialog的位置和大小与加载的布局文件无关。需自己设置dialog参数。
2)设置Dialog位置:设置位置时必须先指定Dialog的gravity属性,否则指定大小无用。
/*
* lp.x与lp.y表示相对于原始位置的偏移.
* 当参数值包含Gravity.LEFT时,对话框出现在左边,所以lp.x就表示相对左边的偏移,负值忽略.
* 当参数值包含Gravity.RIGHT时,对话框出现在右边,所以lp.x就表示相对右边的偏移,负值忽略.
* 当参数值包含Gravity.TOP时,对话框出现在上边,所以lp.y就表示相对上边的偏移,负值忽略.
* 当参数值包含Gravity.BOTTOM时,对话框出现在下边,所以lp.y就表示相对下边的偏移,负值忽略.
* 当参数值包含Gravity.CENTER_HORIZONTAL时
* ,对话框水平居中,所以lp.x就表示在水平居中的位置移动lp.x像素,正值向右移动,负值向左移动.
* 当参数值包含Gravity.CENTER_VERTICAL时
* ,对话框垂直居中,所以lp.y就表示在垂直居中的位置移动lp.y像素,正值向右移动,负值向左移动.
* gravity的默认值为Gravity.CENTER,即Gravity.CENTER_HORIZONTAL |
* Gravity.CENTER_VERTICAL.
*
* 本来setGravity的参数值为Gravity.LEFT | Gravity.TOP时对话框应出现在程序的左上角,但在
* 我手机上测试时发现距左边与上边都有一小段距离,而且垂直坐标把程序标题栏也计算在内了,
* Gravity.LEFT, Gravity.TOP, Gravity.BOTTOM与Gravity.RIGHT都是如此,据边界有一小段距离
*/
网友评论