android 仿IOS弹出框

由于公司禁掉了上传功能,无法使用github等,将自己的代码分享出去。
但是自己做了一个仿IOS的弹出框感觉非常好用,想分享出来,因此就直接把相关代码贴出来,有兴趣的可以直接拷贝使用,遇到使用问题也可以留言。
做之前在网上也看到过很多类似的,但是觉得封装的都不好,因此重新封装了一下,更便于使用。
这里写图片描述
先来看下使用:

new IOSActionSheetDialog.Builder(mActivity)
                .setTitle("title")
                //.setSheetItemList(sheetItemList)//添加item集合
                .addSheetItem("itemName","#007aff")//添加单个条目
                .setOnItemClickListener(new IOSActionSheetDialog.OnItemClickListener() {
                    @Override
                    public void onItemClick(LinearLayout parent, View view, int position) {
                        //do something
                    }
                })
//                .setTitleHeight(57)//可选项
//                .setTitleSize(20)
                .build()
                .show();

主要类:

package com.example.app.widget;

import android.app.Dialog;
import android.content.Context;
import android.graphics.Color;
import android.text.TextUtils;
import android.util.DisplayMetrics;
import android.view.Display;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.LinearLayout;
import android.widget.ScrollView;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.List;

/**
 * 仿IOS样式的弹出框
 * <p/>
 * please use {@link IOSActionSheetDialog.Builder} to create a instance ,do not use "new".
 * such as:
 * <pre>
 * new IOSActionSheetDialog.Builder(MainActivity.this)
 *                .setTitle("title")
 *                .addSheetItem("item_name", IOSActionSheetDialog.COLOR_IOS_RED)
 *                .setOnItemClickListener(new IOSActionSheetDialog.OnItemClickListener() {
 *                          @Override
 *                          public void onItemClick(LinearLayout parent, View view, int position) {
 *                                          //do some thing
 *                           }
 *                 })
 *                 .build()
 *                 .show();
 * </pre>
 *
 * @author huburt
 * @date 2017-01-11 14:16
 */
public class IOSActionSheetDialog extends Dialog {
    //IOS版蓝色
    public static final String COLOR_IOS_BLUE = "#037BFF";
    //IOS版红色
    public static final String COLOR_IOS_RED = "#FD4A2E";

    public static final String COLOR_IOS_GREY = "#8F8F8F";

    //title参数
    private int mTitleSize = 13;
    private int mTitleHeight = 45;
    private String mTitleColor = COLOR_IOS_GREY;

    //条目参数
    private int mItemTextSize = 18;
    private int mItemHeight = 45;
    private boolean isItemTextBold = false;

    //底部参数
    private int mCancelHeight = 45;
    private int mCancelTextSize = 18;
    private String mCancelTextColor = COLOR_IOS_BLUE;
    private boolean isCancelTextBold = false;

    //屏幕宽度
    private int mWidth;
    //屏幕高度
    private int mHeight;
    //屏幕密度
    private float mDensity;

    private ScrollView mSvContent;
    private LinearLayout mLvContent;
    private TextView mTvTitle;
    private TextView mTvCancel;

    private OnItemClickListener mOnItemClickListener;

    private List<SheetItem> mSheetItemList;
    private String mTitle;
    private boolean isShowTitle;


    public IOSActionSheetDialog(Context context, List<SheetItem> sheetItemList,
                                String title, OnItemClickListener onItemClickListener,
                                boolean cancelable, boolean canceledOnTouchOutside) {
        //传入style设置window参数
        super(context, R.style.ActionSheetDialogStyle);

        mSheetItemList = sheetItemList;
        mTitle = title;
        mOnItemClickListener = onItemClickListener;
        setCancelable(cancelable);
        setCanceledOnTouchOutside(canceledOnTouchOutside);

        //获取屏幕参数
        WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
        Display display = windowManager.getDefaultDisplay();
        DisplayMetrics outMetrics = new DisplayMetrics();
        display.getMetrics(outMetrics);
        mWidth = outMetrics.widthPixels;
        mHeight = outMetrics.heightPixels;
        mDensity = outMetrics.density;
        init();
    }

