日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

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

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

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

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

主頁面對應(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的啟動模式不能為默認,因為我們要保證播放主界面在顯示懸浮窗的時候退到后臺,但是整個的應(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, '當前無權(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)部控件實例 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://m.b3g6.com/bcjs/@android:drawable/ic_menu_close_clear_cancel' /> <ImageView android: android:layout_width='50dp' android:layout_height='50dp' android:padding='10dp' android:src='http://m.b3g6.com/bcjs/@android:drawable/ic_menu_revert' /></FrameLayout>

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

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

懸浮窗的消失,在這里調(diào)用videoLayout.removeAllViews()是為了將復用的視頻控件的父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, '當前無權(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);

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

@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)!

標簽: 優(yōu)酷
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
中文在线а√天堂| 91精品一区国产高清在线gif| 国产精品久久久久蜜臀| 久久av日韩| 欧美一区二区三区久久精品| 日本国产一区| 欧美影院精品| 欧美亚洲一级| 国产欧美二区| 欧美韩一区二区| 精品国产18久久久久久二百| 丰满少妇一区| 日韩在线高清| 久久精品国内一区二区三区水蜜桃| 日韩免费小视频| 日本久久成人网| 亚洲高清不卡| 久久亚洲成人| 黄色不卡一区| 久久亚洲影院| 日韩高清中文字幕一区| 国产日韩欧美一区在线| 国产激情综合| 成人福利视频| 婷婷中文字幕一区| 最新国产精品视频| 国产欧美一区二区精品久久久 | 国产一区二区精品久| 麻豆成人在线观看| 日韩中文在线电影| 亚洲欧洲另类| 日本少妇一区二区| 成人国产精选| 99香蕉国产精品偷在线观看 | 亚洲资源av| 日韩av字幕| 国产一区一一区高清不卡| 欧美日韩精品在线一区| 深夜日韩欧美| 精品视频在线观看网站| 亚洲伦乱视频| 蜜臀av性久久久久蜜臀aⅴ流畅| 欧美一级久久| 91精品国产91久久久久久黑人| 久久国产精品毛片| 国产精品高清一区二区| 99精品综合| 日韩精品视频中文字幕| 色婷婷亚洲mv天堂mv在影片| 亚洲激情黄色| 日韩二区三区四区| 黑森林国产精品av| 亚洲九九精品| 蜜桃av在线播放| 亚洲tv在线| 中文字幕高清在线播放| 亚洲精品影视| 亚洲啊v在线| 亚洲理论在线| 婷婷激情一区| 欧美日本一区| 欧美91精品| 老鸭窝一区二区久久精品| 亚洲一区二区网站| 国产成人免费精品| 日韩高清成人在线| 精品在线91| 精品黄色一级片| 免费美女久久99| 国产+成+人+亚洲欧洲在线| 石原莉奈在线亚洲二区| 日本一区二区高清不卡| 婷婷亚洲成人| 久久中文亚洲字幕| 国产精品.xx视频.xxtv| 丝袜美腿高跟呻吟高潮一区| 91视频精品| 久久精品99国产精品| 欧美精选一区二区三区| 精品三级av| 日本在线观看不卡视频| 欧美/亚洲一区| 97精品视频在线看| 国产欧美一区二区三区米奇| 老司机精品久久| 不卡一二三区| 欧美黑人做爰爽爽爽| 亚洲一二av| 亚洲大全视频| 中文字幕一区久| 麻豆久久一区二区| 青青草精品视频| 欧美中文日韩| 国产99精品一区| 98精品视频| 麻豆视频观看网址久久| 日韩欧美久久| 水野朝阳av一区二区三区| 国产精品av一区二区| 国产aⅴ精品一区二区三区久久| 亚洲人成高清| 美女精品在线| 亚洲大全视频| 久久免费国产| 欧美激情另类| 精品视频一区二区三区在线观看| 日本不卡一区二区三区| 亚洲欧美日韩国产| 婷婷综合社区| 国产精品7m凸凹视频分类| 亚洲成av人片一区二区密柚| 欧美日韩国产v| 丝袜诱惑一区二区| 在线观看精品| 五月激情久久| 在线天堂中文资源最新版| 精品午夜视频| 韩国女主播一区二区三区| 久久不见久久见中文字幕免费 | 香蕉久久夜色精品国产| 99视频一区| 红桃视频亚洲| 伊人久久大香线蕉av超碰演员| 欧美色图一区| 天堂资源在线亚洲| 蜜桃成人av| 欧美日韩在线播放视频| 亚洲韩日在线| 亚洲美洲欧洲综合国产一区| 国产精品试看| 日韩精品一区第一页| 免费美女久久99| 亚洲2区在线| 欧美日韩一区二区国产 | 免费黄网站欧美| 亚洲精品婷婷| 国产精品中文字幕制服诱惑| 国产精品白丝久久av网站| 美女精品久久| 福利片在线一区二区| 日本久久黄色| 99久久激情| 石原莉奈一区二区三区在线观看| 亚洲精品动态| 国产精品欧美一区二区三区不卡| 国产精品.xx视频.xxtv| 日韩av在线播放网址| 久久精品动漫| 丝袜美腿亚洲一区| 国产日产精品一区二区三区四区的观看方式 | 国产欧美亚洲一区| 久久精品国产在热久久| 国产精品成人a在线观看| 国产中文在线播放| 一区视频在线| 日本aⅴ亚洲精品中文乱码| 精品免费视频| 激情欧美国产欧美| 一区二区精品| 麻豆视频一区二区| 久久要要av| 亚洲精品黄色| 久久精品亚洲一区二区| 久久精品影视| 亚洲网址在线观看| 精品国产亚洲一区二区三区在线 | 91国内精品| 国产成人精品一区二区免费看京| 天堂日韩电影| 日韩在线观看中文字幕| 国产一区一一区高清不卡| 精品一区欧美| 国产欧美69| 欧美日韩在线二区| 欧美综合社区国产| 日韩毛片在线| 日韩精品久久久久久| 国产成人77亚洲精品www| 亚洲激情偷拍| 麻豆视频一区| 石原莉奈在线亚洲二区| 国产一区二区三区天码| 久久成人精品| 福利视频一区| 亚洲精品影院在线观看| 日本精品黄色| 亚洲精品人人| 亚洲精品一级二级| 7777精品| 91成人网在线观看| 免费在线成人| 巨乳诱惑日韩免费av| 精品高清久久| 亚洲人成在线影院| 国产理论在线| 97成人在线| 欧美在线亚洲综合一区| 麻豆国产一区| 亚洲狼人精品一区二区三区| 偷拍精品精品一区二区三区|