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

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

Android仿優酷視頻的懸浮窗播放效果

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

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

主頁面對應的視頻控件的父view

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

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

vw_live = new IjkVideoView(this);

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

主播放界面的啟動模式

播放主界面的activity的啟動模式不能為默認,因為我們要保證播放主界面在顯示懸浮窗的時候退到后臺,但是整個的應用不能退到后臺,所以activity的啟動模式改為singleInstance

android:launchMode='singleInstance'

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

moveTaskToBack(true);

可以讓播放界面退到后臺而整個應用不會退回后臺

權限請求

要使用懸浮窗需要申請權限

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

if (!Settings.canDrawOverlays(this)) { Toast.makeText(this, '當前無權限,請授權', 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);; // 獲取系統窗口管理服務 mWindowManager = (WindowManager) activity.getSystemService(Context.WINDOW_SERVICE); // 懸浮窗口參數設置及返回 mFloatParams = getParams(); //floatingWindow內部控件實例 init(view); // 設置窗口觸摸移動事件 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(); //設置懸浮窗口類型 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 = 500; layoutParams.height = 340; //設置懸浮窗顯示位置 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.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://www.b3g6.com/bcjs/@android:drawable/ic_menu_revert' /></FrameLayout>

懸浮窗的滑動,我們可以通過自定義點擊監聽實現

/** * 浮窗移動/點擊監聽 */ 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; } }

懸浮窗的消失,在這里調用videoLayout.removeAllViews()是為了將復用的視頻控件的父View清空,返回主播放activity的時候調用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; }

對于懸浮窗的調用

用hasBind來記錄是否調用了懸浮窗

