1. 程式人生 > >Android 自定義Dialog (有圓角和和已適配大螢幕的廣告機)

Android 自定義Dialog (有圓角和和已適配大螢幕的廣告機)

在開發過程中,有時需要自定義的Dialog,設計的需求是,按照螢幕的比例來顯示Dialog,需要有圓角。效果如下圖。

自定義程式碼Dialog 程式碼如下:

CustomDialog.class


public class CustomDialog extends Dialog {

    private static int default_width = 300;//預設寬  dp
    private static int default_height = 280;//預設高 dp

    public CustomDialog(Context context, View layout, int
style) { this(context, default_width,default_height, layout, style); } /*** width-- */ public CustomDialog(Context context, int width, height, View layout, int themeResId) { super(context, themeResId); setContentView(layout); int width=DisplayUtils.dp2px(width); int
height=DisplayUtils.dp2px(height); Window window = getWindow(); WindowManager.LayoutParams params = window.getAttributes(); params.gravity = Gravity.CENTER; window.setAttributes(params); DisplayMetrics dm = context.getResources().getDisplayMetrics(); int
displayWidth = dm.widthPixels; int displayHeight = dm.heightPixels; android.view.WindowManager.LayoutParams p = getWindow().getAttributes(); //獲取對話方塊當前的引數值 int p.width = (int) (width/displayWidth); // 佔螢幕寬的比例 p.height = (int) (height/displayHeight ); // 佔螢幕高的比例 window.setAttributes(p); //設定生效 } }

DisplayUtils

public class DisplayUtils {
    /**
     * 將px值轉換為dp值
     */
    public static int px2dp(Context context, float pxValue) {
        final float scale = context.getResources().getDisplayMetrics().density;
        return (int) (pxValue / scale + 0.5f);
    }

    /**
     * 將dp值轉換為px值
     */
    public static int dp2px(Context context, float dpValue) {
        final float scale = context.getResources().getDisplayMetrics().density;
        return (int) (dpValue * scale + 0.5f);
    }

    /**
     * 將px值轉換為sp值
     */
    public static int px2sp(Context context, float pxValue) {
        final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
        return (int) (pxValue / fontScale + 0.5f);
    }

    /**
     * 將sp值轉換為px值
     */
    public static int sp2px(Context context, float spValue) {
        final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
        return (int) (spValue * fontScale + 0.5f);
    }

    /**
     * 獲取螢幕寬度
     */
    public static int getScreenWidthPixels(Activity context) {
        DisplayMetrics metric = new DisplayMetrics();
        context.getWindowManager().getDefaultDisplay().getMetrics(metric);
        return metric.widthPixels;
    }

    /**
     * 獲取螢幕高度
     */
    public static int getScreenHeightPixels(Activity context) {
        DisplayMetrics metric = new DisplayMetrics();
        context.getWindowManager().getDefaultDisplay().getMetrics(metric);
        return metric.heightPixels;
    }
}

然後就是顯示的問題了

UIHelper.class

public class UIHelper {


    private static LinearLayout layout_del;
    private static Button btn;
    private static Dialog dialog;



    public static void showKonwDialog(Context context) {
        View view = LayoutInflater.from(context).inflate(R.layout.dialog_konw, null);

        final CustomDialog builder = new CustomDialog(context, 0, 0, view, R.style.dialog);
        //設定對話方塊顯示的View
        builder.show();


        layout_del = (LinearLayout) builder.findViewById(R.id.dialog_layout_del);

        btn = (Button) builder.findViewById(R.id.dialog_konw_btn);

        layout_del.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (builder.isShowing()) {
                    builder.dismiss();
                }
            }
        });

        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                builder.dismiss();
            }
        });
    }




}

Style

在values資料夾下的style 中新增樣式。。

    <!--***************Dialog***************-->
    <style name="dialog" parent="@android:style/Theme.Dialog">
        <item name="android:windowFrame">@null</item>
        <item name="android:windowIsFloating">true</item>
        <item name="android:windowIsTranslucent">true</item>
        <item name="android:windowNoTitle">true</item>
        <item name="android:background">@android:color/transparent</item>
        <item name="android:windowBackground">@android:color/transparent</item>
        <item name="android:backgroundDimEnabled">true</item>
        <item name="android:backgroundDimAmount">0.6</item>

    </style>

dialog_konw.xml

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/common_bg_trans"
    >
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center_horizontal"
    android:background="@drawable/shape_dialog_bg"
    android:orientation="vertical">
    <LinearLayout
        android:id="@+id/dialog_layout_del"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="right"
        android:paddingBottom="@dimen/y20"
        android:paddingLeft="@dimen/x22"
        android:paddingRight="@dimen/x22"
        android:paddingTop="@dimen/y20">


        <ImageView
            android:layout_width="@dimen/y22"
            android:layout_height="@dimen/y22"
            app:srcCompat="@drawable/ic_pop_icon_del" />
    </LinearLayout>

    <EditText
        android:layout_width="match_parent"
        android:layout_marginLeft="@dimen/x76"
        android:layout_marginRight="@dimen/x76"
        android:layout_height="@dimen/y84"
        android:singleLine="true"
        android:layout_gravity="center_horizontal"
        android:layout_marginTop="@dimen/y20"
        android:background="@color/com_bg_gray_eeeeee"
        android:hint="@string/input_your_name"
        android:paddingLeft="@dimen/x29"
        android:textColorHint="@color/com_tv_gray_666666"
        android:textSize="@dimen/comm_tv_14" />

    <EditText
        android:layout_width="match_parent"
        android:layout_marginLeft="@dimen/x76"
        android:layout_marginRight="@dimen/x76"
        android:layout_height="@dimen/y84"
        android:layout_gravity="center_horizontal"
        android:layout_marginTop="@dimen/y20"

        android:singleLine="true"
        android:background="@color/com_bg_gray_eeeeee"
        android:hint="@string/input_your_phone"

        android:paddingLeft="@dimen/x29"

        android:textColorHint="@color/com_tv_gray_666666"
        android:textSize="@dimen/comm_tv_14" />

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:gravity="center_vertical">

        <View
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/sex"
            android:textColor="@color/com_tv_black_333333"
            android:textSize="@dimen/comm_tv_14" />

        <com.aoben.qproj.widget.CustomRadioButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="@dimen/x71" />

        <View
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1" />
    </LinearLayout>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:text="@string/plz_wait"
        android:textColor="@color/com_tv_gray_666666"
        android:textSize="@dimen/comm_tv_10" />


    <Button

        android:id="@+id/dialog_konw_btn"
        android:layout_width="match_parent"
        android:layout_marginLeft="@dimen/x76"
        android:layout_marginRight="@dimen/x76"
        android:layout_height="@dimen/y80"
        android:layout_gravity="center_horizontal"
        android:layout_marginBottom="@dimen/y70"
        android:layout_marginTop="@dimen/y38"
        android:background="@drawable/selector_btn_bg"
        android:text="@string/insure"
        android:textColor="@color/com_tv_white_ffffff"
        android:textSize="@dimen/comm_tv_15" />
</LinearLayout>

</RelativeLayout>

x22 y26 這些是上一篇文章,關於螢幕適配有說到。

shape_dialog_bg.xml

實現圓角,

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <corners android:radius="@dimen/comm_dim_4" />
    <solid android:color="@color/com_bg_white_ffffff"/>
</shape>

這樣就實現了,文章開頭的效果圖中的自定義dialog.