Google I/O: los últimos cambios en la interfaz de usuario de Android Jetpack (3)

prefacio

Esta serie de artículos lo lleva a comprender el contenido más reciente de Jetpack en esta E/S desde las cuatro direcciones de arquitectura, interfaz de usuario, rendimiento y composición.

Este artículo es el tercer artículo: artículos de interfaz de usuario.

1. Administrador de ventanas

Este no es el WindowManager que obtuvo el sistema WMS, es un nuevo miembro de Jetpack, que acaba de ingresar a 1.1.0.

implementation "androidx.window:window:1.1.0-alpha02"
复制代码

Puede ayudarnos a adaptarnos al creciente número de dispositivos plegables y satisfacer las necesidades de desarrollo en un entorno de múltiples ventanas. Los dispositivos plegables generalmente se dividen en dos categorías: dispositivos plegables de pantalla única (una pantalla flexible integral) y dispositivos plegables de pantalla doble (dos pantallas conectadas por una bisagra).

En la actualidad, los dispositivos plegables de una sola pantalla se están convirtiendo gradualmente en la corriente principal, pero no importa qué dispositivo pueda percibir las características de visualización de la pantalla actual, como el estado y la postura de plegado actuales, a través de WindowManager.

obtener estado colapsado

En los dispositivos de pantallas múltiples, una ventana puede mostrarse en pantallas físicas, de modo que las partes discontinuas, como las bisagras, aparecerán en la ventana. La ubicación precisa nos ayuda a evitar colocar botones de interacción clave allí. Además, FoldingFeature también proporciona una API que puede percibir el estado de plegado actual y podemos cambiar el diseño de la aplicación de acuerdo con estos estados:

//铰链处于半开状态且位置水平,适合切换到平板模式
fun isTableTopMode(foldFeature: FoldingFeature) =
    foldFeature.isSeparating &&
            foldFeature.orientation == FoldingFeature.Orientation.HORIZONTAL
//铰链处于半开状态且位置垂直,适合切换到阅读模式
fun isBookMode(foldFeature: FoldingFeature) =
    foldFeature.isSeparating &&
            foldFeature.orientation == FoldingFeature.Orientation.VERTICAL
复制代码
esTableTopMode esModoLibro

WindowManager nos permite observar continuamente cambios en las características de visualización a través de Flow.

lifecycleScope.launch(Dispatchers.Main) {
    lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED) {
        WindowInfoTracker.getOrCreate(this@SampleActivity)
            .windowLayoutInfo(this@SampleActivity)
            .collect { newLayoutInfo ->
                // Use newLayoutInfo to update the layout.
            }
    }
}
复制代码

Como antes, cuando cambia la función de visualización, podemos obtener newLayoutInfo, que es un tipo de WindowLayoutInfo que contiene información de FoldingFeature internamente.

Detección de cambios en el tamaño de la ventana

La ventana de la aplicación puede cambiar cuando cambia la configuración del dispositivo (como la expansión y rotación de la pantalla plegable, o la ventana cambia de tamaño en el modo de ventanas múltiples). Podemos obtener el tamaño de la ventana a través de WindowMetrics de WIndowManger. Tenemos dos formas para obtener las WindowMetrics actuales, la adquisición síncrona y la escucha asíncrona:

//异步监听
lifecycleScope.launch(Dispatchers.Main) {
    windowInfoRepository().currentWindowMetrics.flowWithLifecycle(lifecycle)
        .collect { windowMetrics: WindowMetrics ->
           val currentBounds = windowMetrics.bounds 
           val width = currentBounds.width()
           val height = currentBounds.height()
        }
}

//同步获取
val windowMetrics = WindowMetricsCalculator.getOrCreate().computeCurrentWindowMetrics(activity)
val currentBounds = windowMetrics.bounds 
val width = currentBounds.width()
val height = currentBounds.height()
复制代码

Más referencias: medium.com/androiddeve…

2. Arrastrar y soltar

Jetpack DragAndDrop es una biblioteca dedicada a manejar gestos de arrastrar y soltar. Además de servir para el desarrollo en dispositivos móviles normales, el significado más importante es que puede realizar arrastrar y soltar en pantallas de dispositivos plegables.

implementation 'androidx.draganddrop:draganddrop:1.0.0-alpha02'
复制代码

DragStartHelper y DropHelper son sus API principales, que pueden configurar la transferencia de datos y los efectos de visualización durante el proceso de prevención de arrastre, y también pueden monitorear las devoluciones de llamadas de gestos.

Arrastrar DragStartHelper

DragStartHelper es responsable de monitorear el tiempo de inicio de los gestos de arrastre, incluida la pulsación prolongada para arrastrar, hacer clic y arrastrar con el mouse, etc. Podemos envolver el objeto de vista que necesita ser arrastrado y comenzar a escuchar. Al escuchar el disparador del gesto de arrastrar, podemos completar una configuración simple.

// 使用 DragStartHelper 包装 draggableView 对象
DragStartHelper(draggableView) { view, _ ->
    // 将需要传递的数据封装到 ClipData 中
    val dragClipData = ClipData.newUri(contentResolver, "File", fileUri)
    // 创建目标拖动时的展示图片,可自定义也可以根据 draggableView 创建默认样式
    val dragShadow = View.DragShadowBuilder(view)
    // 基于数据、拖动效果启动拖动
    view.startDragAndDrop(
        dragClipData,
        dragShadow,
        null, // Optional extra local state information
        // 添加 flag 启动全局拖动
        DRAG_FLAG_GLOBAL or DRAG_FLAG_GLOBAL_URI_READ)
    )
}.attach()
复制代码

Como arriba, listo para arrastrar datos y estilos, etc., llame a View#startDragAndDrop para iniciar el arrastre. El destino de arrastre en el ejemplo es el contenido: URI, por lo que podemos arrastrar entre procesos configurando DRAG_FLAG_GLOBAL.

Colocar DropHelper

DropHelper es otra API central que se preocupa por cuándo se sueltan los datos arrastrados y la vista de destino.

//针对可拖放视图调用 configureView
DropHelper.configureView(
    this,// 当前Activity
    outerDropTarget, //接收拖放的对象,会根据情况高亮显示
    arrayOf(MIMETYPE_TEXT_PLAIN, "image/*"), // 支持的 MIME 类型
    DropHelper.Options.Builder() //一些参数配置,例如放下时高亮的颜色,视图范围等
        .addInnerEditTexts(innerEditText)
        .build()
) { _, payload ->
  // 监听到目标的放下,可以从 ClipData 中取得数据,
  // 执行上传、显示等处理,当然还可以处理非法拖放时的警告或视图提醒等
  ...
}
复制代码

Al crear una instancia de DropHelper.Options, debe llamar a addInnerEditTexts() para asegurarse de que los controles EditText anidados no tomen el foco de vista.

Más referencias: medium.com/androiddeve…

Supongo que te gusta

Origin juejin.im/post/7098146554787135518
Recomendado
Clasificación