📜  如何在 Android 中实现画中画 (PIP)?

📅  最后修改于: 2022-05-13 01:55:00.444000             🧑  作者: Mango

如何在 Android 中实现画中画 (PIP)?

本文介绍了如何在 Android 应用程序中实现画中画 (PIP)
我们在谷歌地图等很多应用中使用导航时看到,当我们关闭应用时,屏幕右下方会出现一个浮动屏幕,如下图所示。此屏幕称为 PIP(画中画)模式。

什么是 PIP(画中画)模式?
画中画是一种特殊的多窗口模式,主要用于需要在屏幕上活跃但不应该占用整个屏幕空间的活动,如看视频、视频通话、导航等。它让用户在一个屏幕上观看视频。在应用程序之间导航或浏览主屏幕上的内容时,固定在屏幕一角的小窗口(默认为右下角)。 Android 8.0(API 级别 26)及更高版本允许以 PIP 模式启动活动。
PIP 窗口出现在屏幕的最顶层。您可以使用一些特殊的切换将 PIP 窗口拖到另一个位置。当您点击窗口时,会出现两个特殊控件:

  • 全屏切换(在窗口中央)和
  • 关闭按钮(右上角的“X”)。

下面是 PIP 模式的实现。

  1. 在 android studio 中创建一个 android 项目。
  2. 声明画中画支持:默认情况下,没有活动启用 PIP 模式。这需要通过 Manifest 文件完成
  3. 现在,在布局文件 ( activity_main.xml ) 中,我们将在 Activity 中有两个组件:
    • 一个 TextView 和
    • 一个按钮。
  4. 现在,让我们在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 模式下的外观。