Dialog

2018-08-31  本文已影响0人  大灰狼zz

基本的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>

预览

image.png

自定义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都是如此,据边界有一小段距离 
*/

Dialog 三种退出方式的回调分析

https://blog.csdn.net/lgz_ei/article/details/53000146

上一篇 下一篇

猜你喜欢

热点阅读