zsh2517

Untitled

Oct 13th, 2024
137
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /*
  2.  * Copyright (c) 2024 Huawei Device Co., Ltd.
  3.  * Licensed under the Apache License, Version 2.0 (the "License");
  4.  * you may not use this file except in compliance with the License.
  5.  * You may obtain a copy of the License at
  6.  *
  7.  *     http://www.apache.org/licenses/LICENSE-2.0
  8.  *
  9.  * Unless required by applicable law or agreed to in writing, software
  10.  * distributed under the License is distributed on an "AS IS" BASIS,
  11.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12.  * See the License for the specific language governing permissions and
  13.  * limitations under the License.
  14.  */
  15. import { Prompt } from '@kit.ArkUI';
  16. import {
  17.   AudioRendererController,
  18.   AVSessionController,
  19.   Logger,
  20.   MusicPlayMode,
  21.   SongItem,
  22.   PlayModeSwitchList as playModeSwitchList
  23. } from '@ohos/MediaService';
  24. import { StyleConstants } from '../common/constants/StyleConstants';
  25. import { BreakpointConstants } from '../common/constants/BreakpointConstants';
  26. import { PlayerConstants } from '../common/constants/PlayerConstants';
  27. import { BreakpointType } from '../common/utils/BreakpointSystem'
  28. import { SongDataSource } from '../datasource/SongDataSource';
  29. import { ContentConstants } from '../common/constants/ContentConstants';
  30. import { ResourceConversion } from '../common/utils/ResourceConversion';
  31.  
  32. const TAG = 'ControlAreaComponent'
  33.  
  34. @Component
  35. export struct ControlAreaComponent {
  36.   @StorageProp('currentBreakpoint') currentBreakpoint: string = BreakpointConstants.BREAKPOINT_SM;
  37.   @StorageLink('isPlay') isPlay: boolean = false;
  38.   @StorageLink('currentTime') currentTime: string = '00:00';
  39.   @StorageLink('totalTime') totalTime: string = '00:00';
  40.   @StorageLink('progress') value: number = 0;
  41.   @StorageLink('progressMax') max: number = 0;
  42.   @State playModeIndex: number = 0;
  43.   @StorageLink('imageColor') imageColor: string = '';
  44.   @StorageLink('pageShowTime') pageShowTime: number = 0;
  45.   @StorageLink('songList') songList: SongItem[] = [];
  46.   @State isShowPlayList: boolean = false;
  47.   @StorageLink('playMode') playMode: MusicPlayMode = playModeSwitchList[this.playModeIndex];
  48.   @StorageLink('selectIndex') selectIndex: number = 0;
  49.   @StorageLink('isFavorite') isFavorite: boolean = false;
  50.   @StorageLink('isSilentMode') isSilentMode: boolean = false;
  51.   private scroller: Scroller = new Scroller();
  52.   private resourceConversion: ResourceConversion = new ResourceConversion();
  53.  
  54.   switchPlayMode() {
  55.     if (this.playModeIndex === playModeSwitchList.length - 1) {
  56.       this.playModeIndex = 0;
  57.     } else {
  58.       this.playModeIndex++;
  59.     }
  60.     this.playMode = playModeSwitchList[this.playModeIndex];
  61.     Logger.info(TAG, 'playModeIndex is' + this.playModeIndex);
  62.     Prompt.showToast({
  63.       message: `${this.playMode === MusicPlayMode.ORDER ?
  64.       this.resourceConversion.getStringValueFromResource($r('app.string.sequential_playback')) :
  65.         this.playMode === MusicPlayMode.RANDOM ?
  66.         this.resourceConversion.getStringValueFromResource($r('app.string.random_playback')) :
  67.         this.resourceConversion.getStringValueFromResource($r('app.string.single_playback'))}`
  68.     });
  69.     AudioRendererController.getInstance().setPlayModel(this.playMode);
  70.   }
  71.  
  72.   build() {
  73.     Column() {
  74.       Row() {
  75.         Image(this.playMode === MusicPlayMode.ORDER ? $r('app.media.order_play') :
  76.           this.playMode === MusicPlayMode.RANDOM ? $r('app.media.shuffle') : $r('app.media.repeat_1'))
  77.           .fillColor(Color.White)
  78.           .controlImageBuilder()
  79.           .width(new BreakpointType({
  80.             sm: $r('app.float.twenty_four'),
  81.             md: $r('app.float.twenty_four'),
  82.             lg: $r('app.float.control_image_lg')
  83.           }).getValue(this.currentBreakpoint))
  84.           .onClick(() => {
  85.             this.switchPlayMode()
  86.           })
  87.         Image($r('app.media.ic_music_list'))
  88.           .fillColor(Color.White)
  89.           .controlImageBuilder()
  90.           .width(new BreakpointType({
  91.             sm: $r('app.float.twenty_four'),
  92.             md: $r('app.float.twenty_four'),
  93.             lg: $r('app.float.control_image_lg')
  94.           }).getValue(this.currentBreakpoint))
  95.           .onClick(() => {
  96.             this.isShowPlayList = true;
  97.           })
  98.           .bindSheet($$this.isShowPlayList, this.musicListBuilder(), {
  99.             detents: [SheetSize.MEDIUM],
  100.             dragBar: false,
  101.             showClose: false,
  102.             preferType: SheetType.CENTER,
  103.             onWillAppear: () => {
  104.               Logger.info(TAG, 'musicListBuilder');
  105.               this.scroller.scrollToIndex(this.selectIndex, false, ScrollAlign.CENTER);
  106.             }
  107.           })
  108.         Image(this.isSilentMode ? $r('app.media.silence') : $r('app.media.ic_ring'))
  109.           .controlImageBuilder()
  110.           .width(new BreakpointType({
  111.             sm: $r('app.float.twenty_four'),
  112.             md: $r('app.float.twenty_four'),
  113.             lg: $r('app.float.control_image_lg')
  114.           }).getValue(this.currentBreakpoint))
  115.           .onClick(() => {
  116.             this.isSilentMode = !this.isSilentMode;
  117.             AudioRendererController.getInstance().setSilentModeAndMixWithOthers(this.isSilentMode)
  118.           })
  119.         Image(this.isFavorite ? $r('app.media.heart_fill') : $r('app.media.heart'))
  120.           .fillColor(this.isFavorite ? Color.Red : Color.White)
  121.           .controlImageBuilder()
  122.           .animation({
  123.             duration: 500
  124.           })
  125.           .width(new BreakpointType({
  126.             sm: $r('app.float.twenty_four'),
  127.             md: $r('app.float.twenty_four'),
  128.             lg: $r('app.float.control_image_lg')
  129.           }).getValue(this.currentBreakpoint))
  130.           .onClick(() => {
  131.             AVSessionController.getInstance().updateFavoriteState(this.selectIndex.toString(), this.isFavorite)
  132.           })
  133.       }
  134.       .width(StyleConstants.FULL_WIDTH)
  135.       .justifyContent(FlexAlign.SpaceBetween)
  136.  
  137.       Column() {
  138.         Slider({
  139.           min: 0,
  140.           max: this.max,
  141.           step: 1,
  142.           style: SliderStyle.OutSet,
  143.           value: this.value
  144.         })
  145.           .selectedColor($r('app.color.slider_select'))
  146.           .trackColor($r('app.color.slider_track'))
  147.           .onChange((value: number, mode: SliderChangeMode) => {
  148.             if (mode === SliderChangeMode.End || mode === SliderChangeMode.Begin) {
  149.               AudioRendererController.getInstance().seek(value);
  150.             }
  151.             this.pageShowTime = 0;
  152.           })
  153.           .height($r('app.float.slider_height'))
  154.           .margin({
  155.             left: new BreakpointType({
  156.               sm: $r('app.float.slider_margin_sm'),
  157.               md: $r('app.float.slider_margin_md'),
  158.               lg: $r('app.float.slider_margin_lg')
  159.             }).getValue(this.currentBreakpoint),
  160.             right: new BreakpointType({
  161.               sm: $r('app.float.slider_margin_sm'),
  162.               md: $r('app.float.slider_margin_md'),
  163.               lg: $r('app.float.slider_margin_lg')
  164.             }).getValue(this.currentBreakpoint)
  165.           })
  166.           .hitTestBehavior(HitTestMode.Block)
  167.         Row() {
  168.           Text(this.currentTime)
  169.             .fontColor($r('app.color.play_text_color'))
  170.             .fontSize($r('app.float.singer_title_sm'))
  171.             .fontFamily(PlayerConstants.FONT_FAMILY_BLACK)
  172.             .lineHeight('14vp')
  173.           Text(this.totalTime)
  174.             .fontColor($r('app.color.play_text_color'))
  175.             .fontSize($r('app.float.singer_title_sm'))
  176.             .fontFamily(PlayerConstants.FONT_FAMILY_BLACK)
  177.             .lineHeight('14vp')
  178.         }
  179.         .width(StyleConstants.FULL_WIDTH)
  180.         .justifyContent(FlexAlign.SpaceBetween)
  181.       }
  182.       .margin({
  183.         top: $r('app.float.slider_margin_top'),
  184.         bottom: this.currentBreakpoint === BreakpointConstants.BREAKPOINT_LG ?
  185.         $r('app.float.slider_margin_bottom_lg') : $r('app.float.slider_margin_bottom')
  186.       })
  187.  
  188.       Row() {
  189.         Image($r('app.media.ic_public_forward'))
  190.           .controlImageBuilder()
  191.           .width(this.currentBreakpoint === BreakpointConstants.BREAKPOINT_LG ?
  192.           $r('app.float.control_width_lg') : $r('app.float.control_width'))
  193.           .onClick(() => {
  194.             AudioRendererController.getInstance().playPrevious();
  195.             this.pageShowTime = 0;
  196.           })
  197.         Image(this.isPlay ? $r('app.media.ic_public_play') : $r('app.media.ic_public_pause'))
  198.           .controlImageBuilder()
  199.           .width(new BreakpointType({
  200.             sm: $r('app.float.image_play_width'),
  201.             md: $r('app.float.image_play_width'),
  202.             lg: $r('app.float.image_play_width_lg')
  203.           }).getValue(this.currentBreakpoint))
  204.           .onClick(() => {
  205.             if (this.isPlay) {
  206.               AudioRendererController.getInstance().pause();
  207.             } else {
  208.               if (AudioRendererController.getInstance().getFirst()) {
  209.                 AudioRendererController.getInstance().play(0);
  210.               } else {
  211.                 AudioRendererController.getInstance().start();
  212.               }
  213.             }
  214.             this.pageShowTime = 0;
  215.           })
  216.         Image($r('app.media.ic_public_next'))
  217.           .controlImageBuilder()
  218.           .width(this.currentBreakpoint === BreakpointConstants.BREAKPOINT_LG ?
  219.           $r('app.float.control_width_lg') : $r('app.float.control_width'))
  220.           .onClick(() => {
  221.             AudioRendererController.getInstance().playNext();
  222.             this.pageShowTime = 0;
  223.           })
  224.       }
  225.       .width(StyleConstants.FULL_WIDTH)
  226.       .justifyContent(FlexAlign.SpaceBetween)
  227.       .padding({
  228.         left: $r('app.float.control_padding'),
  229.         right: $r('app.float.control_padding')
  230.       })
  231.     }
  232.   }
  233.  
  234.   @Builder
  235.   musicListBuilder() {
  236.     Column() {
  237.       this.playListTitle();
  238.       List({ scroller: this.scroller }) {
  239.         LazyForEach(new SongDataSource(this.songList), (item: SongItem, index: number) => {
  240.           ListItem() {
  241.             MusicListContainer({ item: item, index: index }).reuseId(item.title);
  242.           }
  243.         }, (item: SongItem, index: number) => item.toString() + index.toString())
  244.       }
  245.       .height(StyleConstants.FULL_HEIGHT)
  246.       .width(StyleConstants.FULL_WIDTH)
  247.       .backgroundColor(Color.White)
  248.       .margin({ top: $r('app.float.list_area_margin_top') })
  249.       .lanes(this.currentBreakpoint === BreakpointConstants.BREAKPOINT_LG ?
  250.       ContentConstants.COL_TWO : ContentConstants.COL_ONE)
  251.       .layoutWeight(1)
  252.       .divider({
  253.         color: $r('app.color.list_divider'),
  254.         strokeWidth: $r('app.float.stroke_width'),
  255.         startMargin: $r('app.float.list_item_padding'),
  256.         endMargin: $r('app.float.list_item_padding')
  257.       })
  258.     }
  259.     .padding({
  260.       top: this.currentBreakpoint === BreakpointConstants.BREAKPOINT_SM ? 0 : $r('app.float.list_area_padding_top'),
  261.       bottom: $r('app.float.list_area_padding_bottom')
  262.     })
  263.     .backgroundColor(Color.White)
  264.   }
  265.  
  266.   @Builder
  267.   playListTitle() {
  268.     Row() {
  269.       Image($r('app.media.ic_sort_list'))
  270.         .height($r('app.float.play_all_icon_size'))
  271.         .width($r('app.float.play_all_icon_size'))
  272.       Text($r('app.string.play_list', this.songList.length))
  273.         .maxLines(ContentConstants.PLAY_ALL_MAX_LINES)
  274.         .padding({ left: $r('app.float.play_all_text_padding') })
  275.         .fontColor(Color.Black)
  276.         .fontSize(new BreakpointType({
  277.           sm: $r('app.float.play_font_sm'),
  278.           md: $r('app.float.play_font_md'),
  279.           lg: $r('app.float.play_font_lg')
  280.         }).getValue(this.currentBreakpoint))
  281.     }
  282.     .height($r('app.float.play_all_area_height'))
  283.     .width(StyleConstants.FULL_WIDTH)
  284.     .backgroundColor(Color.White)
  285.     .padding({
  286.       left: $r('app.float.play_all_area_padding'),
  287.       right: $r('app.float.play_all_area_padding')
  288.     })
  289.     .borderRadius({
  290.       topRight: $r('app.float.play_all_border_radius'),
  291.       topLeft: $r('app.float.play_all_border_radius')
  292.     })
  293.     .position({
  294.       x: 0,
  295.       y: 0
  296.     })
  297.   }
  298. }
  299.  
  300. @Extend(Image)
  301. function controlImageBuilder() {
  302.   .aspectRatio(1)
  303.   .opacity(0.86)
  304.   .objectFit(ImageFit.Contain)
  305. }
  306.  
  307. @Reusable
  308. @Component
  309. struct MusicListContainer {
  310.   @StorageLink('isPlay') isPlay: boolean = false;
  311.   @StorageProp('currentBreakpoint') currentBreakpoint: string = BreakpointConstants.BREAKPOINT_SM;
  312.   @StorageLink('selectIndex') selectIndex: number = 0;
  313.   item: SongItem | undefined = undefined;
  314.   index: number | undefined = undefined;
  315.  
  316.   build() {
  317.     Column() {
  318.       Row() {
  319.         Column() {
  320.           Text(this.item!.title)
  321.             .fontColor(this.selectIndex === this.index && this.isPlay ? Color.Red : Color.Black)
  322.             .fontSize(new BreakpointType({
  323.               sm: $r('app.float.item_font_sm'),
  324.               md: $r('app.float.item_font_md'),
  325.               lg: $r('app.float.item_font_lg')
  326.             }).getValue(this.currentBreakpoint))
  327.             .margin({ bottom: $r('app.float.list_item_title_margin') })
  328.           Row() {
  329.             Image(this.item!.mark)
  330.               .width($r('app.float.list_item_image_size'))
  331.               .height($r('app.float.list_item_image_size'))
  332.               .margin({ right: $r('app.float.list_item_image_margin') })
  333.             Text(this.item!.singer)
  334.               .opacity($r('app.float.singer_opacity'))
  335.               .fontColor(this.selectIndex === this.index && this.isPlay ? Color.Red : Color.Black)
  336.               .fontSize(new BreakpointType({
  337.                 sm: $r('app.float.singer_title_sm'),
  338.                 md: $r('app.float.singer_title_md'),
  339.                 lg: $r('app.float.singer_title_lg')
  340.               }).getValue(this.currentBreakpoint))
  341.           }
  342.         }
  343.         .alignItems(HorizontalAlign.Start)
  344.       }
  345.       .onClick(() => {
  346.         if (this.selectIndex === this.index) {
  347.           if (!this.isPlay) {
  348.             AudioRendererController.getInstance().play(this.index)
  349.           }
  350.         } else {
  351.           AudioRendererController.getInstance().play(this.index)
  352.         }
  353.       })
  354.       .height($r('app.float.list_item_height'))
  355.       .width(StyleConstants.FULL_WIDTH)
  356.     }
  357.     .padding({
  358.       left: $r('app.float.list_item_padding'),
  359.       right: $r('app.float.list_item_padding')
  360.     })
  361.   }
  362. }
Advertisement
Add Comment
Please, Sign In to add comment