没有完全的理解,但是怎么说呢,好歹算是实现了。
简单在页面中有一个图片,长按图片的时候呢就会触发菜单的显示。
效果图
一个带有长按功能的按钮
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
}