2.3. 查看屏幕上的Window
我們再往屏幕上加一個(gè)PopupWindow和一個(gè)Dialog,當(dāng)前界面如下:
在Eclipse中,點(diǎn)擊菜單 Window - Open Perspective - Others,選擇 HierarchyView,打開,選擇Windows面板,可以看到當(dāng)前屏幕中所有的Window:
我們添加的Window在其中顯示的標(biāo)題為AddWindow,另外,我們可以看到還有別的幾個(gè)Window,比如 PopupWindow,MainActivity,加粗的那一個(gè)其實(shí)是MainActivity中彈出的Dialog,還能看到 StatusBar(狀態(tài)欄),RecentsPanel(最近應(yīng)用列表)等等,這也證明了我們前面說的,Android中所有的界面都是顯示在Window中的。
3桌面懸浮窗實(shí)現(xiàn)思路
3.1. 在桌面上顯示W(wǎng)indow
如果我們在Activity中使用WindowManager添加Window,當(dāng)Activity退出時(shí),添加的Window也會被回收掉。所以要想在桌面上顯示懸浮窗,可以在Service中使用WindowManager添加Window,這樣只要服務(wù)不停止,就可以一直顯示。當(dāng)服務(wù)啟動時(shí),在其onCreate方法中,使用WindowManager的 addView方法添加一個(gè)系統(tǒng)Window,當(dāng)服務(wù)銷毀時(shí),可以在其 onDestroy中使用WindowManager的removeView 方法移除Window。大體是這樣的思路,代碼就不再給出了。
3.2.. 讓這個(gè)Window隨手指移動
要想讓這個(gè)Window能接收事件,需要給他設(shè)置相應(yīng)的flags(只要不包含F(xiàn)LAG_NOT_TOUCHABLE即可),另外其type也不能是 TYPE_TOAST??梢允褂茫篢YPE_PRIORITY_PHONE,表示比來去電界面的Window級別還要高一些(來去電界面的Window是系統(tǒng)Window)。
mParams.type = WindowManager.LayoutParams. TYPE_PRIORITY_PHONE;
mParams.flags = WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
| WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
注意添加權(quán)限:
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
然后給Window里的View設(shè)置onTouchListener,重寫onTouch方法:
private int mStartX;
private int mStartY;
@Override
public boolean onTouch(View v,MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
// 記錄坐標(biāo)起始點(diǎn),getRawX,getRawY返回值為float,
// 需轉(zhuǎn)化為int,變成像素?cái)?shù)后再使用
mStartX = (int) event.getRawX();
mStartY = (int) event.getRawY();
break;
case MotionEvent.ACTION_MOVE:
int newX = (int) event.getRawX();
int newY = (int) event.getRawY();
// 獲取手指移動的距離
int dx = newX - mStartX;
int dy = newY - mStartY;
// 修改Window的x,y坐標(biāo)
mParams.x += dx;
mParams.y += dy;
// 修改Window的布局參數(shù)
// 這里不能修改Window里的View的布局參數(shù),因?yàn)閂iew是在Window中顯示的,
// 修改View的布局參數(shù)并不能移動外面的Window
mWindowManager.updateViewLayout(mView,mParams);
// 重新記錄新的坐標(biāo)起始點(diǎn)
mStartX = (int) event.getRawX();
mStartY = (int) event.getRawY();
break;
default:
break;
}
return true;
}
這樣就實(shí)現(xiàn)了Window隨著手指拖動而移動了。
本文版權(quán)歸傳智播客Android培訓(xùn)學(xué)院所有,歡迎轉(zhuǎn)載,轉(zhuǎn)載請注明作者出處。謝謝!
作者:傳智播客Android培訓(xùn)學(xué)院
首發(fā):http://xamj520.com/Android