Android用Popupwindow做消息长按提示框(一)
一、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还是有点问题,希望各位大佬多多指教