浅谈 Android 7.0 多窗口分屏模式的实现
随着 Android 7.0 的发布,Android 中加入了多窗口分屏模式的功能,这个功能可以让用户在同一时间同时操作多个应用。本文将详细讲解 Android 7.0 多窗口分屏模式的实现过程。
实现前提条件
为了能够使用 Android 7.0 的多窗口分屏模式,我们需要满足以下前提条件:
- 设备系统版本必须是 Android 7.0 或更高版本
- 应用必须支持多窗口模式
实现步骤
多窗口模式的实现步骤分为以下几步:
- 设置应用为可多窗口模式
我们需要在 AndroidManifest.xml 文件中为应用添加如下的属性:
<activity android:name=".MainActivity"
android:resizeableActivity="true"
android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation"/>
其中,resizeableActivity 属性使用来说明应用是否支持多窗口模式的,如果值为 true,说明支持多窗口模式,为 false,则说明不支持。
- 监听窗口状态的变化
我们需要在 Activity 中实现 onPictureInPictureModeChanged() 方法,并在该方法中处理多窗口模式变化时需要执行的逻辑。例如,在进入多窗口模式时,我们需要禁用某个按钮,当退出多窗口模式时,需要重新启用该按钮。
@Override
public void onPictureInPictureModeChanged(boolean isInPictureInPictureMode) {
super.onPictureInPictureModeChanged(isInPictureInPictureMode);
if (isInPictureInPictureMode) {
mButton.setEnabled(false);
} else {
mButton.setEnabled(true);
}
}
- 设置多窗口模式的分屏方案
Android 7.0 支持两种分屏方案:
- 普通分屏模式:两个应用各占屏幕的一半,用户可以拖动应用的边界来改变两个应用分割的位置
- 自由形式分屏模式:用户可以自由调整两个应用的显示比例和位置
我们可以通过以下代码来判断当前设备是否支持自由形式分屏模式:
if (mActivity.isInMultiWindowMode() && mActivity.supportsPictureInPicture()) {
// 自由形式分屏模式
} else {
// 普通分屏模式
}
示例说明
示例1
我们可以创建一个简单的应用,并设置其支持多窗口模式:
<activity android:name=".MainActivity"
android:resizeableActivity="true"
android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
然后我们在 MainActivity 中添加两个按钮,一个用于进入多窗口模式,另一个用于退出多窗口模式:
private Button mEnterMultiWindowButton;
private Button mExitMultiWindowButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mEnterMultiWindowButton = findViewById(R.id.enter_multi_window_button);
mEnterMultiWindowButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
enterMultiWindowMode();
}
});
mExitMultiWindowButton = findViewById(R.id.exit_multi_window_button);
mExitMultiWindowButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
exitMultiWindowMode();
}
});
}
private void enterMultiWindowMode() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
startInPictureInPictureMode();
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
enterPictureInPictureMode();
}
}
private void exitMultiWindowMode() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
stopInPictureInPictureMode();
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
exitPictureInPictureMode();
}
}
同时,在 MainActivity 中重写 onPictureInPictureModeChanged() 方法:
@Override
public void onPictureInPictureModeChanged(boolean isInPictureInPictureMode) {
super.onPictureInPictureModeChanged(isInPictureInPictureMode);
if (isInPictureInPictureMode) {
mEnterMultiWindowButton.setEnabled(false);
mExitMultiWindowButton.setEnabled(true);
} else {
mEnterMultiWindowButton.setEnabled(true);
mExitMultiWindowButton.setEnabled(false);
}
}
最后我们可以在 Android 设备上安装并运行该应用,并通过该应用进入多窗口模式。
示例2
我们通过一个简单的案例来演示下自由形式分屏模式:
创建一个新的项目,并在 MainActivity 的 onCreate() 方法中添加一个 TextView:
<TextView
android:id="@+id/text_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:textSize="22sp"
android:text="@string/lorem_ipsum" />
同时,在 onCreate() 方法中为该 TextView 设置一个长按的监听器,当用户长按该 TextView 时,我们进入多窗口模式。
private TextView mTextView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTextView = findViewById(R.id.text_view);
mTextView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
enterMultiWindowMode();
return true;
}
});
}
接下来我们需要实现自定义分屏模式的功能。我们可以使用 DragEvent 来实现自由形式分屏模式:
private View mDragView;
private int mScreenWidth;
@Override
public boolean onDrag(View v, DragEvent event) {
switch (event.getAction()) {
case DragEvent.ACTION_DRAG_STARTED:
mDragView.setVisibility(View.VISIBLE);
return true;
case DragEvent.ACTION_DRAG_ENTERED:
return true;
case DragEvent.ACTION_DRAG_LOCATION:
int x = (int) event.getX();
int y = (int) event.getY();
int halfWidth = mScreenWidth / 2;
if (x < halfWidth) {
mDragView.setX(0);
mDragView.setY(y - mDragView.getHeight() / 2);
getWindow().setAttributes(getWindow().getAttributes());
getWindow().setLayout(halfWidth * 2, mTextView.getHeight());
} else {
mDragView.setX(halfWidth);
mDragView.setY(y - mDragView.getHeight() / 2);
getWindow().setAttributes(getWindow().getAttributes());
getWindow().setLayout(halfWidth * 2, mTextView.getHeight());
}
return true;
case DragEvent.ACTION_DROP:
mDragView.setVisibility(View.INVISIBLE);
return true;
case DragEvent.ACTION_DRAG_EXITED:
return true;
case DragEvent.ACTION_DRAG_ENDED:
mDragView.setVisibility(View.INVISIBLE);
return true;
default:
return false;
}
}
最后我们可以在 Android 设备上运行该应用,并通过长按 TextView 进入多窗口模式,拖动窗口边界来测试自由形式分屏模式的功能。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:浅谈 Android 7.0 多窗口分屏模式的实现 - Python技术站