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

您的位置:首頁技術(shù)文章
文章詳情頁

Android仿優(yōu)酷視頻的懸浮窗播放效果

瀏覽:109日期:2022-06-06 16:13:51

之前接了需求要讓視頻播放時可以像優(yōu)酷視頻那樣在懸浮窗里播放,并且懸浮窗和主播放頁面之間要實(shí)現(xiàn)無縫切換,項(xiàng)目中使用的是自封裝的ijkplayer這個要求就代表不能在懸浮窗中新建視頻控件,所以需要在懸浮窗中復(fù)用主頁面的視頻控件,以達(dá)到無縫銜接的效果。

主頁面對應(yīng)的視頻控件的父view

<FrameLayout android: android:layout_width='match_parent' android:layout_height='match_parent' android:layout_centerInParent='true'/>

用FrameLayout作為添加視頻控件的ParentView,通過addview方法將新建的播放器控件添加到父控件內(nèi)部

vw_live = new IjkVideoView(this);

video_frame = findViewById(R.id.vw_live);video_frame.addView(vw_live);

主播放界面的啟動模式

播放主界面的activity的啟動模式不能為默認(rèn),因?yàn)槲覀円WC播放主界面在顯示懸浮窗的時候退到后臺,但是整個的應(yīng)用不能退到后臺,所以activity的啟動模式改為singleInstance

android:launchMode='singleInstance'

退到后臺我們通過moveTaskToBack(true)方法;

moveTaskToBack(true);

可以讓播放界面退到后臺而整個應(yīng)用不會退回后臺

權(quán)限請求

要使用懸浮窗需要申請權(quán)限

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

if (!Settings.canDrawOverlays(this)) { Toast.makeText(this, '當(dāng)前無權(quán)限,請授權(quán)', Toast.LENGTH_SHORT); startActivityForResult(new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse('package:' + getPackageName())), 2); }

懸浮窗

