PlayerPage.ets 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. import { deviceInfo } from '@kit.BasicServicesKit'
  2. import { hdsEffect } from '@kit.UIDesignKit'
  3. @Component
  4. export struct PlayerPage {
  5. // 播放页拖拽关闭时的位移状态,由 LocalMusic 统一维护,页面只负责消费。
  6. @Prop translateY: number = 0
  7. // 是否启用播放页背景流光效果,避免页面组件反向依赖 LocalMusic 的实现细节。
  8. @Prop enableBackgroundEffect: boolean = false
  9. // 是否显示背景流光效果,和启用开关拆开,便于后续继续裁剪状态依赖。
  10. @Prop showBackgroundEffect: boolean = false
  11. // 背景流光控制器仍然由 LocalMusic 持有,独立页面只做承载。
  12. @Prop bgController: hdsEffect.ShaderEffectController | undefined = undefined
  13. // 页面拖拽和销毁清理动作通过回调下沉给 LocalMusic,保证业务状态仍在一个地方维护。
  14. onPanUpdate: (event?: GestureEvent) => void = (_event?: GestureEvent): void => {}
  15. onPanEnd: (event?: GestureEvent) => void = (_event?: GestureEvent): void => {}
  16. onDisappearCleanup: () => void = (): void => {}
  17. // 实际播放器内容由外部 builder 传入,这样播放页文件独立后还能平滑迁移剩余内容。
  18. @BuilderParam contentBuilder: () => void
  19. build() {
  20. Column() {
  21. // 播放页只负责壳层结构,内部内容逐步从 LocalMusic 迁移。
  22. this.contentBuilder()
  23. }
  24. .transition(TransitionEffect.asymmetric(
  25. TransitionEffect.opacity(1),
  26. TransitionEffect.OPACITY
  27. ))
  28. .visualEffect(this.enableBackgroundEffect && this.showBackgroundEffect && deviceInfo.sdkApiVersion >= 20 &&
  29. this.bgController
  30. ? new hdsEffect.HdsEffectBuilder()
  31. .shaderEffect({
  32. effectType: hdsEffect.EffectType.UV_BACKGROUND_FLOW_LIGHT,
  33. animation: {
  34. duration: 10000,
  35. iterations: -1,
  36. autoPlay: true,
  37. onFinish: () => {
  38. console.info('Succeeded in finishing')
  39. }
  40. },
  41. controller: this.bgController,
  42. })
  43. .buildEffect()
  44. : undefined)
  45. .height('100%')
  46. .width('100%')
  47. .onDisAppear(() => {
  48. // 页面消失时统一回调外部清理拖拽中间态,避免残留到下一次打开。
  49. this.onDisappearCleanup()
  50. })
  51. .translate({ y: this.translateY })
  52. .gesture(
  53. // 播放页的关闭/切歌手势放在独立页面里承载,但具体业务判断仍交给 LocalMusic。
  54. PanGesture()
  55. .onActionUpdate((event?: GestureEvent) => {
  56. this.onPanUpdate(event)
  57. })
  58. .onActionEnd((event?: GestureEvent) => {
  59. this.onPanEnd(event)
  60. })
  61. )
  62. }
  63. }