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還是有點問題,希望各位大佬多多指教

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,030評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,310評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,951評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,796評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,566評論 6 407
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,055評論 1 322
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,142評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,303評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,799評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,683評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,899評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,409評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,135評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,520評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,757評論 1 282
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,528評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,844評論 2 372

推薦閱讀更多精彩內容