為你的應用新增懸浮框
阿新 • • 發佈:2019-02-19
不知道有沒有童鞋用過QQ的Android版本中的一個高清版本,當你退出QQ的時候,會在你的螢幕上出現一個QQ圖示的懸浮窗,就和PC上的迅雷的懸浮視窗一樣,在所有應用的最上層,本來這個功能感覺還是挺好的,結果TX就給流氓了下,居然沒有做隱藏掉這個懸浮窗的功能。
今天就來為大家簡單介紹下這個懸浮窗的實現方法吧,不過記住至少還是給使用者做一個隱藏掉這個懸浮窗的功能吧!其實實現原理還是挺簡單的,就是利用WindowManager將你的圖示View新增到視窗中,不知道大家知道WindowManager.LayoutParams中有一個type屬性不,這裡玄機挺大的,找了好久,終於給我試出來有一個TYPE_PHONE 可以來實現這個功能的,該型別提供與使用者互動,置於所有應用程式上方,但是在狀態列後面。至於其他的型別,大家還是去找API或者GG吧。
先看下效果圖吧:
紅框圈中得圖示可以任意拖動哦,你可以根據自己的實際需要給圖示新增功能。
核心程式碼如下:
今天就來為大家簡單介紹下這個懸浮窗的實現方法吧,不過記住至少還是給使用者做一個隱藏掉這個懸浮窗的功能吧!其實實現原理還是挺簡單的,就是利用WindowManager將你的圖示View新增到視窗中,不知道大家知道WindowManager.LayoutParams中有一個type屬性不,這裡玄機挺大的,找了好久,終於給我試出來有一個TYPE_PHONE
先看下效果圖吧:
紅框圈中得圖示可以任意拖動哦,你可以根據自己的實際需要給圖示新增功能。
核心程式碼如下:
-
package com.apkstory.service;
-
import com.apkstory.R;
-
import com.apkstory.util.MyApplication;
-
import android.app.Service;
-
import android.content.Intent;
-
import android.graphics.PixelFormat;
-
import android.os.IBinder;
-
import android.view.Gravity;
-
import android.view.LayoutInflater;
-
import android.view.MotionEvent;
-
import android.view.View;
-
import android.view.WindowManager;
-
import android.view.View.OnTouchListener;
-
/**
-
* 懸浮窗的製作
-
* @author 鋒翼
-
* @link www.apkstory.com
-
*/
-
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();
-
view = LayoutInflater.from(this).inflate(R.layout.floating, null);
-
createView();
-
}
-
private void createView() {
-
// 獲取WindowManager
-
wm = (WindowManager) getApplicationContext().getSystemService("window");
-
// 設定LayoutParams(全域性變數)相關引數
-
wmParams = ((MyApplication) getApplication()).getMywmParams();
-
wmParams.type = WindowManager.LayoutParams.TYPE_PHONE;// 該型別提供與使用者互動,置於所有應用程式上方,但是在狀態列後面
-
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()-25 ;
-
switch (event.getAction()) {
-
case MotionEvent.ACTION_DOWN:
-
// 獲取相對View的座標,即以此View左上角為原點
-
mTouchStartX = event.getX();
-
mTouchStartY = event.getY()+view.getHeight()/2;
-
break;
-
case MotionEvent.ACTION_MOVE:
-
updateViewPosition();
-
break;
-
case MotionEvent.ACTION_UP:
-
updateViewPosition();
-
mTouchStartX = mTouchStartY = 0;
-
break;
-
}
-
return true;
-
}
-
});
-
}
-
private void updateViewPosition() {
-
// 更新浮動視窗位置引數
-
wmParams.x = (int) (x - mTouchStartX);
-
wmParams.y = (int) (y - mTouchStartY);
-
wm.updateViewLayout(view, wmParams);
-
}
-
@Override
-
public IBinder onBind(Intent intent) {
-
return null;
-
}
-
}