如何在 Android 中实现画中画 (PIP)?
本文介绍了如何在 Android 应用程序中实现画中画 (PIP) 。
我们在谷歌地图等很多应用中使用导航时看到,当我们关闭应用时,屏幕右下方会出现一个浮动屏幕,如下图所示。此屏幕称为 PIP(画中画)模式。
什么是 PIP(画中画)模式?
画中画是一种特殊的多窗口模式,主要用于需要在屏幕上活跃但不应该占用整个屏幕空间的活动,如看视频、视频通话、导航等。它让用户在一个屏幕上观看视频。在应用程序之间导航或浏览主屏幕上的内容时,固定在屏幕一角的小窗口(默认为右下角)。 Android 8.0(API 级别 26)及更高版本允许以 PIP 模式启动活动。
PIP 窗口出现在屏幕的最顶层。您可以使用一些特殊的切换将 PIP 窗口拖到另一个位置。当您点击窗口时,会出现两个特殊控件:
- 全屏切换(在窗口中央)和
- 关闭按钮(右上角的“X”)。
下面是 PIP 模式的实现。
- 在 android studio 中创建一个 android 项目。
- 声明画中画支持:默认情况下,没有活动启用 PIP 模式。这需要通过 Manifest 文件完成
- 现在,在布局文件 ( activity_main.xml ) 中,我们将在 Activity 中有两个组件:
- 一个 TextView 和
- 一个按钮。
- 现在,让我们在MainActivity 中添加一些代码。 Java文件。在这个应用程序中,我们将通过单击按钮将活动更改为 PIP 模式。
- 首先,我们将使用getWindowManager()获取显示大小。
- 之后使用函数enterPictureInPictureMode()应该提供一个PictureInPictureParams.Builder参数。
下面是相同的代码。
activity_main.xml
MainActivity.java
package com.vaibhav.pictureinpicture;
import androidx.appcompat.app.AppCompatActivity;
import android.app.ActionBar;
import android.app.PictureInPictureParams;
import android.content.res.Configuration;
import android.graphics.Point;
import android.os.Bundle;
import android.util.Rational;
import android.view.Display;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {
private Button enter;
ActionBar actionBar;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
actionBar = getActionBar();
enter = findViewById(R.id.enter_button);
enter.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view)
{
Display d = getWindowManager()
.getDefaultDisplay();
Point p = new Point();
d.getSize(p);
int width = p.x;
int height = p.y;
Rational ratio
= new Rational(width, height);
PictureInPictureParams.Builder
pip_Builder
= new PictureInPictureParams
.Builder();
pip_Builder.setAspectRatio(ratio).build();
enterPictureInPictureMode(pip_Builder.build());
}
});
}
}
主要活动。Java
package com.vaibhav.pictureinpicture;
import androidx.appcompat.app.AppCompatActivity;
import android.app.ActionBar;
import android.app.PictureInPictureParams;
import android.content.res.Configuration;
import android.graphics.Point;
import android.os.Bundle;
import android.util.Rational;
import android.view.Display;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {
private Button enter;
ActionBar actionBar;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
actionBar = getActionBar();
enter = findViewById(R.id.enter_button);
enter.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view)
{
Display d = getWindowManager()
.getDefaultDisplay();
Point p = new Point();
d.getSize(p);
int width = p.x;
int height = p.y;
Rational ratio
= new Rational(width, height);
PictureInPictureParams.Builder
pip_Builder
= new PictureInPictureParams
.Builder();
pip_Builder.setAspectRatio(ratio).build();
enterPictureInPictureMode(pip_Builder.build());
}
});
}
}
输出:
- 按下按钮为活动启用 PIP 模式。
- 这是活动在 PIP 模式下的外观。