3桌面懸浮窗實(shí)現(xiàn)思路
3.1. 在桌面上顯示W(wǎng)indow
如果我們?cè)贏ctivity中使用WindowManager添加Window,當(dāng)Activity退出時(shí),添加的Window也會(huì)被回收掉。所以要想在桌面上顯示懸浮窗,可以在Service中使用WindowManager添加Window,這樣只要服務(wù)不停止,就可以一直顯示。當(dāng)服務(wù)啟動(dòng)時(shí),在其onCreate方法中,使用WindowManager的 addView方法添加一個(gè)系統(tǒng)Window,當(dāng)服務(wù)銷(xiāo)毀時(shí),可以在其 onDestroy中使用WindowManager的removeView 方法移除Window。大體是這樣的思路,代碼就不再給出了。
3.2.. 讓這個(gè)Window隨手指移動(dòng)
要想讓這個(gè)Window能接收事件,需要給他設(shè)置相應(yīng)的flags(只要不包含F(xiàn)LAG_NOT_TOUCHABLE即可),另外其type也不能是 TYPE_TOAST??梢允褂茫篢YPE_PRIORITY_PHONE,表示比來(lái)去電界面的Window級(jí)別還要高一些(來(lái)去電界面的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,重寫(xiě)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();
// 獲取手指移動(dòng)的距離
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ù)并不能移動(dòng)外面的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隨著手指拖動(dòng)而移動(dòng)了。
本文版權(quán)歸傳智播客Android培訓(xùn)學(xué)院所有,歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)注明作者出處。謝謝!
作者:傳智播客Android培訓(xùn)學(xué)院
首發(fā):http://xamj520.com/Android