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

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

Android視頻懸浮窗口實現的示例代碼

瀏覽:3日期:2022-09-24 18:06:58

前言

本文例子實現了點擊顯示懸浮窗口,同時窗口可播放視頻,拖動位置,點擊關閉及返回 APP 頁面,通過例子來講述懸浮窗口實現原理及細節處理,效果圖如下所示:

Android視頻懸浮窗口實現的示例代碼

懸浮窗口.gif

原理

WindowManager 對 View 視圖進行添加、移除、更新處理;

WindowManager.LayoutParams 對窗口參數進行一系列設置。

實現

首先,需要添加相對應懸浮窗權限:

<uses-permission android:name='android.permission.SYSTEM_ALERT_WINDOW' />

在 Activity 頁面中,需要判斷懸浮窗權限是否獲取,如果未曾獲取,需要跳轉系統頁,進行對應的授權操作:

public boolean requestOverlayPermission() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (!Settings.canDrawOverlays(this)) { Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse('package:' + getPackageName())); startActivityForResult(intent, REQUEST_OVERLAY_CODE); return true; } else { return false; } } return false;}

獲取權限后,我們可以首先初始化我們要顯示的視圖,并且設置相對應的事件,這里我們采用了 VideoView 進行簡單的視頻播放,并且設置懸浮窗關閉及返回前臺的操作:

