首页 > 解决方案 > 缩放问题和 3 秒延迟进入/退出带有浮动/半透明窗口的画中画模式

问题描述

使用带有 Android PIP 的浮动/半透明窗口会导致 3 秒延迟以及缩放问题。我已经整理了一个示例应用程序来演示该问题。我在想有一些标签组合我使用不正确或完全缺少一些标签或标签。我尝试了许多不同的组合,并想出了一些组合来演示这个问题。我将添加代码部分,让您了解我在做什么。我会根据需要添加额外的或完整的代码。我想尽量让这个问题保持简洁,但如果我添加更多您在开发环境中实际运行应用程序所需的示例应用程序,它可能会变得很长。

以下是测试应用程序的 styles.xml 中的重要部分:

    <!--== ERROR CASE #1=================================-->
    <!-- Causes 3 second delay to get into PIP mode      -->
    <!-- Incorrect window scale during 3 second delay    -->
    <!-- Incorrect window size  after PIP exit           -->
    <!--=================================================-->
    <item name="android:windowIsFloating">true</item>
    <!--=================================================-->

    <!--== ERROR CASE #2=================================-->
    <!-- Causes 3 second delay to get into PIP mode-->
    <!-- Window is not transparent                 -->
    <!--=================================================-->
    <item name="android:windowIsTranslucent">true</item>
    <!--=================================================-->

    <!--== ERROR CASE #3=================================-->
    <!-- Causes 3 second delay to get into PIP mode      -->
    <!-- Incorrect window scale during 3 second delay    -->
    <!-- Incorrect window scale after PIP exit           -->
    <!--=================================================-->
    <item name="android:windowIsTranslucent">true</item>
    <item name="android:windowIsFloating">true</item>
    <!--=================================================-->

下图是初始应用屏幕(如预期):

初始应用程序屏幕.

将应用程序置于 PIP 模式会导致此屏幕持续三秒钟(意外延迟和不良比例):

进入画中画模式.

3 秒后,PIP 模式启用(预期图像)

画中画模式

由于缩放不良,退出 PIP 会导致无法使用的活动:

画中画退出

我会根据需要添加额外的代码片段。但现在,我认为styles.xml 文件不正确。

这里是样式:

<resources>
<style name="StyleJava42" parent="Theme.AppCompat">
    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>
    <item name="android:backgroundDimEnabled">true</item>
    <item name="android:windowFullscreen">false</item>

    <!--== ERROR CASE #1=================================-->
    <!-- Causes 3 second delay to get into PIP mode      -->
    <!-- Incorrect window scale during 3 second delay    -->
    <!-- Incorrect window size  after PIP exit           -->
    <!--=================================================-->
    <item name="android:windowIsFloating">true</item>
    <!--=================================================-->

    <!--== ERROR CASE #2=================================-->
    <!-- Causes 3 second delay to get into PIP mode-->
    <!-- Window is not transparent                 -->
    <!--=================================================-->
    <item name="android:windowIsTranslucent">true</item>
    <!--=================================================-->

    <!--== ERROR CASE #3=================================-->
    <!-- Causes 3 second delay to get into PIP mode      -->
    <!-- Incorrect window scale during 3 second delay    -->
    <!-- Incorrect window scale after PIP exit           -->
    <!--=================================================-->
    <item name="android:windowIsTranslucent">true</item>
    <item name="android:windowIsFloating">true</item>
    <!--=================================================-->

</style>
</resources>

这是清单:

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/Theme.AppCompat"
    >
    <activity
        android:theme="@style/StyleJava42"
        android:name=".MainActivity"
        android:supportsPictureInPicture="true"
        >
        <intent-filter>
            <action android:name="android.intent.action.VIEW" />
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

底线,我需要一个可用的透明窗口进出 PIP 模式,不会导致缩放问题。

编辑:2019_08_20 - 根据要求,这是活动代码:

public class MainActivity extends Java42LifeCycleTrace { //AppCompatActivity  {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
        if (isInPictureInPictureMode()) {
            setContentView(R.layout.activity_main_pip);
        } else {
            setContentView(R.layout.activity_main);
        }
    }
}

public void pip(View v) {
    ((Button) v).setText("WORKING");
    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
        PictureInPictureParams.Builder pipBuilder = null;
        pipBuilder = new PictureInPictureParams.Builder();
        PictureInPictureParams parms = pipBuilder.build();
        enterPictureInPictureMode(parms);
    }
}

public void exit(View v) {
    finish();
}
}

这是布局activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:context=".MainActivity"
>
<Button
    android:id="@+id/button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginStart="8dp"
    android:layout_marginEnd="8dp"
    android:background="@android:drawable/btn_default"
    android:onClick="pip"
    android:text="Press for PIP"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/button2"
    app:layout_constraintVertical_bias="0.100000024" />
<Button
    android:id="@+id/button2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginStart="8dp"
    android:layout_marginEnd="8dp"
    android:background="@android:drawable/btn_default"
    android:onClick="exit"
    android:text="Press to Exit"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    app:layout_constraintVertical_bias="0.100000024" />

</androidx.constraintlayout.widget.ConstraintLayout>

这是布局activity_main_pip.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:context=".MainActivity">
<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@android:drawable/btn_default"
    android:text="PIP Mode"
/>
</LinearLayout>

标签: androidandroid-picture-in-picture

解决方案


推荐阅读