在 Android 中,BottomSheet 通常用于顯示額外的內容或操作選項。要處理 BottomSheet 的滾動事件,您需要使用 CoordinatorLayout
和自定義的 Behavior
類。以下是一個簡單的示例,說明如何處理 BottomSheet 的滾動事件:
CoordinatorLayout
,并在其中添加您的 BottomSheet 和其他視圖。例如:<androidx.coordinatorlayout.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/coordinator_layout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<!-- Your main content view -->
<FrameLayout
android:id="@+id/main_content"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<!-- Your BottomSheet view -->
<LinearLayout
android:id="@+id/bottom_sheet"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_behavior="com.google.android.material.bottomsheet.BottomSheetBehavior">
<!-- Add your BottomSheet content here -->
</LinearLayout>
</androidx.coordinatorlayout.widget.CoordinatorLayout>
Behavior
類,繼承自 BottomSheetBehavior
,并重寫 onInterceptTouchEvent
和 onTouchEvent
方法。例如:import android.content.Context;
import android.util.AttributeSet;
import androidx.coordinatorlayout.widget.CoordinatorLayout;
import com.google.android.material.bottomsheet.BottomSheetBehavior;
public class CustomBottomSheetBehavior<V extends View> extends BottomSheetBehavior<V> {
public CustomBottomSheetBehavior(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public boolean onInterceptTouchEvent(CoordinatorLayout parent, V child, MotionEvent event) {
// 在這里處理滾動事件
// 返回 true 或 false 以決定是否攔截事件
return super.onInterceptTouchEvent(parent, child, event);
}
@Override
public boolean onTouchEvent(CoordinatorLayout parent, V child, MotionEvent event) {
// 在這里處理觸摸事件
// 返回 true 或 false 以決定是否處理事件
return super.onTouchEvent(parent, child, event);
}
}
Behavior
設置為您剛剛創建的自定義 Behavior
。例如:import androidx.coordinatorlayout.widget.CoordinatorLayout;
import com.google.android.material.bottomsheet.BottomSheetBehavior;
// ...
CoordinatorLayout coordinatorLayout = findViewById(R.id.coordinator_layout);
LinearLayout bottomSheet = findViewById(R.id.bottom_sheet);
CustomBottomSheetBehavior<LinearLayout> customBehavior = new CustomBottomSheetBehavior<>(this, null);
customBehavior.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() {
@Override
public void onStateChanged(@NonNull View bottomSheet, int newState) {
// 在這里處理 BottomSheet 狀態變化
}
@Override
public void onSlide(@NonNull View bottomSheet, float slideOffset) {
// 在這里處理 BottomSheet 滑動事件
}
});
bottomSheet.setLayoutParams(new CoordinatorLayout.LayoutParams(
CoordinatorLayout.LayoutParams.MATCH_PARENT,
customBehavior.getBottomSheetHeight()));
bottomSheet.setBehavior(customBehavior);
現在,您可以在自定義的 Behavior
類中的 onInterceptTouchEvent
和 onTouchEvent
方法中處理滾動事件。