Android 仿ios底部弹出式对话框

来源:互联网 发布:淘宝古着店灵异经过 编辑:程序博客网 时间:2024/05/16 09:49

本博客文件缺少上传drawle  .9图

(一)加载方式

new ActionSheetDialog(context)        .builder()        .setTitle("设置")        .setCancelable(false)        .setCanceledOnTouchOutside(true)        .addSheetItem(Constants.MODDLE_FONTSIZE, SheetItemColor.Blue, new OnSheetItemClickListener() {            @Override            public void onClick(int which) {                          }        })        .addSheetItem(Constants.SMALL_FONTSIZE,SheetItemColor.Blue, new OnSheetItemClickListener() {            @Override            public void onClick(int which) {                        }        }).show();
(二)核心类
public class ActionSheetDialog {    private Context context;    private Dialog dialog;    private TextView txt_title;    private TextView txt_cancel;    private LinearLayout lLayout_content;    private ScrollView sLayout_content;    private boolean showTitle = false;    private List<SheetItem> sheetItemList;    private Display display;    public ActionSheetDialog(Context context) {        this.context = context;        WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);        display = windowManager.getDefaultDisplay();    }    public ActionSheetDialog builder() {        // 获取Dialog布局        View view = LayoutInflater.from(context).inflate(R.layout.view_actionsheet, null);        // 设置Dialog最小宽度为屏幕宽度        view.setMinimumWidth(display.getWidth());        // 获取自定义Dialog布局中的控件        sLayout_content = (ScrollView) view.findViewById(R.id.sLayout_content);        lLayout_content = (LinearLayout) view.findViewById(R.id.lLayout_content);        txt_title = (TextView) view.findViewById(R.id.txt_title);        txt_cancel = (TextView) view.findViewById(R.id.txt_cancel);        txt_cancel.setOnClickListener(new OnClickListener() {            @Override            public void onClick(View v) {                dialog.dismiss();            }        });        // 定义Dialog布局和参数        dialog = new Dialog(context, R.style.ActionSheetDialogStyle);        dialog.setContentView(view);        Window dialogWindow = dialog.getWindow();        dialogWindow.setGravity(Gravity.LEFT | Gravity.BOTTOM);        WindowManager.LayoutParams lp = dialogWindow.getAttributes();        lp.x = 0;        lp.y = 0;        dialogWindow.setAttributes(lp);        return this;    }    public ActionSheetDialog setTitle(String title) {        showTitle = true;        txt_title.setVisibility(View.VISIBLE);        txt_title.setText(title);        return this;    }    public ActionSheetDialog setCancelable(boolean cancel) {        dialog.setCancelable(cancel);        return this;    }    public ActionSheetDialog setCanceledOnTouchOutside(boolean cancel) {        dialog.setCanceledOnTouchOutside(cancel);        return this;    }    /**     * @param strItem  条目名称     * @param color    条目字体颜色,设置null则默认蓝色     * @param listener     * @return     */    public ActionSheetDialog addSheetItem(String strItem, SheetItemColor color, OnSheetItemClickListener listener{        if (sheetItemList == null) {            sheetItemList = new ArrayList<SheetItem>();        }        sheetItemList.add(new SheetItem(strItem, color, listener));        return this;    }    /**     * 设置条目布局     */    private void setSheetItems() {        if (sheetItemList == null || sheetItemList.size() <= 0) {            return;        }        int size = sheetItemList.size();        // TODO 高度控制,非最佳解决办法        // 添加条目过多的时候控制高度        if (size >= 7) {            LayoutParams params = (LayoutParams) sLayout_content.getLayoutParams();            params.height = display.getHeight() / 2;            sLayout_content.setLayoutParams(params);        }        // 循环添加条目        for (int i = 1; i <= size; i++) {            final int index = i;            SheetItem sheetItem = sheetItemList.get(i - 1);            String strItem = sheetItem.name;            SheetItemColor color = sheetItem.color;            final OnSheetItemClickListener listener = (OnSheetItemClickListener) sheetItem.itemClickListener;            TextView textView = new TextView(context);            textView.setText(strItem);            textView.setTextSize(18);            textView.setGravity(Gravity.CENTER);            // 背景图片            if (size == 1) {                if (showTitle) {                    textView.setBackgroundResource(R.drawable.actionsheet_bottom_selector);                } else {                    textView.setBackgroundResource(R.drawable.actionsheet_single_selector);                }            } else {                if (showTitle) {                    if (i >= 1 && i < size) {                        textView.setBackgroundResource(R.drawable.actionsheet_middle_selector);                    } else {                        textView.setBackgroundResource(R.drawable.actionsheet_bottom_selector);                    }                } else {                    if (i == 1) {                        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);                    }                }            }            // 字体颜色            if (color == null) {                textView.setTextColor(Color.parseColor(SheetItemColor.Blue.getName()));            } else {                textView.setTextColor(Color.parseColor(color.getName()));            }            // 高度            float scale = context.getResources().getDisplayMetrics().density;            int height = (int) (45 * scale + 0.5f);            textView.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, height));            // 点击事件            textView.setOnClickListener(new OnClickListener() {                @Override                public void onClick(View v) {                    listener.onClick(index);                    dialog.dismiss();                }            });            lLayout_content.addView(textView);        }    }    public void show() {        setSheetItems();        dialog.show();    }    public interface OnSheetItemClickListener {        void onClick(int which);    }    public class SheetItem {        String name;        OnSheetItemClickListener itemClickListener;        SheetItemColor color;        public SheetItem(String name, SheetItemColor color, OnSheetItemClickListener itemClickListener) {            this.name = name;            this.color = color;            this.itemClickListener = itemClickListener;        }    }    public enum SheetItemColor {        Blue("#037BFF"), Red("#FD4A2E");        private String name;        private SheetItemColor(String name) {            this.name = name;        }        public String getName() {            return name;        }        public void setName(String name) {            this.name = name;        }    }
(三)xml布局
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="wrap_content"    android:orientation="vertical"    android:padding="8dp" >    <TextView        android:id="@+id/txt_title"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:background="@drawable/actionsheet_top_normal"        android:gravity="center"        android:minHeight="45dp"        android:paddingTop="10dp"        android:paddingBottom="10dp"        android:paddingLeft="15dp"        android:paddingRight="15dp"        android:textColor="@color/actionsheet_gray"        android:textSize="13sp"        android:visibility="gone" />    <ScrollView        android:id="@+id/sLayout_content"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:fadingEdge="none">        <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/dark_blue"        android:textSize="18sp" /></LinearLayout>
(四)style样式及selector
//actionsheet_single_selector
<selector xmlns:android="http://schemas.android.com/apk/res/android">    <item android:drawable="@drawable/actionsheet_single_pressed" android:state_pressed="true"/>    <item android:drawable="@drawable/actionsheet_single_normal"/></selector>
<!-- 自定义仿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>    <item name="android:windowIsFloating">true</item>    <item name="android:windowFrame">@null</item>    <item name="android:backgroundDimEnabled">true</item>    <item name="android:windowNoTitle">true</item>    <item name="android:windowIsTranslucent">true</item>    <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>

0 1