@SuppressLint('ClickableViewAccessibility') public void showFloatingWindowView(IjkVideoView view) { // 懸浮窗顯示視圖 LayoutInflater layoutInflater = LayoutInflater.from(activity); mShowView = layoutInflater.inflate(R.layout.video_floating_window_layout, null);; // 獲取系統(tǒng)窗口管理服務(wù) mWindowManager = (WindowManager) activity.getSystemService(Context.WINDOW_SERVICE); // 懸浮窗口參數(shù)設(shè)置及返回 mFloatParams = getParams(); //floatingWindow內(nèi)部控件實(shí)例 init(view); // 設(shè)置窗口觸摸移動事件 mShowView.setOnTouchListener(new FloatViewMoveListener()); // 懸浮窗生成 mWindowManager.addView(mShowView, mFloatParams); } private void init(IjkVideoView viewGroup){ videoLayout = mShowView.findViewById(R.id.floating_video); videoLayout.removeAllViews(); if (viewGroup != null){ ijkVideoView = viewGroup; videoLayout.addView(ijkVideoView,new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT ,ViewGroup.LayoutParams.MATCH_PARENT)); } mBtnCloseFloatingWindow = mShowView.findViewById(R.id.close_floating_view); mBtnCloseFloatingWindow.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { } }); mBtnBackFloatingWindow = (ImageView)mShowView.findViewById(R.id.back_floating_view); mBtnBackFloatingWindow.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { } }); } private WindowManager.LayoutParams getParams() { WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams(); //設(shè)置懸浮窗口類型 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { layoutParams.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY; } else { layoutParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT; } //設(shè)置懸浮窗口屬性 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; //設(shè)置懸浮窗口透明 layoutParams.format = PixelFormat.TRANSLUCENT; //設(shè)置懸浮窗口長寬數(shù)據(jù) layoutParams.width = 500; layoutParams.height = 340; //設(shè)置懸浮窗顯示位置 layoutParams.gravity = Gravity.START | Gravity.TOP; layoutParams.x = 100; layoutParams.y = 100; return layoutParams; }

懸浮窗的xml,可通過自定義獲得自己想要的效果

<FrameLayout xmlns:android='http://schemas.android.com/apk/res/android' android: android:layout_width='match_parent' android:layout_height='match_parent'> <FrameLayout android: android:layout_width='match_parent' android:layout_height='match_parent'/> <ImageView android: android:layout_width='50dp' android:layout_height='50dp' android:layout_gravity='end' android:padding='10dp' android:src='http://www.hdgsjgj.cn/bcjs/@android:drawable/ic_menu_close_clear_cancel' /> <ImageView android: android:layout_width='50dp' android:layout_height='50dp' android:padding='10dp' android:src='http://www.hdgsjgj.cn/bcjs/@android:drawable/ic_menu_revert' /></FrameLayout>

懸浮窗的滑動,我們可以通過自定義點(diǎn)擊監(jiān)聽實(shí)現(xiàn)

/** * 浮窗移動/點(diǎn)擊監(jiān)聽 */ private class FloatViewMoveListener implements View.OnTouchListener { //開始觸控的坐標(biāo),移動時的坐標(biāo)(相對于屏幕左上角的坐標(biāo)) private int mTouchStartX; private int mTouchStartY; //開始時的坐標(biāo)和結(jié)束時的坐標(biāo)(相對于自身控件的坐標(biāo)) private int mStartX, mStartY; //判斷懸浮窗口是否移動,這里做個標(biāo)記,防止移動后松手觸發(fā)了點(diǎn)擊事件 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; } //如果是移動事件不觸發(fā)OnClick事件,防止移動的時候一放手形成點(diǎn)擊事件 return isMove; } }

懸浮窗的消失,在這里調(diào)用videoLayout.removeAllViews()是為了將復(fù)用的視頻控件的父View清空,返回主播放activity的時候調(diào)用addview方法不會再報 child view has Parent,you have to call removeView()的錯

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

啟動懸浮窗

public videoFloatingWindow(Context context){ super(context); this.activity = context; }

對于懸浮窗的調(diào)用

用hasBind來記錄是否調(diào)用了懸浮窗

private void startFloatingWindow(){ if (!Settings.canDrawOverlays(this)) { Toast.makeText(this, '當(dāng)前無權(quán)限,請授權(quán)', Toast.LENGTH_SHORT); startActivityForResult(new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse('package:' + getPackageName())), 2); } else { video_frame.removeView(vw_live); videoFloatingWindow.getInstance(this).showFloatingWindowView(vw_live); hasBind = true; moveTaskToBack(true); } }

注意

一.由于主界面activity使用了singleInstance啟動模式,所以從懸浮窗返回主界面activity時,要添加flag

Intent intent = new Intent(activity, activity.getClass());intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);activity.startActivity(intent);

二.當(dāng)主界面的activity退回后臺,再重新進(jìn)入主界面的時候,注意,不再調(diào)用onCreate方法,而是調(diào)用onNewIntent,所以重寫onNewIntent方法,重新進(jìn)入主界面,懸浮窗消失

@Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); Log.d('RemoteView', '重新顯示了'); //不顯示懸浮框 if (hasBind){ videoFloatingWindow.getInstance(this).dismiss(); video_frame.removeAllViews(); if (vw_live != null){video_frame.addView(vw_live); } hasBind = false; } }

總結(jié)

