教育行業(yè)A股IPO第一股(股票代碼 003032)

全國咨詢/投訴熱線:400-618-4000

Android培訓之WindowManager的使用(三)

更新時間:2016年07月13日17時04分 來源:Android培訓學院 瀏覽次數:

3桌面懸浮窗實現思路

3.1. 在桌面上顯示Window

如果我們在Activity中使用WindowManager添加Window,當Activity退出時,添加的Window也會被回收掉。所以要想在桌面上顯示懸浮窗,可以在Service中使用WindowManager添加Window,這樣只要服務不停止,就可以一直顯示。當服務啟動時,在其onCreate方法中,使用WindowManager的 addView方法添加一個系統(tǒng)Window,當服務銷毀時,可以在其 onDestroy中使用WindowManager的removeView 方法移除Window。大體是這樣的思路,代碼就不再給出了。

3.2.. 讓這個Window隨手指移動

要想讓這個Window能接收事件,需要給他設置相應的flags(只要不包含FLAG_NOT_TOUCHABLE即可),另外其type也不能是 TYPE_TOAST??梢允褂茫篢YPE_PRIORITY_PHONE,表示比來去電界面的Window級別還要高一些(來去電界面的Window是系統(tǒng)Window)。
mParams.type = WindowManager.LayoutParams. TYPE_PRIORITY_PHONE;
mParams.flags = WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
            | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
注意添加權限:
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
 然后給Window里的View設置onTouchListener,重寫onTouch方法:
private int mStartX;
private int mStartY;
@Override
public boolean onTouch(View v,MotionEvent event) {
    switch (event.getAction()) {
    case MotionEvent.ACTION_DOWN:
        // 記錄坐標起始點,getRawX,getRawY返回值為float,
        // 需轉化為int,變成像素數后再使用
        mStartX = (int) event.getRawX();
        mStartY = (int) event.getRawY();
        break;
    case MotionEvent.ACTION_MOVE:
        int newX = (int) event.getRawX();
        int newY = (int) event.getRawY();
        // 獲取手指移動的距離
        int dx = newX - mStartX;
        int dy = newY - mStartY;
        // 修改Window的x,y坐標
        mParams.x += dx;
        mParams.y += dy;
        // 修改Window的布局參數
        // 這里不能修改Window里的View的布局參數,因為View是在Window中顯示的,
        // 修改View的布局參數并不能移動外面的Window
        mWindowManager.updateViewLayout(mView,mParams);
        // 重新記錄新的坐標起始點
        mStartX = (int) event.getRawX();
        mStartY = (int) event.getRawY();
        break;
    default:
        break;
    }
    return true;
}
這樣就實現了Window隨著手指拖動而移動了。

本文版權歸傳智播客Android培訓學院所有,歡迎轉載,轉載請注明作者出處。謝謝!
作者:傳智播客Android培訓學院
首發(fā):http://xamj520.com/Android
0 分享到:
和我們在線交談!