private void startFloatingWindow(){ if (!Settings.canDrawOverlays(this)) { Toast.makeText(this, '當前無權限,請授權', 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退回后臺,再重新進入主界面的時候,注意,不再調用onCreate方法,而是調用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; } }

總結

到此這篇關于Android仿優酷視頻的懸浮窗播放的文章就介紹到這了,更多相關android 優酷視頻懸浮窗播放內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: 優酷
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日本欧美一区| 成人羞羞在线观看网站| 成人亚洲一区二区| 日本亚洲三级在线| 综合精品一区| 日韩亚洲精品在线| 国产传媒在线观看| 荡女精品导航| 国产精久久一区二区| 麻豆精品新av中文字幕| 欧美三级第一页| 最新国产精品| 日本亚洲欧美天堂免费| 亚洲一区二区三区四区五区午夜| 秋霞影院一区二区三区| 国产精品黑丝在线播放| 精品无人区麻豆乱码久久久| 麻豆精品在线观看| 国产精品第一| 日本综合精品一区| 国产亚洲电影| 国产伦精品一区二区三区视频| 国产日韩欧美一区二区三区 | 国产精品毛片在线| 青青久久av| 国精品一区二区| 久久国产免费| 国产高清一区| 香蕉久久国产| 久久国产精品99国产| 国产精品99精品一区二区三区∴| 日韩精品免费观看视频| 在线免费观看亚洲| 国产丝袜一区| 精品一区二区三区视频在线播放 | 国产日韩中文在线中文字幕| 日韩在线短视频| 欧美在线看片| 亚欧成人精品| 777久久精品| 精品视频亚洲| 福利精品一区| 亚洲综合电影| 亚洲综合在线电影| 欧美精品一二| 日韩精品三级| 欧美天堂一区| 麻豆一区二区在线| 久久精品中文| 久久精品二区三区| 97精品一区二区| 久久美女性网| 国产精品老牛| 久久亚洲色图| 精品在线网站观看| 久久影院午夜精品| 成人免费电影网址| 视频一区在线播放| 日本色综合中文字幕| 国产精品一区亚洲| 在线观看一区| 国产精品蜜月aⅴ在线| 欧美极品一区二区三区| 色综合狠狠操| 不卡在线一区| 久久亚洲黄色| 欧美亚洲国产精品久久| 日韩制服丝袜先锋影音| 日韩成人在线看| 韩国女主播一区二区三区| 欧美日韩亚洲在线观看| 在线综合亚洲| 不卡一区综合视频| 中文字幕免费一区二区| 国产日韩欧美高清免费| 久久麻豆精品| 日韩在线观看一区二区| 日韩深夜视频| 日韩一级不卡| 国产日韩高清一区二区三区在线 | 日韩欧美久久| 日韩视频在线一区二区三区| 国产精品视频一区二区三区综合| 中文字幕免费一区二区| 新版的欧美在线视频| 国产精品亚洲片在线播放| 蜜臀精品一区二区三区在线观看| 91欧美在线| 国产精品99久久免费| 久久99高清| 日韩精品第一区| 久久免费国产| 久久先锋影音| 一区二区三区国产在线| 日韩av影院| 国产精品九九| 国产成人精品亚洲线观看| 亚洲久草在线| 你懂的国产精品永久在线| 婷婷精品在线| 日韩国产欧美| 老色鬼久久亚洲一区二区| 国产精品一区二区精品视频观看 | 国产精品久久久久久妇女| 国产亚洲在线观看| 成人高清一区| 一本一本久久| 日韩精品永久网址| 日产精品一区二区| 91tv亚洲精品香蕉国产一区| 99riav1国产精品视频| 在线观看亚洲精品福利片| 国产精品xx| 亚洲免费网址| 免费在线视频一区| 精品一二三区| 日韩专区一卡二卡| 国产精品成人**免费视频| 日韩三区在线| 麻豆视频一区二区| 男女男精品视频网| 国产欧美一区二区三区国产幕精品| 亚洲手机视频| 麻豆高清免费国产一区| 香蕉久久久久久久av网站| 精品伊人久久久| 天堂va欧美ⅴa亚洲va一国产| 在线综合亚洲| 免费成人在线影院| 久久伦理在线| 九九色在线视频| 欧美日韩中文| 美女被久久久| 99pao成人国产永久免费视频| 婷婷激情图片久久| 国产乱子精品一区二区在线观看| 国产视频久久| 999久久久免费精品国产| 国产成人在线中文字幕| 精品久久久网| 国产欧美精品| 久久精品国产99国产| 精品久久97| 久久激五月天综合精品| 日韩亚洲精品在线观看| 亚洲国产专区| 中文字幕在线官网| 久久精品播放| 日韩在线观看一区| 播放一区二区| 欧美粗暴jizz性欧美20| 国产黄大片在线观看| 久久免费视频66| 另类综合日韩欧美亚洲| 国产精品激情电影| 成人国产精品| 欧美.日韩.国产.一区.二区| 玖玖玖国产精品| 日本伊人午夜精品| 另类中文字幕国产精品| 免费在线欧美黄色| 精品一区二区三区的国产在线观看| 中文亚洲欧美| 麻豆精品视频在线| 日韩av二区在线播放| 亚洲3区在线| 国产精品yjizz视频网| 亚洲国产成人精品女人| 老司机久久99久久精品播放免费| 日韩免费一区| 久久精品国产亚洲夜色av网站| 国产亚洲精品v| 亚欧洲精品视频在线观看| 国产剧情一区| 色偷偷色偷偷色偷偷在线视频| 亚洲免费中文| 国产伦精品一区二区三区视频| 日韩欧美中文| 国模 一区 二区 三区| 偷拍欧美精品| 久久国产人妖系列| 欧洲精品一区二区三区| 妖精视频成人观看www| 嫩草伊人久久精品少妇av杨幂| 岛国av在线网站| 国产精品蜜芽在线观看| 综合国产精品| 久久在线免费| 日韩区一区二| 黄色在线观看www| 青青草视频一区| 视频一区二区三区在线| 精品入口麻豆88视频| 日韩av网站在线观看| 水蜜桃精品av一区二区| 欧美韩日一区| 精品国产第一福利网站| 夜夜嗨av一区二区三区网站四季av| 亚洲一级淫片| 国产乱码精品一区二区亚洲|