电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

Android浮動窗口實現原理及代碼實例

瀏覽:7日期:2022-09-23 09:12:38

1.浮動窗口的實現原理

看到上圖的那個小Android圖標了吧,它不會被其他組建遮擋,也可以響應用戶的點擊和拖動事件,它的顯示和消失由WindowManager直接管理,它就是Android浮動窗口。Android浮動窗口的實現主要是靠WindowManager這個類。通過WindowManager類的addView(),updateViewLayout(),removeView()這幾個方法,我們可以直接在Window中添加,更新,移除View。

2.浮動窗口實現的具體步驟

1)既然浮動窗口的實現依賴與WindowManager,那么毫無疑問,我們得先拿到WindowManger對象。考慮到浮動窗口通常在應用程序退出后依然顯示,所以我們需要在Service中實現浮動窗口的添加和更新,當然別忘了提供給用戶一個取消浮動窗口的功能。

2)定義你要顯示的View。可以在布局文件中定義,也可以自定義視圖。

3)設置必要的參數,其中有幾個比較重要的參數需要設置,具體請參考下面的代碼。

4)將View添加到Window中,接收并處理事件,更新View。

5)在Manifest中加入對應的權限。<uses-permission android:name='android.permission.SYSTEM_ALERT_WINDOW'/>

3.浮動窗口實現代碼

