PopupWindow(懸浮框)的基本使用
本節引言:
本節帶給大家的是最後一個用來顯示訊息的UI控制項-PopupWindow(懸浮框),如果你想知道 他長什麼樣子,你可以打開你手機的QQ,長按清單中的某項,這個時候後彈出一個黑色的小 對話框,這種就是PopupWindow了,和AlertDialog對話框不同的是,他的位置可以是隨意的;
另外AlertDialog是非堵塞線程的,而PopupWindow則是堵塞線程的!而官方有這樣一句話來介紹 PopupWindow:
A popup window that can be used to display an arbitrary view. The popup window is
#a floating container that appears on top of the current activity.
大概意思是:一個彈出視窗控件,可以用來顯示任意View,而且會浮動在目前activity的頂部
下面我們就來對這個控件進行學習~
官方文件:PopupWindow
1.相關方法解讀
1)幾個常用的建構方法
我們在文件中可以看到,提供給我們的PopupWindow的建構方法有九種之多,這裡只貼實際 開發中使用較多的幾個建構方法:
參數就不用多解釋了吧,contentView是PopupWindow顯示的View,focusable是否顯示焦點
- public PopupWindow (Context context)
- public PopupWindow(View contentView, int width , int height)
- public PopupWindow(View contentView)
- ##public PopupWindow(View contentView, int width, int height, boolean focusable)
2)常用的一些方法
以下介紹幾個用得較多的一些方法,其他的可自行查閱文件:
- setContentView(View contentView):設定PopupWindow顯示的View
- getContentView():取得PopupWindow顯示的View
- showAsDropDown(View anchor):相對某個控制項的位置(正左下方),無偏移
- showAsDropDown(View anchor, int xoff, int yoff) :相對某個控制項的位置,有偏移
- showAtLocation(View parent, int gravity, int x, int y): 相對於父控制的位置(例如正中央Gravity.CENTER,下方Gravity.BOTTOM等),可以設定偏移或無偏移 PS:parent這個參數只要是activity中的view就可以了!
- setWidth/setHeight:設定寬高,也可以在建構法指定好寬高, 除了可以寫具體的值,還可以用WRAP_CONTENT或MATCH_PARENT, popupWindow的width和height屬性直接和第一層View相對應。
- setFocusable(true):設定焦點,PopupWindow彈出後,所有的觸控螢幕和實體按鍵都由PopupWindows 處理。其他任何事件的回應都必須發生在PopupWindow消失之後,(home 等系統層面的事件除外)。 例如這樣一個PopupWindow出現的時候,按back鍵先是讓PopupWindow消失,第二次按才是退出 activity,準確的說是想退出activity你得首先讓PopupWindow消失,因為不併是任何情況下按back PopupWindow都會消失,必須在PopupWindow設置了背景的情況下 。
- setAnimationStyle(int):設定動畫效果
2.使用程式碼範例
##運行效果圖:
實作關鍵程式碼:
先貼動畫檔案:anim_pop.xml:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android. com/apk/res/android">
<alpha android:fromAlpha="0"
android:toAl ) /alpha>
</set>
#############################################################################################################################################################################################
#3.範例程式碼下載PopWindowDemo.zip
###############################11#######PopWindowDemo.zip##########本節小結:#########時間關係,並沒有想到好一點的範例,就寫了一個簡單的demo,應該能滿足簡單的需要,另外
如果想深入研究下PopupWindow的話可看下述的參考文獻:###Android PopupWindow的使用與分析###Android PopupWindow詳解###嗯,就說這麼多,謝謝~######## #<alpha android:fromAlpha="0"
android:toAl ) /alpha>
</set>
#
連結是popupWindow的佈局:item_popip.xml:
#
< ;LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
"../style/images/ic_pop_bg"
android:orientation="vertical">
# 「wrap_content"
android:layout_height="wrap_content"
android:padding="5dp " />
<按鈕
android:id="@+id/btn_hehe"
and android:padding= "5dp"
android:text="呵呵"
android:textSize="18sp" />
< ;LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
"../style/images/ic_pop_bg"
android:orientation="vertical">
# 「wrap_content"
android:layout_height="wrap_content"
android:padding="5dp " />
<按鈕
android:id="@+id/btn_hehe"
and android:padding= "5dp"
android:text="呵呵"
android:textSize="18sp" />
MainActivity.java:
公共類別MainActivity 擴充AppCompatActivity {
私有按鈕btn_show;
# 私有上下文mContext;
# # super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);# ࠠ). btn_show = (Button) findViewById(R.id.btn_show);
btn_show .setOnClickListener(new View.OnClickListener() {
@Override
initPopWindow(v);
}
# private void initPopWindow(View v) {
View view = LayoutInflater. 按鈕 btn_xixi = (按鈕) view.findViewById(R.id.btn_xixi);
Button btn_hehe = (Button) view.findViewById(R.id.高
final PopupWindow popWindow = new PopupWindow(view,
, true);
popWindow.setAnimationStyle(R.anim.anim_pop); //設定載入動畫
//這些要點選非PopupWindow區域,PopupWindow會消失的,如果沒有下面的
//代碼的話,你會發現,當你把PopPopdow出來顯示了,或是Window你按幾次後退鍵
//PopupWindow並不會關閉,且退出不出程序,加上下面的程式碼可以解決這個問題
popWindow.setTouchable(true);
popWindow.setTouchInterceptor(new View.OnTouchListener() {
onTouch(View v, MotionEvent event) {
return false / 這裡如果返回true的話,touch事件將被攔截
// 攔截後 PopupWindow的onTouchEvent卡 });
popWindow.setBackgroundDrawable(new ColorDrawable(0x00000000)); //要為popWindow設定背景才有效
//設定popupWindow軸的位置,參數依序為參考View,x //設定popupWindow軸的位置,參數依序為參考View,x軸的偏移量移量
popWindow.showAsDropDown(v, 50, 0);
//設定popupWindow集的按鈕的事件## {
@Override
public void onClick(View v) {
;
}
# });
btn_hehe.setOnClickListener(new View.OnClickListener() {
{
Toast.makeText(MainActivity.this, "你點選了呵呵~", Toast .LENGTH_SHORT).show();
popWindow.dismiss();
}
});
}
}
私有按鈕btn_show;
# 私有上下文mContext;
# # super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);# ࠠ). btn_show = (Button) findViewById(R.id.btn_show);
btn_show .setOnClickListener(new View.OnClickListener() {
@Override
initPopWindow(v);
}
# private void initPopWindow(View v) {
View view = LayoutInflater. 按鈕 btn_xixi = (按鈕) view.findViewById(R.id.btn_xixi);
Button btn_hehe = (Button) view.findViewById(R.id.高
final PopupWindow popWindow = new PopupWindow(view,
, true);
popWindow.setAnimationStyle(R.anim.anim_pop); //設定載入動畫
//這些要點選非PopupWindow區域,PopupWindow會消失的,如果沒有下面的
//代碼的話,你會發現,當你把PopPopdow出來顯示了,或是Window你按幾次後退鍵
//PopupWindow並不會關閉,且退出不出程序,加上下面的程式碼可以解決這個問題
popWindow.setTouchable(true);
popWindow.setTouchInterceptor(new View.OnTouchListener() {
onTouch(View v, MotionEvent event) {
return false / 這裡如果返回true的話,touch事件將被攔截
// 攔截後 PopupWindow的onTouchEvent卡 });
popWindow.setBackgroundDrawable(new ColorDrawable(0x00000000)); //要為popWindow設定背景才有效
//設定popupWindow軸的位置,參數依序為參考View,x //設定popupWindow軸的位置,參數依序為參考View,x軸的偏移量移量
popWindow.showAsDropDown(v, 50, 0);
//設定popupWindow集的按鈕的事件## {
@Override
public void onClick(View v) {
;
}
# });
btn_hehe.setOnClickListener(new View.OnClickListener() {
{
Toast.makeText(MainActivity.this, "你點選了呵呵~", Toast .LENGTH_SHORT).show();
popWindow.dismiss();
}
});
}
}
3.範例程式碼下載
PopWindowDemo.zip
#3.範例程式碼下載PopWindowDemo.zip