Dialog

作者: 大灰狼zz | 来源:发表于2018-08-31 19:30 被阅读0次

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

    相关文章

      网友评论

          本文标题:Dialog

          本文链接:https://www.haomeiwen.com/subject/tnfewftx.html