引用:http://hi.baidu.com/android168/item/91b91c477adc523cfb89607a
類似360的手機記憶體管理小懸浮控件和天天動聽的懸浮歌詞
主要用到的技術Service+WindowManager+LayoutParams的type
public class TopFloatService extends Service {
WindowManager wm = null;
WindowManager.LayoutParams wmParams = null;
View view;
private float mTouchStartX;
private float mTouchStartY;
private float x;
private float y;
@Override
public void onCreate() {
super.onCreate();
setForeground(true);
view = LayoutInflater.from(this).inflate(R.layout.floating, null);
}
public void onStart(Intent intent, int startId) {
// TODO Auto-generated method stub
super.onStart(intent, startId);
createView();
private void createView() {
// 擷取WindowManager
wm = (WindowManager) getApplicationContext().getSystemService("window");
// 設定LayoutParams(全局變量)相關參數
wmParams = ((MyApplication) getApplication()).getMywmParams();
wmParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ERROR;
// 該類型提供與使用者互動,置于所有應用程式上方,但是在狀态欄後面
// TYPE_TOAST TYPE_SYSTEM_OVERLAY 在其他應用上層 在通知欄下層 位置不能動鳥
// TYPE_PHONE 在其他應用上層 在通知欄下層
// TYPE_PRIORITY_PHONE TYPE_SYSTEM_ALERT 在其他應用上層 在通知欄上層 沒試出來差別是啥
// TYPE_SYSTEM_ERROR 最頂層(通過對比360和天天動聽歌詞得出)
//用别的TYPE還出報錯... 也希望大家補充一下
wmParams.flags |= WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;// 不接受任何按鍵事件
wmParams.gravity = Gravity.LEFT | Gravity.TOP; // 調整懸浮視窗至左上角
// 以螢幕左上角為原點,設定x、y初始值
wmParams.x = 0;
wmParams.y = 0;
// 設定懸浮視窗長寬資料
wmParams.width = WindowManager.LayoutParams.WRAP_CONTENT;
wmParams.height = WindowManager.LayoutParams.WRAP_CONTENT;
wmParams.format = PixelFormat.RGBA_8888;
wm.addView(view, wmParams);
view.setOnTouchListener(new OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
// 擷取相對螢幕的坐标,即以螢幕左上角為原點
x = event.getRawX();
// 25是系統狀态欄的高度,也可以通過方法得到準确的值,自己微調就是了
y = event.getRawY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
// 擷取相對View的坐标,即以此View左上角為原點
mTouchStartX = event.getX();
mTouchStartY = event.getY() + view.getHeight() / 2;
break;
case MotionEvent.ACTION_MOVE:
updateViewPosition();
case MotionEvent.ACTION_UP:
mTouchStartX = mTouchStartY = 0;
return true;
});
private void updateViewPosition() {
// 更新浮動視窗位置參數
wmParams.x = (int) (x - mTouchStartX);
wmParams.y = (int) (y - mTouchStartY);
wm.updateViewLayout(view, wmParams);
public IBinder onBind(Intent intent) {
return null;
記得權重限 <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />公司的網被強鳥,上傳附件和圖檔都不行 擦