1. 程式人生 > >Android 懸浮窗用法

Android 懸浮窗用法

宣告許可權

<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;
        }
    };
}