package com.spreadst.floatwindow; import android.app.Service; import android.content.Context; import android.content.Intent; import android.graphics.PixelFormat; import android.os.IBinder; import android.util.Log; import android.view.Gravity; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.WindowManager; public class FloatWindowService extends Service { private static final TAG = 'FloatWindowService'; private WindowManager mWindowManager; private WindowManager.LayoutParams mLayoutParams; private LayoutInflater mLayoutInflater; private View mFloatView; private int mCurrentX; private int mCurrentY; private static int mFloatViewWidth = 50; private static int mFloatViewHeight = 80; @Override public void onCreate() { // TODO Auto-generated method stub super.onCreate(); //初始化WindowManager對象和LayoutInflater對象 mWindowManager = (WindowManager) getApplicationContext().getSystemService(Context.WINDOW_SERVICE); mLayoutInflater = LayoutInflater.from(this); } @Override public void onStart(Intent intent, int startId) { // TODO Auto-generated method stub super.onStart(intent, startId); Log.i(TAG, 'onStart()'); createView(); } private void createView() { // TODO Auto-generated method stub //加載布局文件 mFloatView = mLayoutInflater.inflate(R.layout.main, null); //為View設置監聽,以便處理用戶的點擊和拖動 mFloatView.setOnTouchListener(new OnFloatViewTouchListener()); /*為View設置參數*/ mLayoutParams = new WindowManager.LayoutParams(); //設置View默認的擺放位置 mLayoutParams.gravity = Gravity.LEFT | Gravity.TOP; //設置window type mLayoutParams.type = WindowManager.LayoutParams.TYPE_PHONE; //設置背景為透明 mLayoutParams.format = PixelFormat.RGBA_8888; //注意該屬性的設置很重要,FLAG_NOT_FOCUSABLE使浮動窗口不獲取焦點,若不設置該屬性,屏幕的其它位置點擊無效,應為它們無法獲取焦點 mLayoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; //設置視圖的顯示位置,通過WindowManager更新視圖的位置其實就是改變(x,y)的值 mCurrentX = mLayoutParams.x = 50; mCurrentY = mLayoutParams.y = 50; //設置視圖的寬、高 mLayoutParams.width = 100; mLayoutParams.height = 100; //將視圖添加到Window中 mWindowManager.addView(mFloatView, mLayoutParams); } /*由于直接startService(),因此該方法沒用*/ @Override public IBinder onBind(Intent intent) { // TODO Auto-generated method stub return null; } /*該方法用來更新視圖的位置,其實就是改變(LayoutParams.x,LayoutParams.y)的值*/ private void updateFloatView() { mLayoutParams.x = mCurrentX; mLayoutParams.y = mCurrentY; mWindowManager.updateViewLayout(mFloatView, mLayoutParams); } /*處理視圖的拖動,這里只對Move事件做了處理,用戶也可以對點擊事件做處理,例如:點擊浮動窗口時,啟動應用的主Activity*/ private class OnFloatViewTouchListener implements View.OnTouchListener { @Override public boolean onTouch(View v, MotionEvent event) { // TODO Auto-generated method stub Log.i(TAG, 'mCurrentX: ' + mCurrentX + ',mCurrentY: ' + mCurrentY + ',mFloatViewWidth: ' + mFloatViewWidth + ',mFloatViewHeight: ' + mFloatViewHeight); /* * getRawX(),getRawY()這兩個方法很重要。通常情況下,我們使用的是getX(),getY()來獲得事件的觸發點坐標, * 但getX(),getY()獲得的是事件觸發點相對與視圖左上角的坐標;而getRawX(),getRawY()獲得的是事件觸發點 * 相對與屏幕左上角的坐標。由于LayoutParams中的x,y是相對與屏幕的,所以需要使用getRawX(),getRawY()。 */ mCurrentX = (int) event.getRawX() - mFloatViewWidth; mCurrentY = (int) event.getRawY() - mFloatViewHeight; int action = event.getAction(); switch (action) { case MotionEvent.ACTION_DOWN:break; case MotionEvent.ACTION_MOVE:updateFloatView();break; case MotionEvent.ACTION_UP:break; } return true; } } }

4.如何只在Launcher界面顯示浮動窗口

大家應該都熟悉360安全衛士的浮動窗口,它的浮動窗口只會在Launcher界面顯示,當用戶切到其它界面,浮動窗口自動被移除了。

要實現該功能,我們就必須知道當前所在的界面,如果只去監聽Activity的category,那么我們只能知道什么時候進入Launcher界面了,卻無法知道是否離開了Launcher界面。那么360是如何實現該功能呢?大家可以反編譯一下它的代碼。這里提供一種可行的方法,我們的目前其實很簡單,就是要知道當前的Activity是否是Launcher界面的Activity。由于Activity是以堆棧的形式被管理的,因此,只要我們查看棧頂的Activity是否是Launcher的Activity即可。要獲取Activity的Task信息,需要在Manifest中添加對應權限,<uses-permission android:name = “android.permission.GET_TASKS”/>。

private String getTopActivity(Context context) { //獲取ActivityManager對象 ActivityManager manager = (ActivityManager)getSystemService(ACTIVITY_SERVICE) ; /* * 拿到當前正在運行的Task列表,該列表按照最近使用的時間順序排列,其中的參數表示需要返回的最大列表項數目。 * 這里我們只需要拿到處于onResume狀態的Activity所在的Task。 */ List<RunningTaskInfo> runningTaskInfos = manager.getRunningTasks(1) ; if(runningTaskInfos != null) { //拿到該task中的棧頂Activity return (runningTaskInfos.get(0).topActivity).toString() ; } else { return null; } }

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: Android
相關文章:
主站蜘蛛池模板: 东风体检车厂家_公共卫生体检车_医院体检车_移动体检车-锦沅科贸 | 设定时间记录电子秤-自动累计储存电子秤-昆山巨天仪器设备有限公司 | 鄂泉泵业官网|(杭州、上海、全国畅销)大流量防汛排涝泵-LW立式排污泵 | 泰国专线_泰国物流专线_广州到泰国物流公司-泰廊曼国际 | 药品冷藏箱厂家_低温冰箱_洁净工作台-济南欧莱博电子商务有限公司官网 | 超细粉碎机|超微气流磨|气流分级机|粉体改性设备|超微粉碎设备-山东埃尔派粉碎机厂家 | 盘煤仪,盘料仪,盘点仪,堆料测量仪,便携式激光盘煤仪-中科航宇(北京)自动化工程技术有限公司 | 福州仿石漆加盟_福建仿石漆厂家-外墙仿石漆加盟推荐铁壁金钢(福建)新材料科技有限公司有保障 | 首页-瓜尔胶系列-化工单体系列-油田压裂助剂-瓜尔胶厂家-山东广浦生物科技有限公司 | SEO网站优化,关键词排名优化,苏州网站推广-江苏森歌网络 | 上海盐水喷雾试验机_两厢式冷热冲击试验箱-巨怡环试 | 合肥通道闸-安徽车牌识别-人脸识别系统厂家-安徽熵控智能技术有限公司 | 活性氧化铝|无烟煤滤料|活性氧化铝厂家|锰砂滤料厂家-河南新泰净水材料有限公司 | 北京签证代办_签证办理_商务签证_旅游签证_寰球签证网 | 重庆小面培训_重庆小面技术培训学习班哪家好【终身免费复学】 | 德国EA可编程直流电源_电子负载,中国台湾固纬直流电源_交流电源-苏州展文电子科技有限公司 | 背压阀|减压器|不锈钢减压器|减压阀|卫生级背压阀|单向阀|背压阀厂家-上海沃原自控阀门有限公司 本安接线盒-本安电路用接线盒-本安分线盒-矿用电话接线盒-JHH生产厂家-宁波龙亿电子科技有限公司 | 金属检测机_金属分离器_检针验针机_食品药品金属检探测仪器-广东善安科技 | SMC-ASCO-CKD气缸-FESTO-MAC电磁阀-上海天筹自动化设备官网 | 吹塑加工_大型吹塑加工_滚塑代加工-莱力奇吹塑加工有限公司 | 建大仁科-温湿度变送器|温湿度传感器|温湿度记录仪_厂家_价格-山东仁科 | 波纹补偿器_不锈钢波纹补偿器_巩义市润达管道设备制造有限公司 | 代写标书-专业代做标书-商业计划书代写「深圳卓越创兴公司」 | 小威小说网 - 新小威小说网 - 小威小说网小说搜索引擎 | Eiafans.com_环评爱好者 环评网|环评论坛|环评报告公示网|竣工环保验收公示网|环保验收报告公示网|环保自主验收公示|环评公示网|环保公示网|注册环评工程师|环境影响评价|环评师|规划环评|环评报告|环评考试网|环评论坛 - Powered by Discuz! | 医院专用门厂家报价-医用病房门尺寸大全-抗菌木门品牌推荐 | 洗砂机械-球磨制砂机-洗沙制砂机械设备_青州冠诚重工机械有限公司 | 钛合金标准件-钛合金螺丝-钛管件-钛合金棒-钛合金板-钛合金锻件-宝鸡远航钛业有限公司 | 紫外线老化试验箱_uv紫外线老化试验箱价格|型号|厂家-正航仪器设备 | 高压无油空压机_无油水润滑空压机_水润滑无油螺杆空压机_无油空压机厂家-科普柯超滤(广东)节能科技有限公司 | 生物风-销售载体,基因,质粒,ATCC细胞,ATCC菌株等,欢迎购买-百风生物 | 机房监控|动环监控|动力环境监控系统方案产品定制厂家 - 迈世OMARA | 防爆电机-高压防爆电机-ybx4电动机厂家-河南省南洋防爆电机有限公司 | 首页_欧瑞传动官方网站--主营变频器、伺服系统、新能源、软起动器、PLC、HMI | 3A别墅漆/3A环保漆_广东美涂士建材股份有限公司【官网】 | 座椅式升降机_无障碍升降平台_残疾人升降平台-南京明顺机械设备有限公司 | 绿萝净除甲醛|深圳除甲醛公司|测甲醛怎么收费|培训机构|电影院|办公室|车内|室内除甲醛案例|原理|方法|价格立马咨询 | 原子吸收设备-国产分光光度计-光谱分光光度计-上海光谱仪器有限公司 | 巨野月嫂-家政公司-巨野县红墙安康母婴护理中心 | 自恢复保险丝_贴片保险丝_力特保险丝_Littelfuse_可恢复保险丝供应商-秦晋电子 | 照相馆预约系统,微信公众号摄影门店系统,影楼管理软件-盟百网络 |