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

yizhihongxing

浅谈 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日

相关文章

  • C#使用Gembox.SpreadSheet向Excel写入数据及图表的实例

    C#使用Gembox.SpreadSheet向Excel写入数据及图表的实例 Gembox.SpreadSheet是一个强大的C#库,用于处理Excel文件。以下是使用Gembox.SpreadSheet向Excel写入数据及图表的实例的详细攻略: 首先,确保已经安装了Gembox.SpreadSheet库。可以通过NuGet包管理器或手动下载并引用Gemb…

    other 2023年10月15日
    00
  • 关于权限:windowschmod600

    在Windows系统中,没有chmod命令,但是可以使用Windows的访问控制列表(ACL)来实现类似的权限管理。本文将详细讲解在Windows中使用ACL实现chmod 600的攻略,包括使用方法和示例说明。 Windows中使用ACL实现chmod 600 在Windows中,可以使用icacls命令来修改文件或目录的ACL权限。要实现chmod 60…

    other 2023年5月7日
    00
  • Android应用内调用第三方应用的方法

    Android应用内调用第三方应用的方法 要在Android应用内调用第三方应用,可以使用隐式意图(Implicit Intent)来实现。以下是详细步骤: 确定要调用的第三方应用的包名和启动Activity的类名。 创建一个隐式意图,并设置要调用的第三方应用的包名和启动Activity的类名。 java Intent intent = new Intent…

    other 2023年10月14日
    00
  • proto3协议指引

    proto3协议指引 什么是proto3协议? proto3是Google开源的一种用于序列化结构化数据的协议,它的全称是Protocol Buffers 3。它是proto2版本的升级版,拥有更简洁、更强大的特性。 proto3协议支持多种编程语言,包括Java、Python、Go、C++等。它支持先定义数据结构,再将数据结构编译成目标语言的数据访问类,从…

    其他 2023年3月28日
    00
  • vue新建项目并配置标准路由过程解析

    下面是Vue新建项目并配置标准路由的完整攻略: 步骤一:安装Vue CLI 安装Vue CLI是使用Vue.js创建新项目的第一步。Vue CLI可以让你快速构建基于Vue.js的应用程序,还可以自动生成标准的项目结构和配置,让开发变得更加高效。运行以下命令安装Vue CLI: npm install -g @vue/cli 步骤二:创建新项目 完成Vue …

    other 2023年6月27日
    00
  • 华为mate7打开和关闭开发人员选项方法图解

    华为Mate7打开和关闭开发人员选项方法 为什么需要开启开发人员选项? 在华为Mate7手机上开启开发人员选项可以让用户进行一些高级操作,如启用USB调试、查看和保持手机状态、CPU使用情况、查看电池使用状态等等。这些操作需要在开发人员选项中启用,才可以使用。所以,如果你是一名开发人员或需要进行高级操作的用户,开启开发人员选项是非常必要的。 如何打开开发人员…

    other 2023年6月26日
    00
  • WPS 插件和鼠标右键的精妙配合

    标题:WPS插件和鼠标右键的精妙配合攻略 正文: WPS插件可以极大地提高我们的工作效率,而鼠标右键也是我们经常使用的快捷键之一。在WPS中,将插件与鼠标右键配合起来,可以使我们的日常工作更加高效便捷。 一、安装WPS插件 要实现WPS插件的右键菜单功能,首先需要安装对应的插件。我们以WPS文字为例,步骤如下: 打开WPS文字软件,点击“插件”菜单下的“插件…

    other 2023年6月27日
    00
  • ffmpeg正确设置输出选项(-r)

    ffmpeg正确设置输出选项(-r)的完整攻略 在使用ffmpeg进行视频处理时,经常需要设置输出选项,其中-r选项用于设置输出视频的帧率。以下是ffmpeg正确设置输出选项(-r)的完整攻略。 步骤1:查看输入视频的帧率 在设置输出视频的帧率之前,需要先查看输入的帧率。可以使用以下命令看输入视频的帧率: ffmpeg -i input.mp4 在输出信息中…

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