这是另一个使用片段显示缩放 UI 的解决方案。与我之前的解决方案不同,此解决方案的优势在于能够显示针对 PIP 模式进行了优化的 UI。(例如,某些视图可以在 PIP 模式下隐藏。)
以下代码使用 onPictureInPictureModeChanged() 侦听模式更改并在下次重新启动时更改 UI。(因为 PIP 模式下不需要工具栏,所以在进入 PIP 模式之前它是隐藏的。)
public class Activity extends AppCompatActivity {
private static final String FRAGMENT_TAG_FULL = "fragment_full";
private static final String FRAGMENT_TAG_PIP = "fragment_pip";
private MyApplication mApplication;
private Toolbar mToolbar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mApplication = (MyApplication) getApplicationContext();
setContentView(R.layout.activity);
mToolbar = findViewById(R.id.toolbar);
setSupportActionBar(mToolbar);
if (!mApplication.inPipMode) {
showFullFragment();
} else {
showPipFragment();
}
}
@Override
protected void onUserLeaveHint() {
mToolbar.setVisibility(View.GONE);
PictureInPictureParams params = new PictureInPictureParams.Builder().build();
enterPictureInPictureMode(params);
}
@Override
public void onPictureInPictureModeChanged(boolean isInPictureInPictureMode, Configuration newConfig) {
if (isInPictureInPictureMode) {
mApplication.inPipMode = true;
} else {
mApplication.inPipMode = false;
}
}
private void showFullFragment() {
Fragment fragment = new FragmentFull();
getSupportFragmentManager().beginTransaction()
.replace(R.id.container_content, fragment, FRAGMENT_TAG_FULL)
.commit();
mToolbar.setVisibility(View.VISIBLE);
}
private void showPipFragment() {
Fragment fragment = new FragmentPip();
getSupportFragmentManager().beginTransaction()
.replace(R.id.container_content, fragment, FRAGMENT_TAG_PIP)
.commit();
mToolbar.setVisibility(View.GONE);
}
}
因为 onUserLeaveHint() - 启动 PIP 模式 - 在 onSaveInstanceState() 之后调用,当前模式不能存储在活动类的字段中。它必须存储在其他地方,它可以在配置更改后幸存下来。这里使用了应用程序类中的一个字段。
public class MyApplication extends Application {
public boolean inPipMode = false;
}
全屏模式的片段布局:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:text="Hello World!"
android:textSize="36sp" />
<TextView
android:id="@+id/text_detail"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/text"
android:layout_centerHorizontal="true"
android:text="🙂"
android:textSize="28sp" />
</RelativeLayout>
PIP 模式的片段布局:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:text="Hello World!"
android:textSize="10sp"/>
</RelativeLayout>
结果: