美文网首页
Android Dialog 设置Margin方式总结

Android Dialog 设置Margin方式总结

作者: zeyio | 来源:发表于2018-05-08 23:51 被阅读1168次

    在日常开发中,总是会遇到各种Dialog的使用,调整根据UI设计的不同,会经常调整Dialog在屏幕中的位置,这篇文章主要介绍,在使用DialogFragment时设置Margin的几种方式。

    如下是最后实现的效果:
    设置两边margin效果:

    image.png

    设置顶部margin效果:

    image.png

    全屏的Dialog设置顶部Margin:

    image.png

    1. 设置两边Margin的Dialog

    这个比较容易,主要就是设置一个高度wrap_content,宽度match_parent的dialog,然后在dialog的布局中设置margin就可以了。

    如果发现宽度match_parent的dialog即使没有设置两边的margin也有margin,可以设置给dialog设置个background来解决window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));

    如下是xml文件:

    <?xml version="1.0" encoding="utf-8"?>
    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="300dp"
            android:layout_marginLeft="30dp"    <---设置margin
            android:layout_marginRight="30dp"
            android:gravity="center"
            android:background="@color/colorAccent">
    
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="设置两边的margin"
                android:textColor="@android:color/white"
                android:textSize="30sp" />
        </LinearLayout>
    
    </FrameLayout>
    

    然后在DialogFragment的onResume里对Window做一些处理:

     Window window = getDialog().getWindow();
            if (window != null) {
                //去除系统自带的margin
                window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
                //设置dialog在界面中的属性
                window.setLayout(WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.WRAP_CONTENT);
            }
    

    2. 设置顶部Margin的非全屏Dialog

    这种情况margin可以通过WindowManager.LayoutParamsverticalMargin属性来实现。verticalMargin和xml里面设置的layout_margin不一样,verticalMargin是通过设置一个0-1的float变量,来标识margin在屏幕中的占比。

    如下是在DialogFragment的onResume中的处理:

    Window window = getDialog().getWindow();
            if (window != null) {
                //设置dialog靠近顶部
                window.setGravity(Gravity.TOP);
                window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
                window.setLayout(WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.WRAP_CONTENT);
                //设置margin为屏幕的20%
                WindowManager.LayoutParams lps = window.getAttributes();
                lps.verticalMargin = 0.2f;
                window.setAttributes(lps);
            }
    

    xml文件(和1的类似,没有什么特别):

    <?xml version="1.0" encoding="utf-8"?>
    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="0dp"
        android:layout_marginRight="0dp">
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="300dp"
            android:layout_marginLeft="30dp"
            android:layout_marginRight="30dp"
            android:gravity="center"
            android:background="@color/colorAccent">
    
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="设置顶部的margin"
                android:textColor="@android:color/white"
                android:textSize="30sp" />
        </LinearLayout>
    
    </FrameLayout>
    

    3. 设置全屏dialog的margin

    这里如果使用2中的方法,没有任何效果。这里使用另外一种方式实现--insetDrawable

    A Drawable that insets another Drawable by a specified distance or fraction of the content bounds. This is used when a View needs a background that is smaller than the View's actual bounds.
    It can be defined in an XML file with the <inset> element. For more information, see the guide to Drawable Resources.

    大意就是:可以设置一个包含另一个Drawable的Drawable,insetDrawable可以让原来的Drawable距离边距有一段距离。常用来实现view需要一个比view实际要小的背景。

    这里的实现是在xml里面写一个<inset>

    <?xml version="1.0" encoding="utf-8"?>
    <inset xmlns:android="http://schemas.android.com/apk/res/android"
        android:drawable="@color/colorAccent"
        android:insetTop="100dp"/>     <--相当于设置顶部margin
    
    <?xml version="1.0" encoding="utf-8"?>
    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginLeft="0dp"
        android:layout_marginRight="0dp"
        android:background="@drawable/inner_dialog_bg">     <--设置inset背景
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:gravity="center_horizontal">
    
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="设置全屏Dialog的margin"
                android:textColor="@android:color/white"
                android:textSize="20sp" />
        </LinearLayout>
    
    </FrameLayout>
    

    在DialogFragment的onResume方法中:

    Window window = getDialog().getWindow();
            if (window != null) {
                window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
                //设置全屏dialog
                window.setLayout(WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.MATCH_PARENT);
            }
    

    相关文章

      网友评论

          本文标题:Android Dialog 设置Margin方式总结

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