    private void init() {
        // 获取Dialog布局
        View view = LayoutInflater.from(getContext()).inflate(R.layout.view_actionsheet, null);
        // 设置Dialog最小宽度为屏幕宽度
        view.setMinimumWidth(mWidth);

        mSvContent = (ScrollView) view.findViewById(R.id.sLayout_content);
        mLvContent = (LinearLayout) view.findViewById(R.id.lLayout_content);
        mTvTitle = (TextView) view.findViewById(R.id.txt_title);
        mTvCancel = (TextView) view.findViewById(R.id.txt_cancel);
        mTvCancel.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                dismiss();
            }
        });

        if (!TextUtils.isEmpty(mTitle)) {
            setTitle(mTitle);
        }

        Window dialogWindow = getWindow();
        dialogWindow.setGravity(Gravity.LEFT | Gravity.BOTTOM);
        WindowManager.LayoutParams lp = dialogWindow.getAttributes();
        lp.x = 0;
        lp.y = 0;
        dialogWindow.setAttributes(lp);
        setContentView(view);
    }

    @Override
    public void show() {
        adjustUI();
        showSheetItems();
        super.show();
    }

    private void adjustUI() {
        //调整title高度
        LinearLayout.LayoutParams titleParams = (LinearLayout.LayoutParams) mTvTitle.getLayoutParams();
        int height = (int) (mTitleHeight * mDensity + 0.5f);
        titleParams.height = height;
        mTvTitle.setLayoutParams(titleParams);
        //调整title字体大小
        mTvTitle.setTextSize(mTitleSize);
        try {
            int color = Color.parseColor(mTitleColor);
            mTvTitle.setTextColor(color);
        } catch (Exception e) {
            e.printStackTrace();
            mTvTitle.setTextColor(getContext().getResources().getColor(R.color.actionsheet_gray));
        }

        //调整cancel高度
        LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) mTvCancel.getLayoutParams();
        height = (int) (mCancelHeight * mDensity + 0.5f);
        layoutParams.height = height;
        mTvCancel.setLayoutParams(layoutParams);
        //调整cancel字体大小
        mTvCancel.setTextSize(mCancelTextSize);
        try {
            int color = Color.parseColor(mCancelTextColor);
            mTvCancel.setTextColor(color);
        } catch (Exception e) {
            e.printStackTrace();
            mTvCancel.setTextColor(getContext().getResources().getColor(R.color.actionsheet_blue));
        }
        //cancel字体是否加粗
        mTvCancel.getPaint().setFakeBoldText(isCancelTextBold);
    }

    private void showSheetItems() {
        if (mSheetItemList == null || mSheetItemList.size() <= 0) {
            return;
        }
        int size = mSheetItemList.size() - 1;

        // 添加条目过多的时候控制高度
        if (size >= 7) {
            LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) mSvContent.getLayoutParams();
            params.height = mHeight / 2;
            mSvContent.setLayoutParams(params);
        }

        for (int i = 0; i <= size; i++) {
            final int index = i;
            SheetItem sheetItem = mSheetItemList.get(i);

            TextView textView = new TextView(getContext());
            textView.setText(sheetItem.name);
            textView.setTextSize(mItemTextSize);
            textView.setGravity(Gravity.CENTER);

            int height = (int) (mItemHeight * mDensity + 0.5f);
            textView.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, height));

            textView.getPaint().setFakeBoldText(isItemTextBold);

            // 背景图片
            if (size == 0) {
                if (isShowTitle) {
                    textView.setBackgroundResource(R.drawable.actionsheet_bottom_selector);
                } else {
                    textView.setBackgroundResource(R.drawable.actionsheet_single_selector);
                }
            } else {
                if (isShowTitle) {
                    if (i >= 0 && i < size) {
                        textView.setBackgroundResource(R.drawable.actionsheet_middle_selector);
                    } else {
                        textView.setBackgroundResource(R.drawable.actionsheet_bottom_selector);
                    }
                } else {
                    if (i == 0) {
                        textView.setBackgroundResource(R.drawable.actionsheet_top_selector);
                    } else if (i < size) {
                        textView.setBackgroundResource(R.drawable.actionsheet_middle_selector);
                    } else {
                        textView.setBackgroundResource(R.drawable.actionsheet_bottom_selector);
                    }
                }
            }

            // 字体颜色
            try {
                int color = Color.parseColor(sheetItem.color);
                textView.setTextColor(color);
            } catch (Exception e) {
                e.printStackTrace();
                textView.setTextColor(Color.parseColor(COLOR_IOS_BLUE));
            }

            // 点击事件
            textView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (mOnItemClickListener != null) {
                        mOnItemClickListener.onItemClick(mLvContent, v, index);
                    }
                    dismiss();
                }
            });
            mLvContent.addView(textView);
        }

    }

    public void setTitle(CharSequence title) {
        isShowTitle = true;
        mTvTitle.setVisibility(View.VISIBLE);
        mTvTitle.setText(title);
    }

    public void setTitleColor(String color) {
        mTitleColor = color;
    }

    public void setTitleSize(int size) {
        mTitleSize = size;
    }

    public void setTitleHeight(int height) {
        mTitleHeight = height;
    }

    public void setItemTextSize(int size) {
        mItemTextSize = size;
    }

    public void setItemHeight(int height) {
        mItemHeight = height;
    }

    public void setCancelHeight(int cancelHeight) {
        mCancelHeight = cancelHeight;
    }

    public void setCancelTextSize(int cancelTextSize) {
        mCancelTextSize = cancelTextSize;
    }

    public void setCancelTextColor(String cancelTextColor) {
        mCancelTextColor = cancelTextColor;
    }

    public void setItemTextBold(boolean itemTextBold) {
        isItemTextBold = itemTextBold;
    }

    public void setCancelTextBold(boolean cancelTextBold) {
        isCancelTextBold = cancelTextBold;
    }

    public OnItemClickListener getOnItemClickListener() {
        return mOnItemClickListener;
    }

    public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
        mOnItemClickListener = onItemClickListener;
    }


    public static class Builder {
        private android.content.Context context;
        private List<SheetItem> mSheetItemList;
        private OnItemClickListener onItemClickListener;
        private boolean cancelable = true;
        private boolean canceledOnTouchOutside = true;
        private String title;
        private int mTitleSize = 13;
        private int mTitleHeight = 45;
        private String mTitleColor = COLOR_IOS_GREY;
        private int mItemTextSize = 18;
        private int mItemHeight = 45;
        private int mCancelHeight = 45;
        private int mCancelTextSize = 18;
        private String mCancelTextColor = COLOR_IOS_BLUE;
        private boolean isCancelTextBold = false;
        private boolean isItemTextBold = false;

        public Builder(Context context) {
            this.context = context;
        }

        public Builder setOnItemClickListener(OnItemClickListener onItemClickListener) {
            this.onItemClickListener = onItemClickListener;
            return this;
        }

        public Builder addSheetItem(String name, String color) {
            if (mSheetItemList == null) {
                mSheetItemList = new ArrayList<SheetItem>();
            }
            mSheetItemList.add(new SheetItem(name, color));
            return this;
        }

        public Builder setCancelable(boolean cancelable) {
            this.cancelable = cancelable;
            return this;
        }

        public Builder setCanceledOnTouchOutside(boolean canceledOnTouchOutside) {
            this.canceledOnTouchOutside = canceledOnTouchOutside;
            return this;
        }

        public Builder setSheetItemList(List<SheetItem> sheetItemList) {
            mSheetItemList = sheetItemList;
            return this;
        }

        public Builder setTitle(String title) {
            this.title = title;
            return this;
        }

        public Builder setTitleSize(int size) {
            mTitleSize = size;
            return this;
        }

        public Builder setTitleHeight(int height) {
            mTitleHeight = height;
            return this;
        }

        public Builder setTitleColor(String color) {
            mTitleColor = color;
            return this;
        }

        public Builder setItemHeight(int height) {
            mItemHeight = height;
            return this;
        }

        public Builder setItemTextSize(int size) {
            mItemTextSize = size;
            return this;
        }

        public Builder setCancelHeight(int cancelHeight) {
            mCancelHeight = cancelHeight;
            return this;
        }

        public Builder setCancelTextSize(int cancelTextSize) {
            mCancelTextSize = cancelTextSize;
            return this;
        }

        public Builder setCancelTextColor(String cancelTextColor) {
            mCancelTextColor = cancelTextColor;
            return this;
        }

        public Builder setCancelTextBold(boolean cancelTextBold) {
            isCancelTextBold = cancelTextBold;
            return this;
        }

        public Builder setItemTextBold(boolean itemTextBold) {
            isItemTextBold = itemTextBold;
            return this;
        }

        public IOSActionSheetDialog build() {
            IOSActionSheetDialog sheetDialog = new IOSActionSheetDialog(context, mSheetItemList, title, onItemClickListener, cancelable, canceledOnTouchOutside);
            sheetDialog.setTitleHeight(mTitleHeight);
            sheetDialog.setTitleSize(mTitleSize);
            sheetDialog.setTitleColor(mTitleColor);
            sheetDialog.setItemHeight(mItemHeight);
            sheetDialog.setItemTextSize(mItemTextSize);
            sheetDialog.setCancelHeight(mCancelHeight);
            sheetDialog.setCancelTextSize(mCancelTextSize);
            sheetDialog.setCancelTextColor(mCancelTextColor);
            sheetDialog.setItemTextBold(isItemTextBold);
            sheetDialog.setCancelTextBold(isCancelTextBold);
            return sheetDialog;
        }
    }

    public interface OnItemClickListener {
        void onItemClick(LinearLayout parent, View view, int position);
    }

    public static class SheetItem {
        String name;
        String color;

        public SheetItem(String name, String color) {
            this.name = name;
            this.color = color;
        }
    }
}

