You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 23:54:05