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

相关文章

  • win11 ip地址自动获取怎么设置?win11设置ip地址自动获取方法

    Win11 IP地址自动获取设置攻略 在Win11操作系统中,设置IP地址自动获取非常简单。下面是详细的步骤: 打开“设置”:点击任务栏上的“开始”按钮,然后点击“设置”图标(齿轮状图标)。 进入“网络和互联网”设置:在设置窗口中,点击左侧导航栏中的“网络和互联网”选项。 打开网络设置:在“网络和互联网”设置页面中,点击右侧的“高级网络设置”链接。 进入网络…

    other 2023年7月31日
    00
  • 魔兽世界7.3.5奥法怎么堆属性 wow7.35奥法配装属性优先级攻略

    魔兽世界7.3.5奥法怎么堆属性 对于奥术法师来说,输出的强弱与属性堆叠的效果非常相关。以下是奥法配装属性优先级攻略。 属性优先级 奥法的输出主要由智力和暴击率、法强加成三个属性来决定,其他属性相对较为次要。因此属性堆叠应该以智力、暴击优先,其次是法强加成,并搭配一些耐力。 具体优先级为:智力 > 暴击 > 法强加成 > 爆击伤害 >…

    other 2023年6月27日
    00
  • es自定义索引模板

    以下是关于“ES自定义索引模板”的完整攻略,包括定义、使用方法、示例说明和注意事项。 定义 ES自定义索引模板是一种自定义的Elasticsearch索引模板,用于定义索引的映射和设置。ES自定义索引模板可以用于创建和管理Elasticsearch索引,以及定义索引字段类型、分析、滤器等。 使用方法 使用ES自定义索引模板进行开发的方法如下: 创建索引模板 …

    other 2023年5月8日
    00
  • layerconfirm关闭事件

    以下是关于“layerconfirm关闭事件”的完整攻略: layerconfirm关闭事件 layerconfirm是一种常用的JavaScript弹窗插件,用于显示确认对话框。当用户点击确认或取消按钮时,layerconfirm会触发相应的事件。其中,关闭事件是指用户关闭对话框时触发的事件。如果您想在layerconfirm关闭事件中执行一些操作,可以按…

    other 2023年5月6日
    00
  • vim编辑器的.回退操作

    Vim编辑器的.回退操作攻略 Vim是一款流行的文本编辑器,具有强大的编辑功能和快捷键。其中,.命令可以重复上一次编辑操作,是Vim编辑器中非常有用的命令之一。以下是详细的攻略: 步骤 以下是在Vim编辑器中使用.命令进行回退操作的步骤: 打开Vim编辑器。 在使用.命令进行回退操作之前,需要先打开Vim编辑器。 进行编辑操作。 在Vim编辑器中,可以进行各…

    other 2023年5月7日
    00
  • C#操作INI配置文件示例详解

    下面是详细的“C#操作INI配置文件示例详解”攻略。 什么是INI文件? INI文件是一种简单的文本文件,它通常用于存储程序的配置信息。INI文件由若干个节组成,每个节中包含若干个键值对,键值对用等号连接,例如: [Database] Server=127.0.0.1 Port=3306 Username=root Password=123456 C#如何操…

    other 2023年6月25日
    00
  • 在ASP.NET 2.0中操作数据之三十二:数据控件的嵌套

    数据控件的嵌套是ASP.NET中常用的一种数据绑定方式。通过在一个控件的ItemTemplate或EditItemTemplate中嵌套一个或多个数据控件,可以实现对不同类型数据的同时编辑和显示。本文将通过示例详细讲解数据控件的嵌套。 一、实例说明 1. 实例一:GridView控件中嵌套DetailsView控件 GridView控件中嵌套DetailsV…

    other 2023年6月27日
    00
  • win10无法连接网络怎么办?Win10提示无法连接此网络的原因与解决方案

    Win10无法连接网络怎么办? 确定网络连接问题类型 首先,我们需要确定无法连接网络的问题类型,比如是无法连接无线网络还是有线网络。如果是无线网络,则需要确定是连接不上某一个网络还是所有无线网络都无法连接。 检查网络硬件设备 如果问题出现在无线网络中,我们可以先检查一下无线路由器或者热点的硬件是否工作正常。可以尝试用其它设备测试该网络是否正常,这样就可以确认…

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