Android开发:如何实现Palette Fragment可上下拖拽调整功能
实现方案
你需要的上下拖拽调色板功能可通过Material组件库的BottomSheetBehavior实现,无需自定义触摸事件逻辑,具体修改步骤如下:
1. 修改根布局文件(main.xml)
将原有根布局LinearLayout替换为CoordinatorLayout(BottomSheetBehavior依赖该组件作为父容器),并给调色板容器添加底部面板属性:
<?xml version="1.0" encoding="utf-8"?> <androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent"> <FrameLayout android:id="@+id/canvasFragment" android:layout_width="match_parent" android:layout_height="match_parent" /> <FrameLayout android:id="@+id/paletteFragment" android:layout_width="match_parent" android:layout_height="wrap_content" app:layout_behavior="com.google.android.material.bottomsheet.BottomSheetBehavior" app:behavior_hideable="false" app:behavior_fitToContents="true" /> </androidx.coordinatorlayout.widget.CoordinatorLayout>
注:app:behavior_hideable="false"是禁止调色板被完全拖拽隐藏,你可以按需调整为true
2. 修正MainActivity逻辑
首先要把setContentView放在Fragment事务执行之前,否则会找不到容器ID报错;其次初始化BottomSheetBehavior,设置默认展开高度为屏幕的25%,适配不同设备:
package com.example.paint; import androidx.appcompat.app.AppCompatActivity; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentTransaction; import android.os.Bundle; import android.util.DisplayMetrics; import android.view.View; import com.google.android.material.bottomsheet.BottomSheetBehavior; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 先加载布局 setContentView(R.layout.activity_main); /**Canvas**/ Fragment canvasFragment = new CanvasFragment(); FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); transaction.replace(R.id.canvasFragment, canvasFragment); transaction.addToBackStack(null); transaction.commit(); /**Palette**/ Fragment paletteFragment = new PaletteFragment(); FragmentTransaction transaction2 = getSupportFragmentManager().beginTransaction(); transaction2.replace(R.id.paletteFragment, paletteFragment); transaction2.addToBackStack(null); transaction2.commit(); // 初始化BottomSheetBehavior View paletteContainer = findViewById(R.id.paletteFragment); BottomSheetBehavior<View> behavior = BottomSheetBehavior.from(paletteContainer); // 计算屏幕高度,设置默认展开高度为屏幕的25% DisplayMetrics displayMetrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(displayMetrics); int screenHeight = displayMetrics.heightPixels; behavior.setPeekHeight(screenHeight / 4); // 可选:设置最大展开高度为屏幕的75%,避免完全遮挡画布 behavior.setMaxHeight((int) (screenHeight * 0.75)); } }
3. 调整PaletteFragment继承关系
你当前是将调色板作为嵌入布局的普通Fragment使用,不需要继承BottomSheetDialogFragment,改为继承普通Fragment即可:
package com.example.paint; import android.os.Bundle; import androidx.fragment.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; public class PaletteFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment_palette, container, false); } }
依赖检查
如果编译报错找不到BottomSheetBehavior,请确认你已在Module级的build.gradle中添加Material组件依赖,且应用主题继承自Theme.MaterialComponents系列:
dependencies { implementation 'com.google.android.material:material:1.11.0' }
可选优化
- 可在Palette的布局顶部添加一个2dp高、20dp宽的灰色圆角条作为拖拽把手,提升用户操作感知
- 可通过
behavior.addBottomSheetCallback()监听拖拽状态,拖拽时临时禁用画布的绘制操作,避免误触
内容的提问来源于stack exchange,提问作者Fernando Albuquerque
相关产品推荐
相关产品推荐

