Android 8.0 中如何實(shí)現(xiàn)視頻通話的畫中畫模式的示例
Android 8.0 當(dāng)中允許 Activiy 以畫中畫模式展現(xiàn)。這是一種多窗口模式的改進(jìn)加強(qiáng),在視頻類應(yīng)用中用處非常大,有了這種模式,就可以在視頻通話或者觀看直播的過程當(dāng)中打開另外的應(yīng)用而不用退出當(dāng)前視頻。更詳細(xì)的就不再累述了,大家去閱讀官方文檔 就行
這里以 Agora SDK 為例來給大家展示下該特性,實(shí)際上不用 Agora SDK 做任何修改。
準(zhǔn)備環(huán)境
- Android 8.0 或以上版本手機(jī)
- Agora SDK 1.14.0 或以上 版本
- Android Studio 3.0 或以上版本(非必需)
如何實(shí)現(xiàn)畫中畫模式
默認(rèn)應(yīng)用是不支持畫中畫模式的,需要給視頻所在的 Activity 做些配置,如下在 AndroidManifest.xml 加上屬性 resizeableActivity/supportsPictureInPicture 并均設(shè)置為 true
android:resizeableActivity="true" android:supportsPictureInPicture="true" android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation"
為了進(jìn)入畫中畫模式,Activty 必需要用 enterPictureInPictureMode(PictureInPictureParams params) 方法,非常的簡(jiǎn)單,但是為了告訴系統(tǒng)進(jìn)入畫中畫模式之后,Activity 界面在整個(gè)屏幕當(dāng)中的布局,我們需要設(shè)置一些參數(shù)。我們這里簡(jiǎn)單設(shè)置下,具體在使用的時(shí)候需要根據(jù)屏幕的分辨率動(dòng)態(tài)取設(shè)置,更多信息參考官方文檔。
PictureInPictureParams params = new PictureInPictureParams.Builder() .setAspectRatio(new Rational(10, 16)) .build();
當(dāng)然需要在程序當(dāng)中控制 Acticity 界面當(dāng)中的內(nèi)容,比如我們可以隱藏自己本地的預(yù)覽畫面,隱藏不需要的按鈕信息等等,這個(gè)實(shí)現(xiàn)也非常簡(jiǎn)單。
@Override
public void onPictureInPictureModeChanged(boolean isInPictureInPictureMode, Configuration newConfig) {
super.onPictureInPictureModeChanged(isInPictureInPictureMode, newConfig);
FrameLayout container = findViewById(R.id.local_video_view_container);
SurfaceView surfaceView = (SurfaceView) container.getChildAt(0);
surfaceView.setZOrderMediaOverlay(!isInPictureInPictureMode);
surfaceView.setVisibility(isInPictureInPictureMode ? View.GONE : View.VISIBLE);
container.setVisibility(isInPictureInPictureMode ? View.GONE : View.VISIBLE);
}
另外值得一說的是,進(jìn)入畫中畫模式,系統(tǒng)會(huì)觸發(fā)生命周期的方法 onPause/onResume 方法,我們需要根據(jù)需要適當(dāng)?shù)淖鲂┎僮?,比如是畫中畫模式的話,就不做任何操作,音視頻流繼續(xù),否則的話,就關(guān)閉視頻流,反正在后臺(tái)也看不見視頻。
另外Android 8.0 畫中畫demo
記錄一下簡(jiǎn)單的demo ,方便以后用到:
package com.example.myapplication;
import android.annotation.TargetApi;
import android.app.PictureInPictureParams;
import android.content.res.Configuration;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.util.Rational;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.TextView;
/**
* 畫中畫
*/
public class TestPIPActivity extends AppCompatActivity {
private static final String TAG = "TestPIPActivity";
private PictureInPictureParams.Builder mPictureInPictureParamsBuilder;
@TargetApi(Build.VERSION_CODES.O)
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
FrameLayout content = new FrameLayout(this);
setContentView(content,new ViewGroup.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
if(Build.VERSION.SDK_INT == Build.VERSION_CODES.O){
mPictureInPictureParamsBuilder = new PictureInPictureParams.Builder();
final TextView textView = new TextView(this);
textView.setText("test PIP");
textView.setTextSize(20);
FrameLayout.LayoutParams fl = new FrameLayout.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
fl.gravity = Gravity.CENTER ;
textView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {//主要操作
Rational aspectRatio = new Rational(10,10);
mPictureInPictureParamsBuilder.setAspectRatio(aspectRatio).build();
enterPictureInPictureMode(mPictureInPictureParamsBuilder.build());
}
});
content.addView(textView,fl);
}else{
TextView descTv = new TextView(this);
descTv.setText("當(dāng)前版本不支持...");
descTv.setTextSize(20);
FrameLayout.LayoutParams Tvfl = new FrameLayout.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
Tvfl.gravity = Gravity.CENTER ;
content.addView(descTv,Tvfl);
}
}
@Override
public void onPictureInPictureModeChanged(boolean isInPictureInPictureMode, Configuration newConfig) {
super.onPictureInPictureModeChanged(isInPictureInPictureMode, newConfig);
Log.d(TAG,String.valueOf(isInPictureInPictureMode));
}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android播放多張圖片形成的一個(gè)動(dòng)畫示例
這篇文章主要介紹了Android播放多張圖片形成的一個(gè)動(dòng)畫實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了Android逐幀播放動(dòng)畫圖片及ImageView控件的相關(guān)使用技巧,需要的朋友可以參考下2016-10-10
Android中ListView的幾種常見的優(yōu)化方法總結(jié)
Android中的ListView應(yīng)該算是布局中幾種最常用的組件之一,本篇文章主要做了三種優(yōu)化總結(jié),有興趣的可以了解一下。2017-02-02
Android中應(yīng)用界面主題Theme使用方法和頁面定時(shí)跳轉(zhuǎn)應(yīng)用
在Android SDK中內(nèi)置了下面的Theme,可以按標(biāo)題欄Title Bar和狀態(tài)欄Status Bar是否可見來分類,感興趣的朋友可以了解下哈2013-06-06
Android自定義控件實(shí)現(xiàn)驗(yàn)證碼倒計(jì)時(shí)
這篇文章主要為大家詳細(xì)介紹了Android自定義控件實(shí)現(xiàn)驗(yàn)證碼倒計(jì)時(shí)的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-03-03
Android 滑動(dòng)Scrollview標(biāo)題欄漸變效果(仿京東toolbar)
這篇文章主要介紹了Android 滑動(dòng)Scrollview標(biāo)題欄漸變效果(仿京東toolbar),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01
Android仿騰訊視頻實(shí)現(xiàn)懸浮窗效果
對(duì)view比較熟悉的同學(xué)們應(yīng)該發(fā)現(xiàn)了,其實(shí)我們的懸浮窗就是一個(gè)view,我們只需要把view添加到windowManager上就可以了。那么,下面通過本文給大家分享Android仿騰訊視頻實(shí)現(xiàn)懸浮窗效果,一起看看吧2021-06-06
Android實(shí)現(xiàn)viewpager實(shí)現(xiàn)循環(huán)輪播效果
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)viewpager實(shí)現(xiàn)循環(huán)輪播效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-03-03