到此這篇關(guān)于Android仿優(yōu)酷視頻的懸浮窗播放的文章就介紹到這了,更多相關(guān)android 優(yōu)酷視頻懸浮窗播放內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: 優(yōu)酷
相關(guān)文章:
主站蜘蛛池模板: 牛奶检测仪-乳成分分析仪-北京海谊 | 翅片管换热器「型号全」_厂家-淄博鑫科环保 | 宿松新闻网 宿松网|宿松在线|宿松门户|安徽宿松(直管县)|宿松新闻综合网站|宿松官方新闻发布 | 电池挤压试验机-自行车喷淋-车辆碾压试验装置-深圳德迈盛测控设备有限公司 | 加气混凝土砌块设备,轻质砖设备,蒸养砖设备,新型墙体设备-河南省杜甫机械制造有限公司 | 长沙广告公司|长沙广告制作设计|长沙led灯箱招牌制作找望城湖南锦蓝广告装饰工程有限公司 | 郑州墨香品牌设计公司|品牌全案VI设计公司 | 广州办公室设计,办公室装修,写字楼设计,办公室装修公司_德科 | 汽车整车综合环境舱_军标砂尘_盐雾试验室试验箱-无锡苏南试验设备有限公司 | TPU薄膜_TPU薄膜生产厂家_TPU热熔胶膜厂家定制_鑫亘环保科技(深圳)有限公司 | 冰雕-冰雪世界-大型冰雕展制作公司-赛北冰雕官网 | 船用泵,船用离心泵,船用喷射泵,泰州隆华船舶设备有限公司 | 智慧农业|农业物联网|现代农业物联网-托普云农物联网官方网站 | MVE振动电机_MVE震动电机_MVE卧式振打电机-河南新乡德诚生产厂家 | 嘉兴恒升声级计-湖南衡仪声级计-杭州爱华多功能声级计-上海邦沃仪器设备有限公司 | 纸张环压仪-纸张平滑度仪-杭州纸邦自动化技术有限公司 | 液压升降货梯_导轨式升降货梯厂家_升降货梯厂家-河南东圣升降设备有限公司 | 上海璟文空运首页_一级航空货运代理公司_机场快递当日达 | 中山市派格家具有限公司【官网】| 气动机械手-搬运机械手-气动助力机械手-山东精瑞自动化设备有限公司 | 美侍宠物-专注宠物狗及宠物猫训练|喂养|医疗|繁育|品种|价格 | 塑胶跑道_学校塑胶跑道_塑胶球场_运动场材料厂家_中国塑胶跑道十大生产厂家_混合型塑胶跑道_透气型塑胶跑道-广东绿晨体育设施有限公司 | 柴油机_柴油发电机_厂家_品牌-江苏卡得城仕发动机有限公司 | 西宁装修_西宁装修公司-西宁业之峰装饰-青海业之峰墅级装饰设计公司【官网】 | 玻璃钢型材-玻璃钢风管-玻璃钢管道,生产厂家-[江苏欧升玻璃钢制造有限公司] | 风淋室生产厂家报价_传递窗|送风口|臭氧机|FFU-山东盛之源净化设备 | 网站建设-临朐爱采购-抖音运营-山东兆通网络科技 | 品牌设计_VI设计_电影海报设计_包装设计_LOGO设计-Bacross新越品牌顾问 | 通辽信息港 - 免费发布房产、招聘、求职、二手、商铺等信息 www.tlxxg.net | 数码听觉统合训练系统-儿童感觉-早期言语评估与训练系统-北京鑫泰盛世科技发展有限公司 | 红立方品牌应急包/急救包加盟,小成本好项目代理_应急/消防/户外用品加盟_应急好项目加盟_新奇特项目招商 - 中红方宁(北京) 供应链有限公司 | 长沙一级消防工程公司_智能化弱电_机电安装_亮化工程专业施工承包_湖南公共安全工程有限公司 | 小型气象站_便携式自动气象站_校园气象站-竞道气象设备网 | 众品家具网-家具品牌招商_家具代理加盟_家具门户的首选网络媒体。 | 塑料熔指仪-塑料熔融指数仪-熔体流动速率试验机-广东宏拓仪器科技有限公司 | SMN-1/SMN-A ABB抽屉开关柜触头夹紧力检测仪-SMN-B/SMN-C-上海徐吉 | 济南冷库安装-山东冷库设计|建造|冷库维修-山东齐雪制冷设备有限公司 | 电机保护器-电动机综合保护器-上海硕吉电器有限公司 | 真空包装机-诸城市坤泰食品机械有限公司 | 猎头招聘_深圳猎头公司_知名猎头公司| 润东方环保空调,冷风机,厂房车间降温设备-20年深圳环保空调生产厂家 |