private View initFloatView() { View view = View.inflate(this, R.layout.view_floating_window, null); // 設置視頻封面 final ImageView mThumb = (ImageView) view.findViewById(R.id.thumb_floating_view); Glide.with(this).load(R.drawable.thumb).into(mThumb); // 懸浮窗關閉 view.findViewById(R.id.close_floating_view).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mFloatingWindow.dismiss(); } }); // 返回前臺頁面 view.findViewById(R.id.back_floating_view).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mFloatingWindow.setTopApp(FloatingWindowActivity.this); } }); final VideoView videoView = view.findViewById(R.id.video_view); //視頻內容設置 videoView.setVideoPath('https://stream7.iqilu.com/10339/article/202002/18/2fca1c77730e54c7b500573c2437003f.mp4'); // 視頻準備完畢,隱藏正在加載封面,顯示視頻 videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { @Override public void onPrepared(MediaPlayer mp) { mThumb.setVisibility(View.GONE); } }); // 循環播放 videoView.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { @Override public void onCompletion(MediaPlayer mp) { videoView.start(); } }); // 開始播放視頻 videoView.start(); return view;}

通過獲取窗口管理 WindowManager ,設置懸浮窗口參數 WindowManager.LayoutParams 后,就可以通過 WindowManager 的 addView 方法,生成對應視圖的懸浮窗口:

public void showFloatingWindowView(Context context, View view) { // 懸浮窗顯示視圖 mShowView = view; // 獲取系統窗口管理服務 mWindowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); // 懸浮窗口參數設置及返回 mFloatParams = getParams(); // 設置窗口觸摸移動事件 mShowView.setOnTouchListener(new FloatViewMoveListener()); // 懸浮窗生成 mWindowManager.addView(mShowView, mFloatParams);}

WindowManager.LayoutParams 參數設置,主要設置懸浮窗口類型為 WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY :

private WindowManager.LayoutParams getParams() { WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams(); //設置懸浮窗口類型 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { layoutParams.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY; } else { layoutParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT; } //設置懸浮窗口屬性 layoutParams.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; //設置懸浮窗口透明 layoutParams.format = PixelFormat.TRANSLUCENT; //設置懸浮窗口長寬數據 layoutParams.width = 600; layoutParams.height = 340; //設置懸浮窗顯示位置 layoutParams.gravity = Gravity.START | Gravity.TOP; layoutParams.x = 100; layoutParams.y = 100; return layoutParams;}

窗口觸摸移動事件,主要通過獲取觸摸位置,通過 WindowManager 的 updateViewLayout 方法設置懸浮窗口的參數,進行窗口視圖位置更新:

private class FloatViewMoveListener implements View.OnTouchListener { //開始觸控的坐標,移動時的坐標(相對于屏幕左上角的坐標) private int mTouchStartX; private int mTouchStartY; //開始時的坐標和結束時的坐標(相對于自身控件的坐標) private int mStartX, mStartY; //判斷懸浮窗口是否移動,這里做個標記,防止移動后松手觸發了點擊事件 private boolean isMove; @Override public boolean onTouch(View view, MotionEvent motionEvent) { int action = motionEvent.getAction(); int x = (int) motionEvent.getX(); int y = (int) motionEvent.getY(); switch (action) { case MotionEvent.ACTION_DOWN:isMove = false;mTouchStartX = (int) motionEvent.getRawX();mTouchStartY = (int) motionEvent.getRawY();mStartX = x;mStartY = y;break; case MotionEvent.ACTION_MOVE:int mTouchCurrentX = (int) motionEvent.getRawX();int mTouchCurrentY = (int) motionEvent.getRawY();mFloatParams.x += mTouchCurrentX - mTouchStartX;mFloatParams.y += mTouchCurrentY - mTouchStartY;mWindowManager.updateViewLayout(mShowView, mFloatParams);mTouchStartX = mTouchCurrentX;mTouchStartY = mTouchCurrentY;float deltaX = x - mStartX;float deltaY = y - mStartY;if (Math.abs(deltaX) >= 5 || Math.abs(deltaY) >= 5) { isMove = true;}break; case MotionEvent.ACTION_UP:break; default:break; } //如果是移動事件不觸發OnClick事件,防止移動的時候一放手形成點擊事件 return isMove; }}

關閉懸浮窗,調用 WindowManager 的 removeView 方法即可:

public void dismiss() { if (mWindowManager != null && mShowView != null) { mWindowManager.removeView(mShowView); }}

懸浮窗點擊返回前臺方法:

public void setTopApp(Context context) { //獲取ActivityManager ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); //獲得當前運行的task(任務) List<ActivityManager.RunningTaskInfo> taskInfoList = null; if (activityManager != null) { taskInfoList = activityManager.getRunningTasks(100); } if (taskInfoList != null) { for (ActivityManager.RunningTaskInfo taskInfo : taskInfoList) { //找到本應用的 task,并將它切換到前臺 if (taskInfo.topActivity != null && taskInfo.topActivity.getPackageName().equals(context.getPackageName())) {activityManager.moveTaskToFront(taskInfo.id, 0);break; } } }}

關于懸浮窗的一些基本操作到這里就基本結束了,具體的布局內容及操作,歡迎查看具體的源碼實現: Github開發記錄

到此這篇關于Android視頻懸浮窗口實現的示例代碼的文章就介紹到這了,更多相關Android視頻懸浮窗口 內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Android
相關文章:
主站蜘蛛池模板: 泉州陶瓷pc砖_园林景观砖厂家_石英砖地铺石价格 _福建暴风石英砖 | 地源热泵一体机,地源热泵厂家-淄博汇能环保设备有限公司 | 康明斯发电机,上柴柴油发电机,玉柴柴油发电机组_海南重康电力官网 | 破碎机_上海破碎机_破碎机设备_破碎机厂家-上海山卓重工机械有限公司 | 防爆暖风机_防爆电暖器_防爆电暖风机_防爆电热油汀_南阳市中通智能科技集团有限公司 | 橡胶膜片,夹布膜片,橡胶隔膜密封,泵阀设备密封膜片-衡水汉丰橡塑科技公司网站 | 旋振筛_不锈钢旋振筛_气旋筛_旋振筛厂家—新乡市大汉振动机械有限公司 | 昆山新莱洁净应用材料股份有限公司-卫生级蝶阀,无菌取样阀,不锈钢隔膜阀,换向阀,离心泵 | 东莞压铸厂_精密压铸_锌合金压铸_铝合金压铸_压铸件加工_东莞祥宇金属制品 | 钢结构-钢结构厂房-钢结构工程[江苏海逵钢构厂] | 烟雾净化器-滤筒除尘器-防爆除尘器-除尘器厂家-东莞执信环保科技有限公司 | 啤酒设备-小型啤酒设备-啤酒厂设备-济南中酿机械设备有限公司 | 小程序开发公司-小程序制作-微信小程序开发-小程序定制-咏熠软件 | 短信群发平台_群发短信软件_短信营销-讯鸽科技 | 石牌坊价格石牌坊雕刻制作_石雕牌坊牌楼石栏杆厂家_山东嘉祥石雕有限公司 | 北钻固控设备|石油钻采设备-石油固控设备厂家 | 红外光谱仪维修_二手红外光谱仪_红外压片机_红外附件-天津博精仪器 | 长信科技产业园官网_西安厂房_陕西标准工业厂房 | 磁棒电感生产厂家-电感器厂家-电感定制-贴片功率电感供应商-棒形电感生产厂家-苏州谷景电子有限公司 | 微信聊天记录恢复_手机短信删除怎么恢复_通讯录恢复软件下载-快易数据恢复 | 数控车床-立式加工中心-多功能机床-小型车床-山东临沂金星机床有限公司 | PO膜_灌浆膜及地膜供应厂家 - 青州市鲁谊塑料厂 | 上海地磅秤|电子地上衡|防爆地磅_上海地磅秤厂家–越衡称重 | 扒渣机厂家_扒渣机价格_矿用扒渣机_铣挖机_撬毛台车_襄阳永力通扒渣机公司 | 深圳品牌设计公司-LOGO设计公司-VI设计公司-未壳创意 | YAGEO国巨电容|贴片电阻|电容价格|三星代理商-深圳市巨优电子有限公司 | 盐水蒸发器,水洗盐设备,冷凝结晶切片机,转鼓切片机,絮凝剂加药系统-无锡瑞司恩机械有限公司 | 液压扳手-高品质液压扳手供应商 - 液压扳手, 液压扳手供应商, 德国进口液压拉马 | 818手游网_提供当下热门APP手游_最新手机游戏下载 | 杭州画室_十大画室_白墙画室_杭州美术培训_国美附中培训_附中考前培训_升学率高的画室_美术中考集训美术高考集训基地 | 上海软件开发-上海软件公司-软件外包-企业软件定制开发公司-咏熠科技 | 微型实验室真空泵-无油干式真空泵-微型涡旋耐腐蚀压缩机-思科涡旋科技(杭州)有限公司 | 加气混凝土砌块设备,轻质砖设备,蒸养砖设备,新型墙体设备-河南省杜甫机械制造有限公司 | 皮带机_移动皮带机_大倾角皮带机_皮带机厂家 - 新乡市国盛机械设备有限公司 | 浙江筋膜枪-按摩仪厂家-制造商-肩颈按摩仪哪家好-温州市合喜电子科技有限公司 | 立式壁挂广告机厂家-红外电容触摸一体机价格-华邦瀛 | 拉卡拉POS机官网 - 官方直营POS机办理|在线免费领取 | TPU薄膜_TPU薄膜生产厂家_TPU热熔胶膜厂家定制_鑫亘环保科技(深圳)有限公司 | 北京银联移动POS机办理_收银POS机_智能pos机_刷卡机_收银系统_个人POS机-谷骐科技【官网】 | 国产频谱分析仪-国产网络分析仪-上海坚融实业有限公司 | LNG鹤管_内浮盘价格,上装鹤管,装车撬厂家-连云港赛威特机械 |