dialog的style

<!-- 自定义仿IOS的ActionSheet底部Dialog的样式 ,有模糊效果 -->
    <style name="ActionSheetDialogStyle" parent="@android:style/Theme.Dialog">

        <!-- 背景透明 -->
        <item name="android:windowBackground">@android:color/transparent</item>
        <item name="android:windowContentOverlay">@null</item>
        <!-- 浮于Activity之上 -->
        <item name="android:windowIsFloating">true</item>
        <!-- 边框 -->
        <item name="android:windowFrame">@null</item>
        <!-- Dialog以外的区域模糊效果 -->
        <item name="android:backgroundDimEnabled">true</item>
        <!-- 无标题 -->
        <item name="android:windowNoTitle">true</item>
        <!-- 半透明 -->
        <item name="android:windowIsTranslucent">true</item>
        <!-- Dialog进入及退出动画 -->
        <item name="android:windowAnimationStyle">@style/ActionSheetDialogAnimation</item>
    </style>

    <!-- ActionSheet进出动画 -->
    <style name="ActionSheetDialogAnimation" parent="@android:style/Animation.Dialog">
        <item name="android:windowEnterAnimation">@anim/actionsheet_dialog_in</item>
        <item name="android:windowExitAnimation">@anim/actionsheet_dialog_out</item>
    </style>

