ลาก ปัด และสะบัด

draggable ตัวแก้ไขคือจุดแรกเข้าระดับสูงที่จะลากท่าทางสัมผัสในการวางแนวเดียว และรายงานระยะทางการลากเป็นพิกเซล

โปรดทราบว่าตัวแก้ไขนี้คล้ายกับ scrollable ตรงที่ ตรวจจับเฉพาะท่าทางสัมผัสเท่านั้น คุณต้องคงสถานะไว้และแสดงบนหน้าจอ ตัวอย่างเช่น การย้ายองค์ประกอบผ่าน offset ตัวปรับแต่ง:

@Composable
private fun DraggableText() {
    var offsetX by remember { mutableStateOf(0f) }
    Text(
        modifier = Modifier
            .offset { IntOffset(offsetX.roundToInt(), 0) }
            .draggable(
                orientation = Orientation.Horizontal,
                state = rememberDraggableState { delta ->
                    offsetX += delta
                }
            ),
        text = "Drag me!"
    )
}

หากต้องการควบคุมท่าทางสัมผัสการลากทั้งหมด ให้ลองใช้การลาก ตัวตรวจจับท่าทางสัมผัสแทน ผ่าน pointerInput แป้นกดร่วม

@Composable
private fun DraggableTextLowLevel() {
    Box(modifier = Modifier.fillMaxSize()) {
        var offsetX by remember { mutableStateOf(0f) }
        var offsetY by remember { mutableStateOf(0f) }

        Box(
            Modifier
                .offset { IntOffset(offsetX.roundToInt(), offsetY.roundToInt()) }
                .background(Color.Blue)
                .size(50.dp)
                .pointerInput(Unit) {
                    detectDragGestures { change, dragAmount ->
                        change.consume()
                        offsetX += dragAmount.x
                        offsetY += dragAmount.y
                    }
                }
        )
    }
}

องค์ประกอบ UI ที่กำลังถูกลากด้วยนิ้วมือกด

การเลื่อน

swipeable ตัวแก้ไขช่วยให้คุณลากองค์ประกอบต่างๆ ซึ่งเมื่อปล่อยแล้วจะเคลื่อนไหวไปยัง จุดยึดสองจุดขึ้นไปที่กำหนดไว้ในการวางแนว การใช้งานทั่วไปในกรณีนี้คือ เพื่อใช้รูปแบบ "ปัดเพื่อปิด"

สิ่งสำคัญที่ควรทราบคือตัวแก้ไขนี้จะไม่ย้ายองค์ประกอบ เพียงแต่ย้ายองค์ประกอบ ตรวจจับท่าทางสัมผัส คุณต้องคงสถานะไว้และแสดงบนหน้าจอโดย เช่น การย้ายองค์ประกอบผ่าน offset แป้นกดร่วม

ต้องมีสถานะแบบปัดได้ในตัวปรับแต่ง swipeable และจะสร้างได้ และจดจำด้วย rememberSwipeableState() สถานะนี้ยังให้วิธีการที่เป็นประโยชน์ในการสร้างภาพเคลื่อนไหวแบบเป็นโปรแกรม Anchor (ดู snapTo animateTo, performFling, และ performDrag) รวมถึงพร็อพเพอร์ตี้ต่างๆ สำหรับดูความคืบหน้าของการลากด้วย

ท่าทางสัมผัสการปัดสามารถกำหนดค่าให้มีประเภทเกณฑ์ที่แตกต่างกันได้ เช่น FixedThreshold(Dp) และ FractionalThreshold(Float), และสามารถแตกต่างกันไปตามจุดยึดแต่ละจุด

เพื่อให้มีความยืดหยุ่นมากขึ้น คุณสามารถกำหนดค่า resistance เมื่อเลื่อนผ่าน ขอบเขต รวมถึง velocityThreshold ซึ่งจะเคลื่อนไหวการปัดไปยัง ไปยังสถานะถัดไป แม้ว่าจะยังไม่ถึงตำแหน่ง thresholds

@OptIn(ExperimentalMaterialApi::class)
@Composable
private fun SwipeableSample() {
    val width = 96.dp
    val squareSize = 48.dp

    val swipeableState = rememberSwipeableState(0)
    val sizePx = with(LocalDensity.current) { squareSize.toPx() }
    val anchors = mapOf(0f to 0, sizePx to 1) // Maps anchor points (in px) to states

    Box(
        modifier = Modifier
            .width(width)
            .swipeable(
                state = swipeableState,
                anchors = anchors,
                thresholds = { _, _ -> FractionalThreshold(0.3f) },
                orientation = Orientation.Horizontal
            )
            .background(Color.LightGray)
    ) {
        Box(
            Modifier
                .offset { IntOffset(swipeableState.offset.value.roundToInt(), 0) }
                .size(squareSize)
                .background(Color.DarkGray)
        )
    }
}

องค์ประกอบ UI ที่ตอบสนองต่อท่าทางสัมผัสการปัด