先上个效果图:
显示的时候会从屏幕底部滑出来,消失的时候就是滑出去,实现方式用的PopWindow,下面贴代码:
首先定义一个PopupWindow类如下:
public class BottomPopupOption {
//上下文对象
private Context mContext;
//Title文字
private String mTitle;
//PopupWindow对象
private PopupWindow mPopupWindow;
//选项的文字
private String[] options;
//选项的颜色
private int[] Colors;
//点击事件
private onPopupWindowItemClickListener itemClickListener;
/**
* 一个参数的构造方法,用于弹出无标题的PopupWindow
*
* @param context
*/
public BottomPopupOption(Context context) {
this.mContext = context;
}
/**
* 2个参数的构造方法,用于弹出有标题的PopupWindow
*
* @param context
* @param title 标题
*/
public BottomPopupOption(Context context, String title) {
this.mContext = context;
this.mTitle = title;
}
/**
* 设置选项的点击事件
*
* @param itemClickListener
*/
public void setItemClickListener(onPopupWindowItemClickListener itemClickListener) {
this.itemClickListener = itemClickListener;
}
/**
* 设置选项文字
*/
public void setItemText(String... items) {
options = items;
}
/**
* 设置选项文字颜色,必须要和选项的文字对应
*/
public void setColors(int... color) {
Colors = color;
}
/**
* 添加子View
*/
private void addView(View v) {
LinearLayout lin_layout = (LinearLayout) v.findViewById(R.id.layout_popup_add);
//Title
TextView tv_pop_title = (TextView) v.findViewById(R.id.tv_popup_title);
//取消按钮
Button btn_cancel = (Button) v.findViewById(R.id.btn_cancel);
btn_cancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dismiss();
}
});
if (mTitle != null) {
tv_pop_title.setText(mTitle);
} else {
tv_pop_title.setVisibility(View.GONE);
}
if (options != null && options.length > 0) {
for (int i = 0; i < options.length; i++) {
View item = LayoutInflater.from(mContext).inflate(R.layout.basetools_popup_item, null);
Button btn_txt = (Button) item.findViewById(R.id.btn_popup_option);
btn_txt.setText(options[i]);
if (Colors != null && Colors.length == options.length) {
btn_txt.setTextColor(Colors[i]);
}
final int finalI = i;
btn_txt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (itemClickListener != null) {
itemClickListener.onItemClick(finalI);
}
}
});
lin_layout.addView(item);
}
}
}
/**
* 弹出Popupwindow
*/
public void showPopupWindow() {
View popupWindow_view = LayoutInflater.from(mContext).inflate(R.layout.basetools_popup_bottom, null);
//添加子View
addView(popupWindow_view);
mPopupWindow = new PopupWindow(popupWindow_view, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
mPopupWindow.setAnimationStyle(R.style.timepopwindow_anim_style);
mPopupWindow.setBackgroundDrawable(new BitmapDrawable());
mPopupWindow.setFocusable(true);
mPopupWindow.setOutsideTouchable(true);
mPopupWindow.setOnDismissListener(new PopupWindow.OnDismissListener() {
@Override
public void onDismiss() {
setWindowAlpa(false);
}
});
show(popupWindow_view);
}
/**
* 显示PopupWindow
*/
private void show(View v) {
if (mPopupWindow != null && !mPopupWindow.isShowing()) {
mPopupWindow.showAtLocation(v, Gravity.BOTTOM, 0, 0);
}
setWindowAlpa(true);
}
/**
* 消失PopupWindow
*/
public void dismiss() {
if (mPopupWindow != null && mPopupWindow.isShowing()) {
mPopupWindow.dismiss();
}
}
/**
* 动态设置Activity背景透明度
*
* @param isopen
*/
public void setWindowAlpa(boolean isopen) {
if (android.os.Build.VERSION.SDK_INT < 11) {
return;
}
final Window window = ((Activity) mContext).getWindow();
final WindowManager.LayoutParams lp = window.getAttributes();
window.setFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND, WindowManager.LayoutParams.FLAG_DIM_BEHIND);
ValueAnimator animator;
if (isopen) {
animator = ValueAnimator.ofFloat(1.0f, 0.5f);
} else {
animator = ValueAnimator.ofFloat(0.5f, 1.0f);
}
animator.setDuration(400);
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
@Override
public void onAnimationUpdate(ValueAnimator animation) {
float alpha = (float) animation.getAnimatedValue();
lp.alpha = alpha;
window.setAttributes(lp);
}
});
animator.start();
}
/**
* 点击事件选择回调
*/
public interface onPopupWindowItemClickListener {
void onItemClick(int position);
}
}
再给PopupWindow定义一个根布局:basetools_popup_bottom
<?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="match_parent"
android:gravity="bottom"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<LinearLayout
android:id="@+id/layout_popup_add"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:background="@drawable/pop_white_btn_select"
android:divider="@color/list_divider_line"
android:orientation="vertical"
android:showDividers="middle">
<TextView
android:id="@+id/tv_popup_title"
android:layout_width="match_parent"
android:layout_height="132.5px"
android:gravity="center"
android:text="请选择照片的获取方式"
android:textColor="#666666"
android:textSize="15sp" />
</LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="20px"
android:background="#EFEFF3" />
<Button
android:id="@+id/btn_cancel"
android:layout_width="match_parent"
android:layout_height="132.5px"
android:background="@drawable/pop_white_btn_select"
android:text="取消"
android:textColor="@color/rgb333333"
android:textSize="18sp" />
</LinearLayout>
</LinearLayout>
PopupWindow的子布局:basetools_popup_item
<?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="132.5px"
android:orientation="vertical">
<Button
android:id="@+id/btn_popup_option"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@null"
android:text="选项一"
android:textColor="#E63E3D"
android:textSize="46px" />
</LinearLayout>
drawable文件:drawable/pop_white_btn_select
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="@color/white"></solid>
</shape>
Color:
<color name="list_divider_line">#EFEFF3</color>
<color name="white">#ffffff</color>
PopWoindw 显示和消失动画:
<style name="popwindow_anim_style">
<item name="android:windowEnterAnimation">@anim/anim_enter_bottom</item>
<!-- 指定显示的动画xml -->
<item name="android:windowExitAnimation">@anim/anim_exit_bottom</item>
<!-- 指定消失的动画xml -->
</style>
anim_enter_bottom:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate android:fromYDelta="100%" android:toYDelta="0" android:duration="300" />
</set>
anim_exit_bottom:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate android:fromYDelta="0" android:toYDelta="100%" android:duration="300" />
</set>
使用方法:
BottomPopupOption bottomPopupOption = new BottomPopupOption(TradeManageActivity.this);
bottomPopupOption.setItemText("拍照", "选择相册");
// bottomPopupOption.setColors();//设置颜色
bottomPopupOption.showPopupWindow();
注意:setColor需要和setItemText 值相对于
如果popWindow需要Title就使用带有二个参数的构造方法
有点击事件,采用接口回调的方式
bottomPopupOption.setItemClickListener(new BottomPopupOption.onPopupWindowItemClickListener() {
@Override
public void onItemClick(int position) {
}
});