分屏适配文档

来自Flyme开放平台
跳转至: 导航搜索

分屏功能是flyme5开发的新功能,入口是多任务卡片上方创建分屏按钮

进入分屏对于应用来说,是显示区域大小和位置的变化,并且分屏过程中,可以动态调整应用的大小。

因此有此文档,用于应用适配,判断是否处于分屏模式和当前activity处于屏幕的位置占用大小

1、 主动式查询:
分屏是针对activity的,所以查询是以activity为单位。 
只能查询某activity当前是否处于分屏状态,分屏中位于屏幕中的位置和占用屏幕尺寸大小。 
方法如下: 

1. 获取Activity处于分屏中位置和大小
import meizu.splitmode.FlymeSplitModeManager;
...
boolean isSplit = false;
Rect rect = new Rect();
Activity activity = this;
isSplit = FlymeSplitModeManager.getInstance(activity).getActivitySplitRect(activity, rect);

isSplit是返回该activity是否处于分屏,rect是写入该activity分屏位于屏幕的位置和大小。
注意:rect不可为空,否则返回false。

2. 获取当前顶层界面是否处于分屏
import meizu.splitmode.FlymeSplitModeManager;
...
boolean isSplitMode = false;
isSplitMode = FlymeSplitModeManager.getInstance(activity).isSplitMode();

2、 被动式通知:

横竖屏转换、动态调整分屏大小,都是导致activity显示区域变化,这个状态变化类似于转屏操作。  
因此,我们使用原生回调方法onConfigurationChanged来通知应用size变化。

当满足以上两种情况时(分屏中横竖屏转换、分屏中拖动杆变化分屏大小),会回调Activity的onConfigurationChanged方法。
参数Configuration对象的screenWidthDp和screenHeightDp,用于记录变化后尺寸,dp单位。

PS:onConfigurationChanged回调的条件是:
AndroidManifest.xml中<activity>需要定义android:configChanges=screenSize|orientation,否则无效。


3、禁用拖动杆改变窗口大小

对于某些界面不希望被变化大小,可以通过以下方法禁用:
FlymeSplitModeManager.getInstance(context).disableResize(activity)。
使用这个接口可以禁用参数activity所在界面的界面变化,退出或新进activity该接口都会失效。

所以建议在需要禁用调整大小的activity生命周期onResumed里调用该方法。

4、反射调用实例:

Class<?> clazz = Class.forName("meizu.splitmode.FlymeSplitModeManager");
Method b = clazz.getMethod("getInstance", Context.class);
Object instance = b.invoke(null, MainActivity.this);
Method m = clazz.getMethod("isSplitMode");
boolean result = (boolean) m.invoke(instance);
    boolean result = false;
    try {
        Class<?> clazz = Class.forName("meizu.splitmode.FlymeSplitModeManager");
        Method b = clazz.getMethod("getInstance", Context.class);
        Object instance = b.invoke(null, activity);
        Method m = clazz.getMethod("getActivitySplitRect", Activity.class, Rect.class);
        result = (boolean) m.invoke(instance, activity, rect);
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    } catch (InvocationTargetException e) {
        e.printStackTrace();
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    } catch (NoSuchMethodException e) {
        e.printStackTrace();
    }

导航菜单