public class CircleScreenPopWindow extends PopupWindow {
private int del;//0不显示1显示
private int follow;// 是否取消关注0未关注1是取消关注2是隐藏掉按钮
private int shield;//是否已屏蔽0未屏蔽1是已屏蔽2是隐藏掉按钮
private int collection;//是否已收藏0未收藏1是已收藏2是隐藏掉按钮
private int isshare;//是否可分享3是隐藏掉按钮
private Display display;
private int type;// 1 为顶部popup 2为列表popup
private Context context;
private List list = new ArrayList();
private View conentView;
private MyListView listView;
private ImageView arrow_up;
private ImageView arrow_down;
private int[] imgdata = new int[]{};
private CircleScreenPopuAdapter selectAdapter;
private OnItemListener onItemListener;
private int report;
public interface OnItemListener {
void OnItemListener(int position, CircleScreenBean CircleScreen);
}
public void setOnItemMyListener(OnItemListener onItemListener) {
this.onItemListener = onItemListener;
}
public CircleScreenPopWindow(Context context, int type, int follow, int shield, int collection) {
this.context = context;
this.type = type;
this.follow = follow;
this.shield = shield;
this.collection = collection;
WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
display = windowManager.getDefaultDisplay();
initView();
}
public CircleScreenPopWindow(Context context, int type, int follow, int shield, int collection, int del) {
this.context = context;
this.type = type;
this.follow = follow;
this.shield = shield;
this.collection = collection;
this.del = del;
WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
display = windowManager.getDefaultDisplay();
initView();
}
public CircleScreenPopWindow(Context context) {
this.context = context;
initView();
}
/**
* @param isshare 分享
* @param follow 关注
* @param shield 屏蔽
* @param collection 收藏
* @param report 关注
*/
public void notifyData(int isshare, int follow, int shield, int collection, int report) {
this.isshare = isshare;
this.follow = follow;
this.shield = shield;
this.collection = collection;
this.report = report;
list.clear();
list.addAll(setData(type));
selectAdapter.notifyDataSetChanged();
}
private void initView() {
list.addAll(setData(type));
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
this.conentView = inflater.inflate(R.layout.circle_popupwindow, null);
// 设置SelectPicPopupWindow的View
this.setContentView(conentView);
// 设置SelectPicPopupWindow弹出窗体的宽
this.setWidth(display.getWidth() * 2 / 5 + 20);
// 设置SelectPicPopupWindow弹出窗体的高
this.setHeight(LinearLayout.LayoutParams.WRAP_CONTENT);
// 设置SelectPicPopupWindow弹出窗体可点击
this.setFocusable(true);
this.setOutsideTouchable(true);
// 刷新状态
this.update();
// 实例化一个ColorDrawable颜色为半透明
ColorDrawable dw = new ColorDrawable(0000000000);
// 点back键和其他地方使其消失,设置了这个才能触发OnDismisslistener ,设置其他控件变化等操作
this.setBackgroundDrawable(dw);
// 设置SelectPicPopupWindow弹出窗体动画效果
this.setAnimationStyle(R.style.popupwindow_anim_up);
//必须为MyListView 否则在控件上方显示时位置不对
this.listView = (MyListView) conentView.findViewById(R.id.circle_popup_lv);
this.arrow_up = (ImageView) conentView.findViewById(R.id.circle_top_img);
this.arrow_down = (ImageView) conentView.findViewById(R.id.circle_down_img);
this.selectAdapter = new CircleScreenPopuAdapter(context, list);
this.listView.setAdapter(selectAdapter);
this.listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView> parent, View view, int position, long id) {
if (isShowing()) {
dismiss();
}
onItemListener.OnItemListener(position, list.get(position));
}
});
this.setOnDismissListener(new OnDismissListener() {
@Override
public void onDismiss() {
//取消监听
}
});
LinearLayout.LayoutParams paramTest = (LinearLayout.LayoutParams) arrow_up.getLayoutParams();
if (type == 1) {
paramTest.rightMargin = 10;
this.arrow_up.setLayoutParams(paramTest);
} else {
paramTest.rightMargin = 15;
this.arrow_up.setLayoutParams(paramTest);
}
}
/**
* 显示popupWindow
*
* @param
*/
public void showPopupWindow(View v) {
int[] location = new int[2];
v.getLocationOnScreen(location); //获取控件的位置坐标
// 获取屏幕的高宽
int screenHeight = getScreenHeight(v.getContext());
int screenWidth = getScreenWidth(v.getContext());
//获取自身的长宽高
conentView.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);
int popupWidth = conentView.getMeasuredWidth(); // 获取测量后的宽度
int popupHeight = conentView.getMeasuredHeight(); //获取测量后的高度
if (location[1] > screenHeight / 2) {
this.setAnimationStyle(R.style.popupwindow_anim_up);
arrow_up.setVisibility(View.GONE);
arrow_down.setVisibility(View.VISIBLE);
this.showAtLocation(v, Gravity.TOP, (location[0] + v.getWidth() / 2) - popupWidth / 2, location[1] - popupHeight);
} else {
this.setAnimationStyle(R.style.popupwindow_anim_down);
arrow_up.setVisibility(View.VISIBLE);
arrow_down.setVisibility(View.GONE);
this.showAsDropDown(v, 0, 0);
}
}
/**
* 在android7.0上,如果不主动约束PopuWindow的大小,比如,设置布局大小为 MATCH_PARENT,那么PopuWindow会变得尽可能大,以至于 view下方无空间完全显示PopuWindow,而且view又无法向上滚动,此时PopuWindow会主动上移位置,直到可以显示完全。
* 解决办法:主动约束PopuWindow的内容大小,重写showAsDropDown方法:
*
* @param anchor
*/
@Override
public void showAsDropDown(View anchor) {
if (Build.VERSION.SDK_INT >= 24) {
Rect visibleFrame = new Rect();
anchor.getGlobalVisibleRect(visibleFrame);
int height = anchor.getResources().getDisplayMetrics().heightPixels - visibleFrame.bottom;
setHeight(height);
}
super.showAsDropDown(anchor);
}
/**
* 获取屏幕高度(px)
*/
private int getScreenHeight(Context context) {
return context.getResources().getDisplayMetrics().heightPixels;
}
/**
* 获取屏幕宽度(px)
*/
private int getScreenWidth(Context context) {
return context.getResources().getDisplayMetrics().widthPixels;
}
private List setData(int type) {
List list = new ArrayList();
CircleScreenBean c = new CircleScreenBean();
c.setId(1);
c.setName("最新的");
c.setImageResouse(R.drawable.circle_new);
list.add(c);
c = new CircleScreenBean();
c.setId(2);
c.setName("关注的");
c.setImageResouse(R.drawable.circle_follow);
list.add(c);
c = new CircleScreenBean();
c.setId(3);
c.setName("屏蔽的");
c.setImageResouse(R.drawable.circle_shield);
list.add(c);
return list;
}
}
2:CircleScreenBean--------------------------------------------------------------------------
public class CircleScreenBean {
private int id;
private String name;
private int imageResouse;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getImageResouse() {
return imageResouse;
}
public void setImageResouse(int imageResouse) {
this.imageResouse = imageResouse;
}
public CircleScreenBean() {
}
}
3:MyListView-----------------------------------------------------------------------
public class MyListView extends ListView {
public MyListView(Context context) {
super(context);
}
public MyListView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MyListView(Context context, AttributeSet attrs,
int defStyle) {
super(context, attrs, defStyle);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, expandSpec);
}
}
4:CircleScreenPopuAdapter--------------------------------------------------------------------------------------------
public class CircleScreenPopuAdapter extends BaseAdapter {
private Context context;
private List list;
public CircleScreenPopuAdapter(Context context, List list) {
this.context = context;
this.list = list;
}
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder mHolder;
if (convertView == null) {
convertView = LayoutInflater.from(context).inflate(R.layout.circle_screen_popup_item, null);
mHolder = new ViewHolder(convertView);
convertView.setTag(mHolder);
} else {
mHolder = (ViewHolder) convertView.getTag();
}
mHolder.ciclePopuName.setText(list.get(position).getName());
mHolder.ciclePopuImg.setImageResource(list.get(position).getImageResouse());
return convertView;
}
class ViewHolder {
@BindView(R.id.cicle_popu_img)
ImageView ciclePopuImg;
@BindView(R.id.cicle_popu_name)
TextView ciclePopuName;
ViewHolder(View view) {
ButterKnife.bind(this, view);
}
}
}
5:circle_screen_popup_item------------------------------------------------------------------
6:circle_popupwindow--------------------------------------------------------------------------------
两个style,三个动画:
动画图片资源链接 https://download.csdn.net/download/a1063560406/12288881
代码中使用:
circleScreenPopWindow = new CircleScreenPopWindow(getActivity(), 2, 0, 0, 0);
circleScreenPopWindow.showPopupWindow(ivAdd);