Android 项目必备(四十二)-->Android 多窗口模式

简介

  • 自由窗口模式:
    该模式类似于常见的桌面操作系统, 应用界面的窗口可以自由的拖动和修改大小。

  • 分屏模式
    该模式可以在手机上使用, 该模式将屏幕一分为二, 同时显示两个应用界面。

  • 画中画模式:
    该模式主要用于TV, 在该模式下视频播放的窗口可以一直在最顶端显示。(视频小窗口)

详细请查看:Android 文档

准备

1. Manifest 新增属性

  • android:resizeableActivity="false"
    这个属性可以放置于 application 和 activity 的标签下, 作用在对应的区间里面。这个属性表示 application 或者 activity 在分屏或者 freeform 的模式启动, true 代表支持, false 代表不支持。

  • android:supportsPictureInPicture= "false"
    这个属性可以放置于 activity 的标签下, 这个属性表示 activity 是否支持画中画模式, true 代表支持, false 代表不支持。

2. 多窗口 API

  • isInMultiWindowMode(): 查询是否处于多窗口模式
  • isInPictureInPictureMode():查询是否处于画中画模式
  • Activity.onMultiWindowModeChanged() 多窗口模式变化时进行通知(进入或退出多窗口)
  • onPictureInPictureModeChanged() 画中画模式变化时进行通知(进入或退出画中画模式)
  • enterPictureInPictureMode() 调用这个接口进入画中画模式,如果系统不支持,这个调用无效
  • setLaunchBounds()在系统已经处于Freeform模式时,可以通过这个参数来控制新启动的Activity大小,如果系统不支持,这个调用无效。

实现

1. 效果图

在这里插入图片描述

2. 实现

  1. 在清单文件中申请权限
<uses-permission android:name="android.permission.INTERNET"/>
  1. 添加属性
<application
        ...
        android:resizeableActivity="true"
        android:usesCleartextTraffic="true"
        ...>
  1. 代码
public class MainActivity extends AppCompatActivity {

    private static final int WINDOWING_MODE_FREEFORM = 5;
    
    @SuppressLint("MissingInflatedId")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_main);

        findViewById(R.id.btn_open_one).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                showWindows("com.kjd.airecognition","com.kjd.airecognition.WebActivity");
            }
        });

        findViewById(R.id.btn_open_two).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                showWindows("com.kjd.gesturedemo","com.kjd.gesturedemo.PieActivity");
            }
        });


    }

    private void showWindows(String packageName,String classPath) {
        //获取屏幕高宽
        DisplayMetrics metric = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(metric);
        int screenWidth = metric.widthPixels;
        int screenHeight = metric.heightPixels;

        Intent intent = new Intent();
        intent.setClassName(packageName,classPath);

        intent.setFlags(Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT | Intent.FLAG_ACTIVITY_NEW_TASK);
        ActivityOptions activityOptions = null;
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
            activityOptions = ActivityOptions.makeBasic();
        }

        //设置为freeform模式
        try {
            Method method = ActivityOptions.class.getMethod("setLaunchWindowingMode", int.class);
            method.invoke(activityOptions, WINDOWING_MODE_FREEFORM);
        } catch (Exception e) {
            e.printStackTrace();
        }

        //freeform模式下自由窗口的大小
        int freeformWidth = 1200;
        int freeformHeight = 800;
        //居中显示
        int left = screenWidth / 2 - freeformWidth / 2;
        int top = screenHeight / 2 - freeformHeight / 2;
        int right = screenWidth / 2 + freeformWidth / 2;
        int bottom = screenHeight / 2 + freeformHeight / 2;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            activityOptions.setLaunchBounds(new Rect(left,top,right,bottom));
        }
        Bundle bundle = activityOptions.toBundle();
        startActivity(intent,bundle);
    }
}
  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Kevin-Dev

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值