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

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

Android培訓(xùn)之WindowManager的使用(二)

更新時間:2016年07月26日10時38分 來源:傳智播客Android培訓(xùn)學(xué)院 瀏覽次數(shù):

2.3. 查看屏幕上的Window

我們再往屏幕上加一個PopupWindow和一個Dialog,當(dāng)前界面如下:



在Eclipse中,點擊菜單 Window - Open Perspective - Others,選擇 HierarchyView,打開,選擇Windows面板,可以看到當(dāng)前屏幕中所有的Window:



我們添加的Window在其中顯示的標(biāo)題為AddWindow,另外,我們可以看到還有別的幾個Window,比如 PopupWindow,MainActivity,加粗的那一個其實是MainActivity中彈出的Dialog,還能看到 StatusBar(狀態(tài)欄),RecentsPanel(最近應(yīng)用列表)等等,這也證明了我們前面說的,Android中所有的界面都是顯示在Window中的。

3桌面懸浮窗實現(xiàn)思路

3.1. 在桌面上顯示W(wǎng)indow

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

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

要想讓這個Window能接收事件,需要給他設(shè)置相應(yīng)的flags(只要不包含F(xiàn)LAG_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;
注意添加權(quán)限:
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
 然后給Window里的View設(shè)置onTouchListener,重寫onTouch方法:
private int mStartX;
private int mStartY;
@Override
public boolean onTouch(View v,MotionEvent event) {
    switch (event.getAction()) {
    case MotionEvent.ACTION_DOWN:
        // 記錄坐標(biāo)起始點,getRawX,getRawY返回值為float,
        // 需轉(zhuǎn)化為int,變成像素數(shù)后再使用
        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坐標(biāo)
        mParams.x += dx;
        mParams.y += dy;
        // 修改Window的布局參數(shù)
        // 這里不能修改Window里的View的布局參數(shù),因為View是在Window中顯示的,
        // 修改View的布局參數(shù)并不能移動外面的Window
        mWindowManager.updateViewLayout(mView,mParams);
        // 重新記錄新的坐標(biāo)起始點
        mStartX = (int) event.getRawX();
        mStartY = (int) event.getRawY();
        break;
    default:
        break;
    }
    return true;
}
這樣就實現(xiàn)了Window隨著手指拖動而移動了。


本文版權(quán)歸傳智播客Android培訓(xùn)學(xué)院所有,歡迎轉(zhuǎn)載,轉(zhuǎn)載請注明作者出處。謝謝!
作者:傳智播客Android培訓(xùn)學(xué)院
首發(fā):http://metathetuscanyresort.com/Android


0 分享到:
和我們在線交談!