CustomDialog不支持自定义动画

位于页面底部的弹窗,需要实现从下往上的滑入效果和从上往下的滑出效果,目前弹窗的动画效果固定只能修改既定动画的参数。

HarmonyOS
2024-09-29 13:35:07
浏览
收藏 0
回答 2
待解决
回答 2
按赞同
/
按时间
鱼弦CTO
1

在Flutter中实现自定义动画的弹窗,尤其是从底部滑入和滑出的效果,可以使用​​showModalBottomSheet​​​并自定义其动画。通过组合 ​​PageRouteBuilder​​​ 和 ​​SlideTransition​​ 来实现你的需求。

以下是一个示例代码,展示了如何实现从下往上滑入、从上往下滑出效果的自定义弹窗:

import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: CustomDialogExample(),
    );
  }
}

class CustomDialogExample extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text("Custom Dialog Example")),
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            showCustomBottomSheet(context);
          },
          child: Text("Show Bottom Sheet"),
        ),
      ),
    );
  }

  void showCustomBottomSheet(BuildContext context) {
    showGeneralDialog(
      context: context,
      barrierLabel: "Barrier",
      barrierDismissible: true,
      barrierColor: Colors.black.withOpacity(0.5),
      transitionDuration: Duration(milliseconds: 300),
      pageBuilder: (_, __, ___) {
        return Align(
          alignment: Alignment.bottomCenter,
          child: CustomBottomSheetContent(),
        );
      },
      transitionBuilder: (context, animation, secondaryAnimation, child) {
        final curvedValue = Curves.easeInOut.transform(animation.value) - 1.0;
        return Transform(
          transform: Matrix4.translationValues(0.0, curvedValue * 300, 0.0),
          child: Opacity(
            opacity: animation.value,
            child: child,
          ),
        );
      },
    );
  }
}

class CustomBottomSheetContent extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Container(
      height: 300,
      decoration: BoxDecoration(
        color: Colors.white,
        borderRadius: BorderRadius.vertical(top: Radius.circular(20)),
      ),
      child: Column(
        mainAxisSize: MainAxisSize.min,
        children: <Widget>[
          SizedBox(height: 20),
          Text(
            "This is a custom bottom sheet",
            style: TextStyle(fontSize: 24),
          ),
          SizedBox(height: 20),
          ElevatedButton(
            onPressed: () => Navigator.of(context).pop(),
            child: Text("Close"),
          ),
        ],
      ),
    );
  }
}

在这个示例中,我们实现了:

  1. showGeneralDialog​:用来显示自定义动画的对话框。它允许我们自定义过渡动画。
  2. transitionBuilder​​:定义了滑入和滑出动画。在这里,我们使用​​Transform​​ 和​​Opacity​​ 实现动画效果,使得对话框从底部滑入和滑出。
  3. CustomBottomSheetContent​:弹窗内容的自定义部分,你可以根据需要进行修改。

通过上述方法,你可以灵活地创建具有自定义动画效果的弹窗,满足从下往上滑入和从上往下滑出的需求。如果有进一步的问题或其他需求,欢迎随时提问!

分享
微博
QQ
微信
回复
2024-09-29 13:54:36
zxjiu

使用customStyle设置弹窗容器样式

参考demo:

import { CustomDialogExample } from './Dialog'  
@Entry  
@Component  
struct CustomDialogPage {  
  @State isAutoCancel: boolean = true;  
  dialogController: CustomDialogController = new CustomDialogController({  
    builder: CustomDialogExample({ isAutoCancel: this.isAutoCancel }),  
    autoCancel: this.isAutoCancel,  
    customStyle: true  
  })  
  
  build() {  
    Row() {  
      Column() {  
        Button('click me')  
          .onClick(() => {  
            this.dialogController.open()  
          })  
      }.width('100%')  
    }  
    .height('100%')  
  }  
}  
@CustomDialog  
export struct CustomDialogExample {  
  controller: CustomDialogController  
  @State showFlag: Visibility = Visibility.Visible;  
  @State isAutoCancel: boolean = false;  
  
  build() {  
    Column() {  
      Row() {  
        Text('this is customDialog').fontSize(20)  
      }  
      .padding(8)  
      .backgroundColor('#FFFFFF')  
      .height(200)  
      .margin({ bottom: -5 })  
      .width("100%")  
    }  
    .justifyContent(FlexAlign.End)  
    .width("100%")  
    .height("100%")  
    .margin({  
      bottom: -15  
    })  
    .onClick(() => {  
      if (this.isAutoCancel) {  
        this.cancel();  
      }  
    })  
    .visibility(this.showFlag)  
    .transition(TransitionEffect.OPACITY.animation({ duration: 200 })  
      .combine(TransitionEffect.translate({ y: 100 })))  
  }  
  
  cancel() {  
    this.showFlag = Visibility.Hidden  
    setTimeout(() => {  
      this.controller.close()  
    }, 200)  
  }  
}
分享
微博
QQ
微信
回复
2024-09-29 18:24:37
相关问题
CustomDialog自定义动画
384浏览 • 1回复 待解决
HarmonyOS 自定义弹窗CustomDialog问题
589浏览 • 1回复 待解决
HarmonyOS 用CustomDialog自定义Dialog
233浏览 • 1回复 待解决
自定义弹窗自定义转场动画
1109浏览 • 1回复 待解决
弹窗打开、关闭动画是否支持自定义
2331浏览 • 1回复 待解决
HarmonyOS 自定义弹窗 (CustomDialog)问题
369浏览 • 1回复 待解决
web组件不支持localstorage
783浏览 • 1回复 待解决
http类不支持cancel方法
156浏览 • 1回复 待解决