1 /* 2 * Copyright 2024 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package androidx.compose.foundation.gestures 18 19 import androidx.compose.runtime.Stable 20 21 /** Interface to specify fling behavior with additional information about its animation target. */ 22 @Stable 23 interface TargetedFlingBehavior : FlingBehavior { 24 25 /** 26 * Perform settling via fling animation with given velocity and suspend until fling has 27 * finished. Use [onRemainingDistanceUpdated] to report the status of the ongoing fling 28 * animation and the remaining amount of scroll offset. 29 * 30 * This functions is called with [ScrollScope] to drive the state change of the 31 * [androidx.compose.foundation.gestures.ScrollableState] via [ScrollScope.scrollBy]. 32 * 33 * This function must return the correct velocity left after it is finished flinging in order to 34 * guarantee proper nested scroll support. 35 * 36 * @param initialVelocity velocity available for fling in the orientation specified in 37 * [androidx.compose.foundation.gestures.scrollable] that invoked this method. 38 * @param onRemainingDistanceUpdated a lambda that will be called anytime the distance to the 39 * settling offset is updated. The settling offset in pixels is passed to this lambda an it 40 * represents the final offset where this fling will stop and may change depending on the 41 * snapping animation progression. 42 * @return remaining velocity after fling operation has ended 43 */ performFlingnull44 suspend fun ScrollScope.performFling( 45 initialVelocity: Float, 46 onRemainingDistanceUpdated: (Float) -> Unit 47 ): Float 48 49 override suspend fun ScrollScope.performFling(initialVelocity: Float): Float = 50 performFling(initialVelocity, NoOnReport) 51 } 52 53 private val NoOnReport: (Float) -> Unit = {} 54