浅谈 Android 7.0 多窗口分屏模式的实现

浅谈 Android 7.0 多窗口分屏模式的实现

随着 Android 7.0 的发布,Android 中加入了多窗口分屏模式的功能,这个功能可以让用户在同一时间同时操作多个应用。本文将详细讲解 Android 7.0 多窗口分屏模式的实现过程。

实现前提条件

为了能够使用 Android 7.0 的多窗口分屏模式,我们需要满足以下前提条件:

  • 设备系统版本必须是 Android 7.0 或更高版本
  • 应用必须支持多窗口模式

实现步骤

多窗口模式的实现步骤分为以下几步:

  1. 设置应用为可多窗口模式

我们需要在 AndroidManifest.xml 文件中为应用添加如下的属性:

<activity android:name=".MainActivity"
    android:resizeableActivity="true"
    android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation"/>

其中,resizeableActivity 属性使用来说明应用是否支持多窗口模式的,如果值为 true,说明支持多窗口模式,为 false,则说明不支持。

  1. 监听窗口状态的变化

我们需要在 Activity 中实现 onPictureInPictureModeChanged() 方法,并在该方法中处理多窗口模式变化时需要执行的逻辑。例如,在进入多窗口模式时,我们需要禁用某个按钮,当退出多窗口模式时,需要重新启用该按钮。

@Override
public void onPictureInPictureModeChanged(boolean isInPictureInPictureMode) {
    super.onPictureInPictureModeChanged(isInPictureInPictureMode);
    if (isInPictureInPictureMode) {
        mButton.setEnabled(false);
    } else {
        mButton.setEnabled(true);
    }
}
  1. 设置多窗口模式的分屏方案

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技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • 提高Vector容器的删除效率

    提高Vector容器的删除效率 Vector是C++ STL中最常用的容器之一,它能够动态地增加或缩减数组的大小。然而,删除Vector容器中的元素可能会导致性能问题,特别是当Vector中包含大量元素时。在本文中,我们将介绍如何提高Vector容器的删除效率。 Vector容器的删除操作 Vector容器的删除操作分为两类:删除单个元素和删除一段连续的元素…

    其他 2023年3月28日
    00
  • win10大小写提示图标如何设置?

    当你在使用Windows 10操作系统时,可以通过设置来启用大小写提示图标。下面是设置大小写提示图标的完整攻略: 首先,点击任务栏右侧的通知图标,然后点击“所有设置”图标(齿轮状图标)。 在弹出的“设置”窗口中,点击“个性化”。 在左侧导航栏中,选择“任务栏”。 在右侧窗口中,向下滚动并找到“通知区域”一栏,点击“选择哪些图标显示在任务栏上”。 在弹出的窗口…

    other 2023年8月16日
    00
  • 通过配置.htaccess文件实现子目录绑定二级域名的方法

    下面是通过配置.htaccess文件实现子目录绑定二级域名的方法的完整攻略。 1. 编写.htaccess文件 在需要绑定二级子域名的子目录下创建或编辑.htaccess文件,并在里面添加以下代码(假设要绑定的子域名是subdomain.example.com): RewriteEngine on RewriteBase /subdirectory/ Rew…

    other 2023年6月27日
    00
  • vue实现下拉加载其实没那么复杂

    下面我将为您详细讲解“Vue实现下拉加载其实没那么复杂”的完整攻略。 1. 实现思路 实现下拉加载的思路比较简单,主要是利用vue的组件化和axios的数据请求。首先创建一个可滚动加载的组件,在其生命周期中利用axios请求数据并更新到组件的显示列表中,当滚动到底部时再次触发axios请求数据,重复更新从而实现下拉加载。 2. 实现步骤 2.1 创建可滚动加…

    other 2023年6月25日
    00
  • 7-Zip(64位)如何设置层叠右键菜单?7-Zip设置层叠右键菜单教程

    下面是详细的”7-Zip设置层叠右键菜单教程”攻略: 1. 下载7-Zip(64位)程序并安装 首先我们需要在官网下载7-Zip(64位)程序并安装:https://www.7-zip.org/ 2. 打开7-Zip程序并设置 打开7-Zip程序,选择“选项”菜单。 在选项窗口中选择“7-Zip”选项卡。 在“7-Zip文件管理器”部分中,勾选“在上下文菜单…

    other 2023年6月27日
    00
  • Spring实现上拉刷新和下拉加载效果

    下面是关于Spring实现上拉刷新和下拉加载效果的完整攻略及两个示例说明。 准备工作 引入需要的依赖,可以在pom.xml文件中添加以下依赖: xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot…

    other 2023年6月25日
    00
  • 开通局域网共享(访问本机要填用户名和密码)的注册表和批处理

    开通局域网共享需要进行一些注册表和批处理的配置,具体步骤如下: 打开注册表编辑器(“运行” -> “regedit”)。 找到以下注册表路径:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters 在Parameters节点下,右键选择“新建” ->…

    other 2023年6月27日
    00
  • Java中字符串常见题之String相关讲解

    Java中字符串常见题之String相关讲解 String类的定义 在Java中,String是一个类,它代表字符串类型。 String类是final类,它是Java的内置类之一,也是Java程序中最常用的类之一。 String的常用方法 创建字符串对象 直接赋值 java String str1 = “Hello World”; 构造函数 java Str…

    other 2023年6月20日
    00
合作推广
合作推广
分享本页
返回顶部