仿微信右上角弹框效果

先看效果仿微信右上角弹框效果_第1张图片

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);

你可能感兴趣的:(android)