YTDiaLogComp.ets 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. import { YTDiaLogModel } from '../../models/YTDiaLogModel'
  2. import { yTRouter } from '../../utils/YTRouter'
  3. @ComponentV2
  4. export struct YTDiaLogComp {
  5. @Local _offset: Length = '0%'
  6. @Local _opacity: number = 0
  7. // 弹窗的位置: 底部,中间。(均有对应的动画)
  8. @Require @Param Align: YTDiaLogModel = YTDiaLogModel.Bottom
  9. // 是否返回
  10. @Require @Param isBack: boolean
  11. // 弹窗的内容
  12. @BuilderParam _content: () => void
  13. // 重新返回方法
  14. @Event _onPop: () => void = () => {
  15. yTRouter.pop('', false)
  16. }
  17. @Monitor('isBack')
  18. fatherIsBack(){
  19. setTimeout(() => {
  20. this._onBackPress()
  21. }, 0)
  22. }
  23. private _onBackPress(ans?: string | boolean) {
  24. animateToImmediately({
  25. duration: 300
  26. }, () => {
  27. if(this.Align === YTDiaLogModel.Bottom) {
  28. this._offset = '0%'
  29. } //else {
  30. this._opacity = 0
  31. // }
  32. })
  33. setTimeout(() => {
  34. this._onPop()
  35. }, 250)
  36. return true
  37. }
  38. private _onAppear(){
  39. animateToImmediately({
  40. duration: 350
  41. }, () => {
  42. this._offset = '-100%'
  43. this._opacity = 1
  44. })
  45. }
  46. private getAlign(): FlexAlign{
  47. if(this.Align === YTDiaLogModel.Center) return FlexAlign.Center
  48. else if (this.Align === YTDiaLogModel.Bottom) return FlexAlign.End
  49. return FlexAlign.Center
  50. }
  51. aboutToAppear(): void {
  52. if(this.Align === YTDiaLogModel.Center) this._offset = '-100%'
  53. }
  54. build() {
  55. NavDestination() {
  56. Column() {
  57. Column()
  58. .height('50%')
  59. .width("100%")
  60. .backgroundColor('rgba(0, 0, 0, 0.5)')
  61. Column(){
  62. Column(){
  63. if(this._content) {
  64. this._content()
  65. }
  66. }
  67. .onClick(() => {})
  68. .scale(this.Align === YTDiaLogModel.Center ? { x: this._opacity, y: this._opacity, centerX:'50%', centerY:'75%' } : null)
  69. }
  70. .width('100%')
  71. .height('50%')
  72. .justifyContent(this.getAlign())
  73. .backgroundColor('rgba(0, 0, 0, 0.5)')
  74. .alignItems(HorizontalAlign.Center)
  75. .onClick(() => {
  76. this._onBackPress()
  77. })
  78. }
  79. .height('200%')
  80. .width("100%")
  81. .offset({
  82. y: this._offset
  83. })
  84. .opacity(this._opacity)
  85. .onAppear(() => { this._onAppear() })
  86. }
  87. .hideTitleBar(true)
  88. .mode(NavDestinationMode.DIALOG)
  89. .systemTransition(NavigationSystemTransitionType.NONE)
  90. .onBackPressed(() => {
  91. return this._onBackPress()
  92. })
  93. }
  94. }