Android 懸浮窗用法
阿新 • • 發佈:2018-12-27
宣告許可權
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
注意:在MIUI上需要在”安全中心-授權管理-應用許可權管理”開啟“顯示懸浮窗”開關,並重啟應用。
建立懸浮窗管理類
/**
* 懸浮窗管理類
*/
public class FloatingManager {
private WindowManager mWindowManager;
private static FloatingManager mInstance;
private Context mContext;
public static FloatingManager getInstance(Context context) {
if (mInstance == null) {
mInstance = new FloatingManager(context);
}
return mInstance;
}
private FloatingManager(Context context) {
mContext = context;
mWindowManager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);//獲得WindowManager物件
}
/**
* 新增懸浮窗
* @param view
* @param params
* @return
*/
protected boolean addView(View view, WindowManager.LayoutParams params) {
try {
mWindowManager.addView(view, params);
return true;
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
/**
* 移除懸浮窗
* @param view
* @return
*/
protected boolean removeView(View view) {
try {
mWindowManager.removeView(view);
return true;
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
/**
* 更新懸浮窗引數
* @param view
* @param params
* @return
*/
protected boolean updateView(View view, WindowManager.LayoutParams params) {
try {
mWindowManager.updateViewLayout(view, params);
return true;
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
}
懸浮窗view
/**
* 懸浮窗view
*/
public class FloatingView extends FrameLayout {
private Context mContext;
private View mView;
private ImageView mImageView;
private int mTouchStartX, mTouchStartY;//手指按下時座標
private WindowManager.LayoutParams mParams;
private FloatingManager mWindowManager;
public FloatingView(Context context) {
super(context);
mContext = context.getApplicationContext();
LayoutInflater mLayoutInflater = LayoutInflater.from(context);
mView = mLayoutInflater.inflate(R.layout.floating_view, null);
mImageView = (ImageView) mView.findViewById(R.id.imageview);
mImageView.setImageResource(R.drawable.img_loading);
mImageView.setOnTouchListener(mOnTouchListener);
mWindowManager = FloatingManager.getInstance(mContext);
}
public void show() {
mParams = new WindowManager.LayoutParams();
mParams.gravity = Gravity.TOP | Gravity.LEFT;
mParams.x = 0;
mParams.y = 100;
//總是出現在應用程式視窗之上
mParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;
//設定圖片格式,效果為背景透明
mParams.format = PixelFormat.RGBA_8888;
mParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL |
WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN | WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR |
WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH;
mParams.width = LayoutParams.WRAP_CONTENT;
mParams.height = LayoutParams.WRAP_CONTENT;
mWindowManager.addView(mView, mParams);
//逐幀動畫
AnimationDrawable animationDrawable=(AnimationDrawable)mImageView.getDrawable();
animationDrawable.start();
}
public void hide() {
mWindowManager.removeView(mView);
}
private OnTouchListener mOnTouchListener = new OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
mTouchStartX = (int) event.getRawX();
mTouchStartY = (int) event.getRawY();
break;
case MotionEvent.ACTION_MOVE:
mParams.x += (int) event.getRawX() - mTouchStartX;
mParams.y += (int) event.getRawY() - mTouchStartY;//相對於螢幕左上角的位置
mWindowManager.updateView(mView, mParams);
break;
case MotionEvent.ACTION_UP:
break;
}
return true;
}
};
}