美文网首页
Android用Popupwindow做消息长按提示框(一)

Android用Popupwindow做消息长按提示框(一)

作者: 苏墨白梦觉泪满青衫湿 | 来源:发表于2017-09-20 18:52 被阅读0次

    一、popupwindow工具类

    /**

    * @创建者 Sun

    * @创建时间 2016/8/19

    * @描述 popupwindow工厂

    */

    public class PopupWindowUtils {

    /**

    * 得到在屏幕中间的popupwindow并显示(宽高都是包裹视图)

    *

    * @param contentView popupwindow要显示的视图

    * @param parentView  参考视图

    * @return

    */

    public static PopupWindow getPopupWindowInCenter(View contentView, View parentView) {

    //        int width = ViewGroup.LayoutParams.MATCH_PARENT;

    int width = ViewGroup.LayoutParams.WRAP_CONTENT;

    int height = ViewGroup.LayoutParams.WRAP_CONTENT;

    return getPopupWindowInCenter(contentView, width, height, parentView);

    }

    /**

    * 得到在屏幕中间的popupwindow并显示

    *

    * @param contentView popupwindow要显示的视图

    * @param width      popupwindow的宽度

    * @param height      popupwindow的高度

    * @param parentView  参考视图

    * @return

    */

    public static PopupWindow getPopupWindowInCenter(View contentView, int width, int height, View parentView) {

    //Gravity.CENTER:在屏幕居中,无偏移

    return getPopupWindowAtLocation(contentView, width, height, parentView, Gravity.CENTER, 0, 0);

    }

    /**

    * 得到指定在某个视图内位置的popupwindow并显示

    *

    * @param contentView popupwindow要显示的视图

    * @param width      popupwindow的宽度

    * @param height      popupwindow的高度

    * @param parentView  参考视图

    * @param gravityType 在参考视图中的相对位置

    * @param xoff        x轴偏移量

    * @param yoff        y轴偏移量

    * @return

    */

    public static PopupWindow getPopupWindowAtLocation(View contentView, int width, int height, View parentView, int gravityType, int xoff, int yoff) {

    PopupWindow popupWindow = getPopupWindow(contentView, width, height);

    //在parentView中偏移xoff和yoff

    popupWindow.showAtLocation(parentView,

    gravityType, xoff, yoff);

    return popupWindow;

    }

    public static PopupWindow getPopupWindowAtLocation(View contentView, View parentView, int gravityType, int xoff, int yoff) {

    return getPopupWindowAtLocation(contentView, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT, parentView, gravityType, xoff, yoff);

    }

    /**

    * 得到一个自动识别在目标控件上方或下方的pupupwindow并显示

    *

    * @param contentView popupwindow要显示的视图

    * @param width      popupwindow的宽度

    * @param activity    能得到getWindowManager()的上下文

    * @return

    */

    public static PopupWindow getPopupWindowAsDropDownParentAuto(View contentView, int width, int height, View anchorView, Activity activity) {

    //        View itemView = (View) contentView.getParent();// 得到contentView的父控件

    PopupWindow popupWindow = getPopupWindow(contentView, width, height);

    // 控制它放置的位置

    if (isShowBottom(activity, anchorView)) {// 显示popupwindow在itemView的下方,偏移量都为0

    popupWindow.showAsDropDown(anchorView, 0, 0);

    } else {// 显示popupwindow在itemView的上方,偏移量y都为-2*itemView.getHeight()

    popupWindow.showAsDropDown(anchorView, 0,

    -2 * anchorView.getHeight());

    }

    return popupWindow;

    }

    /**

    * 得到在指定某个视图外的popupwindow并显示

    *

    * @param contentView popupwindow要显示的视图

    * @param width      popupwindow的宽度

    * @param height      popupwindow的高度

    * @param anchorView  参考视图

    * @param xoff        x轴偏移量

    * @param yoff        y轴偏移量

    * @return

    */

    public static PopupWindow getPopupWindowAsDropDown(View contentView, int width, int height, View anchorView, int xoff, int yoff) {

    PopupWindow popupWindow = getPopupWindow(contentView, width, height);

    popupWindow.showAsDropDown(anchorView, xoff, yoff);

    return popupWindow;

    }

    /**

    * 得到在指定某个视图外的popupwindow并显示(该方法只支持4.4以上)

    *

    * @param contentView popupwindow要显示的视图

    * @param width      popupwindow的宽度

    * @param height      popupwindow的高度

    * @param anchorView  参考视图

    * @param gravityType 在参考视图外的相对位置

    * @param xoff        x轴偏移量

    * @param yoff        y轴偏移量

    * @return

    */

    @TargetApi(Build.VERSION_CODES.KITKAT)

    public static PopupWindow getPopupWindowAsDropDown(View contentView, int width, int height, View anchorView, int gravityType, int xoff, int yoff) {

    PopupWindow popupWindow = getPopupWindow(contentView, width, height);

    popupWindow.showAsDropDown(anchorView, xoff, yoff, gravityType);

    return popupWindow;

    }

    /**

    * 判断popupWindow是否显示在条目的下方

    *

    * @param itemView

    * @return

    */

    private static boolean isShowBottom(Activity context, View itemView) {

    // 得到屏幕的高度

    // int heightPixels =

    // getResources().getDisplayMetrics().heightPixels;//方式1

    int screenHeight = context.getWindowManager().getDefaultDisplay().getHeight();// 方式2

    int[] location = new int[2];

    // location[0]-->x

    // location[1]-->y

    itemView.getLocationInWindow(location);

    // 得到itemView在屏幕中Y轴的值

    int itemViewY = location[1];

    // 得到itemView距离屏幕底部的距离

    int distance = screenHeight - itemViewY - itemView.getHeight();

    if (distance < itemView.getHeight()) {// 条目下方放不下popupWindow

    return false;

    } else {// 条目下方放得下popupWindow

    return true;

    }

    }

    /**

    * 最核心的pupupwindow创建方法

    *

    * @param contentView popupwindow要显示的视图

    * @param width      popupwindow的宽度

    * @param height      popupwindow的高度

    * @return

    */

    @NonNull

    private static PopupWindow getPopupWindow(View contentView, int width, int height) {

    PopupWindow popupWindow = new PopupWindow(contentView, width, height, true);

    popupWindow.setOutsideTouchable(false);

    openOutsideTouchable(popupWindow);

    return popupWindow;

    }

    /**

    * 点击popupwindow范围以外的地方时隐藏

    *

    * @param popupWindow

    */

    public static void openOutsideTouchable(PopupWindow popupWindow) {

    popupWindow.setBackgroundDrawable(new BitmapDrawable());

    popupWindow.setOutsideTouchable(true);

    }

    /**

    * 使window变暗

    */

    public static void makeWindowDark(Activity activity) {

    makeWindowDark(activity, 0.7f);

    }

    public static void makeWindowDark(Activity activity, float alpha) {

    WindowManager.LayoutParams lp = activity.getWindow().getAttributes();

    lp.alpha = alpha;

    activity.getWindow().setAttributes(lp);

    }

    /**

    * 使window变亮

    */

    public static void makeWindowLight(Activity activity) {

    WindowManager.LayoutParams lp = activity.getWindow().getAttributes();

    lp.alpha = 1f;

    activity.getWindow().setAttributes(lp);

    }

    }

    二、在代码中的使用,以下代码写在你得OnLongClick点击事件下面

    View menuView = View.inflate(mContext, R.layout.layout_longclick_popwindow, null);

    final PopupWindow popupWindow = PopupWindowUtils.getPopupWindowAsDropDownParentAuto(menuView, RecyclerView.LayoutParams.WRAP_CONTENT, RecyclerView.LayoutParams.WRAP_CONTENT, view, mContext);

    menuView.findViewById(R.id.tvcope).setOnClickListener(new View.OnClickListener() {

    @Override

    public void onClick(View v) {

    ClipboardManager cm = (ClipboardManager) mContext.getSystemService(Context.CLIPBOARD_SERVICE);

    cm.setText(sText);

    popupWindow.dismiss();

    }

    });

    menuView.findViewById(R.id.tvforward).setOnClickListener(new View.OnClickListener() {

    @Override

    public void onClick(View v) {

    popupWindow.dismiss();

    }

    });

    menuView.findViewById(R.id.tvcollection).setOnClickListener(new View.OnClickListener() {

    @Override

    public void onClick(View v) {

    popupWindow.dismiss();

    }

    });

    menuView.findViewById(R.id.tvdelete).setOnClickListener(new View.OnClickListener() {

    @Override

    public void onClick(View v) {

    }

    });

    三、布局代码

    就是在CardView里面创建一个LinearLayout,下面放你需要的Textview

    四、使用起来还是有一定问题

    getPopupWindowAsDropDownParentAuto()这个自动识别在目标控件上方或下方的pupupwindow还是有点问题,希望各位大佬多多指教

    相关文章

      网友评论

          本文标题:Android用Popupwindow做消息长按提示框(一)

          本文链接:https://www.haomeiwen.com/subject/vinosxtx.html