@anim/actionsheet_dialog_in

<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="200"
    android:fromYDelta="100%"
    android:toYDelta="0" />

@anim/actionsheet_dialog_out

<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="200"
    android:fromYDelta="0"
    android:toYDelta="100%" />

R.layout.view_actionsheet

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="wrap_content"
              xmlns:tools="http://schemas.android.com/tools"
              android:orientation="vertical"
              android:padding="8dp">

    <TextView
        android:id="@+id/txt_title"
        android:layout_width="match_parent"
        android:layout_height="45dp"
        android:background="@drawable/shape_actionsheet_top_normal"
        android:gravity="center"
        android:textColor="@color/actionsheet_gray"
        android:textSize="13sp"
        android:visibility="gone"
        tools:visibility="visible"/>

    <ScrollView
        android:id="@+id/sLayout_content"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:fadingEdge="none"
         >
        <!--fadingEdge属性表示,滚动式边缘内容是否变淡-->
        <LinearLayout
            android:id="@+id/lLayout_content"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical" >
        </LinearLayout>
    </ScrollView>

    <TextView
        android:id="@+id/txt_cancel"
        android:layout_width="match_parent"
        android:layout_height="45dp"
        android:layout_marginTop="8dp"
        android:background="@drawable/actionsheet_single_selector"
        android:gravity="center"
        android:text="取消"
        android:textColor="@color/actionsheet_blue"
        android:textSize="18sp"
         />

</LinearLayout>

actionsheet_top_selector.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:drawable="@drawable/shape_actionsheet_top_pressed" android:state_pressed="true"/>
    <item android:drawable="@drawable/shape_actionsheet_top_normal"/>

</selector>

@drawable/shape_actionsheet_top_normal

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:bottom="0.5dp">
        <shape
            android:shape="rectangle">
            <solid android:color="#F4F4F4"/>
            <corners
                android:topLeftRadius="10dp"
                android:topRightRadius="10dp"/>

        </shape>
    </item>

</layer-list>

@drawable/shape_actionsheet_top_pressed

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
       android:shape="rectangle">
    <solid android:color="#DFDFDF"/>
    <corners
        android:topLeftRadius="10dp"
        android:topRightRadius="10dp"/>

</shape>

@drawable/actionsheet_single_selector

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:drawable="@drawable/shape_actionsheet_single_pressed" android:state_pressed="true"/>
    <item android:drawable="@drawable/shape_actionsheet_single_normal"/>

</selector>

@drawable/shape_actionsheet_single_pressed

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
       android:shape="rectangle">
    <solid android:color="#DFDFDF"/>
    <corners
        android:radius="10dp"/>

</shape>

@drawable/shape_actionsheet_single_normal

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
       android:shape="rectangle">
    <solid android:color="#F4F4F4"/>
    <corners
        android:radius="10dp"/>

</shape>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值