△ 书本模式于桌面模式的判定条件
FoldingFeature 中还包含窗口中的折叠位置 , 当折叠导致内容视图被割裂时 , 我们应该及时更新布局参数 。 您可以做些调整 , 比如将支持面板置于一侧 , 或者在折叠的上半部分展示主页横幅 。 首先 , 我们需要知道内容视图在窗口中的位置 , 通过 getLocationInWindow 可以获取位置信息 。 我们将使用这些坐标以及宽度和高度创建一个 Rect 对象 , 这样我们便得到了窗口坐标空间中的视图边界 。
FoldingFeature 给出了在窗口的坐标空间中的折叠边界 , 因此我们可以直接检查这两个区域是否相交 , 如果相交 , 我们可以将 featureRect 的边界转换为视图的坐标空间并将其返回 。 顺便说一下 , 如果您使用 SlidingPaneLayout 来实现列表 / 详情布局 , 您会自动获得对书本模式的支持 。 只要两个窗格都能容纳进去 , SlidingPaneLayout 会将窗格置于折叠姿态的另一侧 。
fun getFoldBoundsInView( foldingFeature: FoldingFeature, view: View ): Rect? { // 获取视图在窗口坐标空间中的边界 val viewLocation = IntArray(2) view.getLocationInWindow(viewLocation) val (viewX, viewY) = viewLocation val viewRect = Rect( left = viewX, top = viewY right = viewX + view.width, bottom = view + view.height ) … //显示功能的边界已经在窗口的坐标空间中 // 检查 view 的边界和显示功能的边界是否相交 val featureRect = Rect(foldingFeature.bounds) val intersects = featureRect. intersect (viewRect) if (featureRect.isEmpty || ! intersects) return null } // 将功能的边界坐标转换为 view 的坐标空间 featureRect.offset(-viewX, -viewY) return featureRect }
△ 获取折叠的位置信息
测试
如果您的应用存在与折叠状态相关的特殊行为 , 您需要为此编写单元测试 。 Jetpack Window Manager 里面有一条测试规则 , 支持在插桩测试期间模拟 FoldingFeature 。 由于测试需用到视图 , 我们添加了 WindowLayoutInfoPublisherRule , 以及 ActivityScenarioRule , 两者一起组成了一个测试规则链 。 在该测试方法中 , 我们通过 activityRule 获取 Activity , 然后创建窗口特性来模拟桌面模式 , 构建 WindowLayoutInfo 对象并使用 publisherRule 发布该对象 。 之后 , 我们可以使用 Espresso 和 JUnit 断言来检查 Activity 在桌面模式下能否正常运行 。
private val publisherRule = WindowLayoutInfoPublisherRule private val activityRule = ActivityScenarioRule (MyActivity: :class.java) @get :Rule val testRule = RuleChain.outerRule (publisherRule) .around(activityRule) @Test fun testDeviceOpen_TableTop: Unit = testScope.runBlockingTest { activityRule.scenario.onActivity { activity -> val feature = FoldingFeature (activity, HALF_OPENED, HORIZONTAL) val testWindowInfo = WindowLayoutInfo.Builder( ) .setDisplayFeatures (listOf (feature)) .build publisherRule.overrideWindowLayoutInfo(testWindowInfo) } // 编写基于桌面模式的断言 }
△ 测试折叠状态
界面测试存在一定难度 , 因为有些测试须在特定设备上进行 。 为此 , Android Studio 正在增加对 Gradle 托管的虚拟设备的支持 。 您可以使用 7.1 及以上版本的 Android Gradle 插件来体验该功能 。
在应用级的 build.gradle 文件中的 testOptions 模块下 , 指定虚拟设备配置文件 , 就像您平时在 Android Studio 管理和运行虚拟设备那样 。 例如 , 这里使用的是 Pixel C 平板电脑镜像 , 接下来 Gradle 会创建能够在指定设备上执行测试的目标 , 甚至还能根据需要下载设备镜像 。
android { testoptions { devices { pixelCapi30 (ManagedVirtualDevice) { device = "Pixel C" // 平板电脑设备 apilevel = 30 systemImageSource = "aosp" // 如需 GooglePlay 服务 , 使用“google” abi = "x86” } } } } #Gradle target = {device name} + {build variant} + "AndroidTest" ./gradlew pixelCapi30debugAndroidTest
特别声明:本站内容均来自网友提供或互联网,仅供参考,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
