Android中怎么實(shí)現(xiàn)一個(gè)可移動(dòng)的懸浮窗

這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)碛嘘P(guān)Android中怎么實(shí)現(xiàn)一個(gè)可移動(dòng)的懸浮窗,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),灌陽企業(yè)網(wǎng)站建設(shè),灌陽品牌網(wǎng)站建設(shè),網(wǎng)站定制,灌陽網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營(yíng)銷,網(wǎng)絡(luò)優(yōu)化,灌陽網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力。可充分滿足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長(zhǎng)自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。

首先我們先建一個(gè)windowmangerdemo的項(xiàng)目

在activity_main里面增加一個(gè)button的按鈕

Android中怎么實(shí)現(xiàn)一個(gè)可移動(dòng)的懸浮窗

然后在布局Layout里面增加window_small.xml和window_big.xml兩個(gè)布局文件,用于點(diǎn)擊小窗口后展開大窗口

window_small.xml

Android中怎么實(shí)現(xiàn)一個(gè)可移動(dòng)的懸浮窗

我們?cè)诰€性布局管理囂中直接加上一個(gè)相對(duì)布局管理囂.然后設(shè)上背景圖片即可


FloatWindowSmallView

我們的floatWindowSmallView繼承自LinearLayout

重寫onTouchEvent事件,我們用于可以隨時(shí)點(diǎn)擊移動(dòng)和展開我們的懸浮框

    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                // 手指按下時(shí)記錄必要數(shù)據(jù),縱坐標(biāo)的值都需要減去狀態(tài)欄高度
                xInView = event.getX();
                yInView = event.getY();
                xDownInScreen = event.getRawX();
                yDownInScreen = event.getRawY() - getStatusBarHeight();
                xInScreen = event.getRawX();
                yInScreen = event.getRawY() - getStatusBarHeight();
                break;
            case MotionEvent.ACTION_MOVE:
                xInScreen = event.getRawX();
                yInScreen = event.getRawY() - getStatusBarHeight();
                // 手指移動(dòng)的時(shí)候更新小懸浮窗的位置
                updateViewPosition();
                break;
            case MotionEvent.ACTION_UP:
                // 如果手指離開屏幕時(shí),xDownInScreen和xInScreen相等,且yDownInScreen和yInScreen相等,則視為觸發(fā)了單擊事件。
                if (xDownInScreen == xInScreen && yDownInScreen == yInScreen) {
                    openBigWindow();
                }
                break;
            default:
                break;
        }
        return true;
    }


window_big.xml

Android中怎么實(shí)現(xiàn)一個(gè)可移動(dòng)的懸浮窗

我們?cè)O(shè)了三個(gè)垂直的ImageButton,代表點(diǎn)擊小窗體后展開的大的窗體

Android中怎么實(shí)現(xiàn)一個(gè)可移動(dòng)的懸浮窗


FloatWindowBigView

代碼比較簡(jiǎn)單,直接寫對(duì)應(yīng)的事件即可

public class FloatWindowBigView extends LinearLayout {

    public static int viewWidth;
    public static int viewHeight;

    public FloatWindowBigView(final Context context) {
        super(context);

        LayoutInflater.from(context).inflate(R.layout.window_big, this);
        View view = findViewById(R.id.big_window_layout);
//        viewWidth = view.getLayoutParams().width;
//        viewHeight = view.getLayoutParams().height;
        viewWidth= 120;
        viewHeight = 370;
        ImageButton imgbig = (ImageButton) findViewById(R.id.imgbig);
        ImageButton imgcamera = findViewById(R.id.imgcamera);
        ImageButton imgvoice = findViewById(R.id.imgvoice);

        imgcamera.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(context, "點(diǎn)擊了照相機(jī)", Toast.LENGTH_SHORT).show();
            }
        });

        imgvoice.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(context, "點(diǎn)擊了語音識(shí)別", Toast.LENGTH_SHORT).show();
            }
        });

        imgbig.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                // 點(diǎn)擊返回的時(shí)候,移除大懸浮窗,創(chuàng)建小懸浮窗
                MyWindowManager.removeBigWindow(context);
                MyWindowManager.createSmallWindow(context);
            }
        });
    }
}


MyWindowManager

這個(gè)類是我們管理大小懸浮框的事件類,包括關(guān)閉小懸浮窗,展開大懸浮窗等

Android中怎么實(shí)現(xiàn)一個(gè)可移動(dòng)的懸浮窗

我們把大小懸浮穿的參數(shù)分別對(duì)應(yīng)不同的LayoutParams,都在這里處理


FloatWindow

做一個(gè)floatWindow繼承自Service

通過Handler和Time控件來刷新懸浮窗是否一直存在

/**
* 判斷當(dāng)前界面是否是掃碼界面
*/
private boolean isForeground(String[] classNames) {
   if (classNames.length <= 0) {
       return false;
   }

   ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
   //判斷當(dāng)前進(jìn)程
   List<ActivityManager.RunningAppProcessInfo> appProcesses = am
           .getRunningAppProcesses();
   for (ActivityManager.RunningAppProcessInfo appProcess : appProcesses) {
       if (appProcess.processName.equals(getPackageName())) {
           //判斷程序是否處于前臺(tái),如果是后臺(tái)則不顯示懸浮框
           if (appProcess.importance != ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
               Log.i(getPackageName(), "處于后臺(tái)"
                       + appProcess.processName);
               return false;
           }
       }
   }

   //判斷頂層Activity
   List<ActivityManager.RunningTaskInfo> list = am.getRunningTasks(1);
   if (list != null && list.size() > 0) {
       ComponentName cpn = list.get(0).topActivity;
       for (String className : classNames) {
           if (className.equals(cpn.getClassName())) {
               return true;
           }
       }
   }
   return false;
}
class RefreshTask extends TimerTask {

   @Override
   public void run() {
       // 當(dāng)前界面是要顯示的界面,且沒有懸浮窗顯示,則創(chuàng)建懸浮窗。
       if (isForeground(activityname) && !MyWindowManager.isWindowShowing()) {
           handler.post(new Runnable() {
               @Override
               public void run() {
                   MyWindowManager.createSmallWindow(getApplicationContext());
               }
           });
       }
       // 當(dāng)前界面要顯示的界面,且有懸浮窗顯示,則移除懸浮窗。
       else if (!isForeground(activityname) && MyWindowManager.isWindowShowing()) {
           handler.post(new Runnable() {
               @Override
               public void run() {
                   MyWindowManager.removeSmallWindow(getApplicationContext());
                   MyWindowManager.removeBigWindow(getApplicationContext());
               }
           });
       }
       // 當(dāng)前界面是要顯示的界面,且有懸浮窗顯示,則更新內(nèi)存數(shù)據(jù)。
       else if (isForeground(activityname) && MyWindowManager.isWindowShowing()) {
           handler.post(new Runnable() {
               @Override
               public void run() {
                   MyWindowManager.updateUsedPercent(getApplicationContext());
               }
           });
       }
   }

}

上述就是小編為大家分享的Android中怎么實(shí)現(xiàn)一個(gè)可移動(dòng)的懸浮窗了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

新聞名稱:Android中怎么實(shí)現(xiàn)一個(gè)可移動(dòng)的懸浮窗
當(dāng)前路徑:http://www.muchs.cn/article36/pidosg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供關(guān)鍵詞優(yōu)化、Google、網(wǎng)站營(yíng)銷、做網(wǎng)站網(wǎng)站收錄、網(wǎng)站排名

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站網(wǎng)頁設(shè)計(jì)