Flutter 弹出菜单实现(不是显示的菜单按钮,隐式的)showMenu

隐式的菜单

  • 效果图
  • 代码实现

没有完全的理解,但是怎么说呢,好歹算是实现了。

效果图

简单在页面中有一个图片,长按图片的时候呢就会触发菜单的显示。

效果图

Flutter 弹出菜单实现(不是显示的菜单按钮,隐式的)showMenu_第1张图片

Flutter 弹出菜单实现(不是显示的菜单按钮,隐式的)showMenu_第2张图片

代码实现

一个带有长按功能的按钮

GestureDetector( //手势包含添加按钮 实现点击进行选择图片
                      child:Image.asset('images/addphoto.png'),
                      onLongPressStart: (LongPressStartDetails details) {
                        //setState(() {});
                        double globlePositionX = details.globalPosition.dx;//获取全局触摸到的x方向位置
                        double globlePositionY = details.globalPosition.dy - 20;//获取全局y方向当位置并且下移20,菜单一般需要显示在下面,而不是按着的位置
                        onLongPress(context,globlePositionX,globlePositionY);
                      },
                    );

具体显示的显示实现

  //长按触发弹出菜单
  void onLongPress(BuildContext context,double x,double y){//当添加图片当图片被点击时候
    final RenderBox? overlay = Overlay.of(context)?.context.findRenderObject() as RenderBox;//应该是找到容器,这个是抄PopupMenuButton里面抄来的
    
    RelativeRect position= RelativeRect.fromRect(Rect.fromLTRB(x, y, x+50, y-50),  Offset.zero & overlay!.size,); 
 //这里应该是画一个浮动在上面的一个相对矩形,第一个矩形的坐标是根据第二个矩形而言的。
 //第一个矩形我猜应该是显示的菜单可以放的矩形,这里我选择的是按照四个点的坐标来画一个矩形,之前不是拿到了手指点击的位置吗,然后我画来一个以那个位置为左上角的一个大小为50*50的矩形,其实菜单应该大于这个矩形的,可能自动扩大了吧(注意,我们的坐标其实是按照正常全局坐标的,所以我们的容器要按照正常坐标来)
//而第二个矩形应该是容器,也就是放第一个矩形的容器。这个容器这里设置的是按照正常坐标,也就是左上角为0.0,然后大小是之前找到的容器的大小

    PopupMenuItem popupMenuItem2=new PopupMenuItem(child: Text("图库"),value: 2,);
    PopupMenuItem popupMenuItem1=new PopupMenuItem(child: Text("拍照"),value: 1,);
    List> list=[popupMenuItem1,popupMenuItem2];//菜单栏需要显示的菜单项集合


    showMenu(context: context, position: position, items: list).then((value) {
      if(value==1){//根据value判断出到底点了哪个菜单
        _onImageButtonPressedTakePhoto(ImageSource.camera,context,imageQuality: 40);
      }
      if(value==2){
          _onImageButtonPressed(//执行打开相册
              ImageSource.gallery,
               context,
              imageQuality: 40,//图片压缩
            );
      }
    }
    );
    // PopupMenuButton
  }

你可能感兴趣的:(Flutter,flutter)