由于公司禁掉了上传功能,无法使用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>