| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827 |
- import TitleBar from '../view/TitleBar'
- import { promptAction, router } from '@kit.ArkUI'
- import { CommonConstants } from '../common/constants/CommonConstants'
- import { AppUtil, DeviceUtil, DisplayUtil, FileUtil, MD5, PreferencesUtil, ToastUtil } from '@pura/harmony-utils'
- import { CustomContentDialog } from '@kit.ArkUI'
- import ConfigurationConstant from '@ohos.app.ability.ConfigurationConstant';
- import common from '@ohos.app.ability.common';
- import { photoAccessHelper } from '@kit.MediaLibraryKit'
- import { fileIo, fileUri } from '@kit.CoreFileKit'
- import { BusinessError, emitter } from '@kit.BasicServicesKit'
- import { BreakpointTypeEnum } from '../common/util/BreakpointSystem'
- import { Utility } from '../common/util/Utility'
- import { HSBColorPicker } from '@keke/color-picker'
- import { DialogHelper } from '@pura/harmony-dialog'
- import { bundleManager } from '@kit.AbilityKit'
- import { hilog } from '@kit.PerformanceAnalysisKit'
- @Preview
- // @Entry
- @Component
- export struct SettingPage {
- @Consume isShowDrawer: boolean;
- @Consume offsetX: number;
- @Consume mType: number;
- static readonly THEME_MODE: string = 'themeMode';
- static readonly SORT_TYPE: string = 'musicSortType';
- static readonly IS_BGPLAY_OPEN: string = 'isBgPlayOpen';
- static readonly IS_AUTO_RATATE: string = 'isAutoRatate';
- static readonly iS_MEMORY_PLAY: string = 'isMemoryPlay';
- static readonly IS_MIDIACODEC_OPEN: string = 'isMediacodec';
- static readonly iS_MUSIC_MEMORY_PLAY: string = 'isMusicMemoryPlay';
- static readonly iS_MUSIC_BG_COVER: string = 'isMusicBGCover';
- static readonly iS_SAVE_PLAY_MODE: string = 'isSavePlayMode';
- static readonly IS_COVER_RECTANGLE: string = 'isCoverRectangle'; //封面圆形或者方形
- static readonly IS_SHOW_SIMI: string = 'isShowSimi';
- static readonly IS_SHOW_FAV: string = 'isShowFAV';
- static readonly IS_SHOW_HISTORY: string = 'isShowHistory';
- static readonly IS_CUSTOMIZE_BG: string = 'is_customize_bg';
- static readonly IS_GRID_MUSIC: string = 'is_grid_music';
- static readonly IS_CUSTOMIZE_BG_PATH: string = 'is_customize_bg_path';
- static readonly IS_SCROLL_HIDE: string = 'isScrollHide';
- static readonly IS_SAMETIME_PLAY: string = 'isSameTimePlay';
- static readonly CUSTOMIZE_BG_BLUR: string = 'customize_bg_blur';
- static readonly BG_BRIGHTNESS: string = 'bg_brightness';
- static readonly IS_SHOW_ALLBAR: string = 'IS_SHOW_ALLBAR';
- static readonly IS_SHOW_TITLTBAR: string = 'IS_SHOW_TITLTBAR';
- static readonly IS_SHOW_PLAYPAGE_BACK: string = 'IS_SHOW_PLAYPAGE_BACK';
- static readonly IS_SHOW_SLLYRIC: string = 'IS_SHOW_SLLYRIC';
- static readonly IS_CIRCLE_BTN: string = 'isCircleBtn';
- static readonly IS_COVER_TOP: string = 'IS_COVER_TOP';
- static readonly IS_SHOW_HEADER: string = 'IS_SHOW_HEADER';
- static readonly IS_COVER_TOP_BIG: string = 'IS_COVER_TOP_BIG';
- public static THEME_COLOR_KEY: string = 'THEME_COLOR';
- public static TWO_FINGER_TYPE: string = 'twoFingerType';
- public static LONG_PRESS_SPEED: string = 'longPressSpeed';
- public static IS_PLAYLIST_BG_GRASS: string = 'isPlayListBgGrass';
- public static THEME_COLOR_LIST: Array<ThemeColorItem> = [
- { name: '玫瑰粉', color: '#FF4081', isVip: false },
- { name: '经典蓝', color: '#0A59F7', isVip: false },
- { name: '活力黄', color: '#FFC107', isVip: true },
- { name: '枫叶红', color: '#F44336', isVip: true },
- { name: '幻影紫', color: '#9C27B0', isVip: true },
- { name: '翡翠绿', color: '#64BB5C', isVip: true },
- { name: '竹青蓝', color: '#00BCD4', isVip: true },
- { name: '深空灰', color: '#607D8B', isVip: true },
- { name: '橙霞橙', color: '#FF9800', isVip: true },
- { name: '湖水蓝', color: '#00BFFF', isVip: true },
- { name: '柠檬绿', color: '#C6FF00', isVip: true },
- { name: '樱花粉', color: '#FF69B4', isVip: true },
- { name: '暮夜蓝', color: '#283593', isVip: true },
- { name: '薄荷青', color: '#1DE9B6', isVip: true },
- { name: '银沙灰', color: '#B0BEC5', isVip: true },
- { name: '自定义', color: '#ffecec', isVip: true }
- ];
- static readonly iS_START_AUTO_PLAY: string = 'isStartAutoPlay';
- static readonly iS_MEMORY_LAST_PLAY: string = 'isMemoryLastPlay';
- @State showApiDialog: boolean = false
- @State tempApiUrl: string = ''
- @State lyricApiUrl: string = PreferencesUtil.getStringSync('LRC_API', '')
- @State isBgPlayOpen: boolean = true //是否启用后台播放
- @State isAutoRatate: boolean = true //是否启用自动横竖屏
- @State isMemoryPlay: boolean = true //是否启用记忆播放
- @State isMediacodec: boolean = false //是否启用硬件解码
- @State isMusicMemoryPlay: boolean = false //是否启用记忆播放
- @State isMusicBGCover: boolean = true //播放背景随封面
- @State sortType: number = 4 //默认排序方式
- @State isStartAutoPlay: boolean = false //启动后自动播放
- @State isMemoryLastPlay: boolean = false //是否启用应用退出记忆最后一首的播放进度
- @State isShowSimi: boolean = false //是否显示私密音频
- @State isShowFAV: boolean = true //是否显示我的收藏
- @State isShowHistory: boolean = true //是否显示最近播放
- @State isShowPlayPageBack: boolean = false //是否显示播放页返回键
- @State isShowSingleLineLyric: boolean = false //是否显示播放页返回键
- @State isShowHeader: boolean = true
- @State isCustomizeBg: boolean = false //自定义背景界面
- @State isCustomizeBgSheet: boolean = false //自定义背景界面
- @State isShowTitleBar: boolean = true //是否显示分类导航条
- @State isShowAllBar: boolean = true //是否显示播放全部条
- @State longPressSpeed: number = 3 //长按默认倍数
- @State blurValue: number = 0 //背景模糊
- @State bgBrightness: number = 0 //背景亮度
- @State isGridMusic: boolean = true //是否网格布局
- @State isCircleBtn: boolean = false //是否圆形播放按钮
- @State twoFingerType: number = 3 //双指放大瘦小Grid或list的大小
- @State isScrollHide: boolean = false //是否滚动隐藏
- @State isSameTimePlay: boolean = false //是否和其他app同时播放
- @State isCoverRectangle: boolean = false
- @State isSavePlayMode: boolean = true
- @State isCoverTop: boolean = true
- @State isCoverTopBig: boolean = false//顶部大封面部分手机显示会和播放控制页重叠
- @State isPlayListBgGrass: boolean = true//是否播放列表玻璃透明效果
- @State customizeBgPath: string | undefined = '';
- context = getContext(this);
- @State showCoverApiDialog: boolean = false
- @State tempCoverApiUrl: string = ''
- @State coverApiUrl: string = PreferencesUtil.getStringSync('COVER_API', '')
- @State apiDialogType: 'lyric' | 'cover' = 'lyric'
- @State themeMode: number = 0 // 0: 跟随系统, 1: 浅色, 2: 深色
- @StorageProp('currentColorMode') @Watch('onColorModeChange') currentMode: number =
- ConfigurationConstant.ColorMode.COLOR_MODE_LIGHT;
- @StorageLink('isDarkMode') isDarkMode: boolean = false // 是否启用深色模式
- /** 当前断点类型(如大屏/小屏) */
- @StorageProp('currentBreakpoint') currentBreakpoint: string = BreakpointTypeEnum.MD;
- @State verName: string = ''
- @StorageProp('themeColor') themeColor: string =
- PreferencesUtil.getStringSync('THEME_COLOR', CommonConstants.DEFAULT_THEME_COLOR);
- @State showColorPicker: boolean = false
- @State customColor: string = PreferencesUtil.getStringSync('THEME_COLOR', CommonConstants.DEFAULT_THEME_COLOR);
- @State isThemeSheet: boolean = false // 主题设置弹窗显示状态
- @State colorRows: Array<Array<ThemeColorItem>> = chunkArray(SettingPage.THEME_COLOR_LIST, 2);
- @State colorGroup: string = "group"
- @StorageProp('topRectHeight') topRectHeight: number = px2vp(AppUtil.getStatusBarHeight());
- apiDialogController: CustomDialogController = new CustomDialogController({
- builder: CustomContentDialog({
- primaryTitle: this.apiDialogType === 'lyric' ? '修改歌词API地址' : '修改封面API地址',
- contentBuilder: () => {
- this.buildApiDialogContent();
- },
- buttons: [
- {
- value: '取消',
- action: () => {
- this.apiDialogController.close();
- }
- },
- {
- value: '保存',
- action: () => {
- if (this.apiDialogType === 'lyric') {
- this.lyricApiUrl = this.tempApiUrl.trim()
- PreferencesUtil.put('LRC_API', this.lyricApiUrl)
- this.getUIContext().getPromptAction().showToast({
- message: '保存成功,当前LRC_API:' + this.lyricApiUrl,
- duration: 2000,
- showMode: promptAction.ToastShowMode.TOP_MOST,
- bottom: 85
- })
- } else {
- this.coverApiUrl = this.tempApiUrl.trim()
- PreferencesUtil.put('COVER_API', this.coverApiUrl)
- this.getUIContext().getPromptAction().showToast({
- message: '保存成功,当前COVER_API:' + this.coverApiUrl,
- duration: 2000,
- showMode: promptAction.ToastShowMode.TOP_MOST,
- bottom: 85
- })
- }
- this.apiDialogController.close();
- }
- }
- ]
- }),
- autoCancel: true,
- alignment: DialogAlignment.Center
- })
- @Builder
- buildApiDialogContent() {
- Column() {
- TextInput({
- text: this.tempApiUrl,
- placeholder: this.apiDialogType === 'lyric' ? '请输入歌词API地址' : '请输入封面API地址'
- })
- .onChange((val: string) => {
- this.tempApiUrl = val
- })
- .width('90%')
- .height(60)
- }
- .width('100%')
- }
- // 组件生命周期
- aboutToAppear() {
- this.geIDD()
- this.topRectHeight = px2vp(AppUtil.getStatusBarHeight());
- this.isBgPlayOpen = PreferencesUtil.getBooleanSync(SettingPage.IS_BGPLAY_OPEN, true)
- this.isAutoRatate = PreferencesUtil.getBooleanSync(SettingPage.IS_AUTO_RATATE, true)
- this.isMemoryPlay = PreferencesUtil.getBooleanSync(SettingPage.iS_MEMORY_PLAY, true)
- this.isMediacodec = PreferencesUtil.getBooleanSync(SettingPage.IS_MIDIACODEC_OPEN, false)
- this.isMusicMemoryPlay = PreferencesUtil.getBooleanSync(SettingPage.iS_MUSIC_MEMORY_PLAY, false)
- this.isMusicBGCover = PreferencesUtil.getBooleanSync(SettingPage.iS_MUSIC_BG_COVER, true)
- this.sortType = PreferencesUtil.getNumberSync(SettingPage.SORT_TYPE, 4)
- this.isShowSimi = PreferencesUtil.getBooleanSync(SettingPage.IS_SHOW_SIMI, false)
- this.isShowFAV = PreferencesUtil.getBooleanSync(SettingPage.IS_SHOW_FAV, true)
- this.isShowHistory = PreferencesUtil.getBooleanSync(SettingPage.IS_SHOW_HISTORY, true)
- this.isCustomizeBg = PreferencesUtil.getBooleanSync(SettingPage.IS_CUSTOMIZE_BG, false)
- this.customizeBgPath = PreferencesUtil.getStringSync(SettingPage.IS_CUSTOMIZE_BG_PATH, '')
- this.isGridMusic = PreferencesUtil.getBooleanSync(SettingPage.IS_GRID_MUSIC, true)
- this.isScrollHide = PreferencesUtil.getBooleanSync(SettingPage.IS_SCROLL_HIDE, false)
- this.isSameTimePlay = PreferencesUtil.getBooleanSync(SettingPage.IS_SAMETIME_PLAY, false)
- this.isSavePlayMode = PreferencesUtil.getBooleanSync(SettingPage.iS_SAVE_PLAY_MODE, true)
- this.blurValue = PreferencesUtil.getNumberSync(SettingPage.CUSTOMIZE_BG_BLUR, 0)
- this.bgBrightness = PreferencesUtil.getNumberSync(SettingPage.BG_BRIGHTNESS, 0)
- this.isStartAutoPlay = PreferencesUtil.getBooleanSync(SettingPage.iS_START_AUTO_PLAY, false)
- this.isMemoryLastPlay = PreferencesUtil.getBooleanSync(SettingPage.iS_MEMORY_LAST_PLAY, false)
- this.twoFingerType = PreferencesUtil.getNumberSync(SettingPage.TWO_FINGER_TYPE, 3)
- this.isCircleBtn = PreferencesUtil.getBooleanSync(SettingPage.IS_CIRCLE_BTN, true)
- this.isCoverTop = PreferencesUtil.getBooleanSync(SettingPage.IS_COVER_TOP, false)
- this.isShowTitleBar = PreferencesUtil.getBooleanSync(SettingPage.IS_SHOW_TITLTBAR, true)
- this.isShowAllBar = PreferencesUtil.getBooleanSync(SettingPage.IS_SHOW_ALLBAR, true)
- this.isShowPlayPageBack = PreferencesUtil.getBooleanSync(SettingPage.IS_SHOW_PLAYPAGE_BACK, true)
- this.isShowSingleLineLyric = PreferencesUtil.getBooleanSync(SettingPage.IS_SHOW_SLLYRIC, false)
- this.isCoverTopBig = PreferencesUtil.getBooleanSync(SettingPage.IS_COVER_TOP_BIG, false)
- this.longPressSpeed = PreferencesUtil.getNumberSync(SettingPage.LONG_PRESS_SPEED, 3)
- this.isShowHeader = PreferencesUtil.getBooleanSync(SettingPage.IS_SHOW_HEADER, true)
- this.isCoverRectangle = PreferencesUtil.getBooleanSync(SettingPage.IS_COVER_RECTANGLE, true)
- this.isPlayListBgGrass = PreferencesUtil.getBooleanSync(SettingPage.IS_PLAYLIST_BG_GRASS, true)
- // 只用 themeMode 控制主题
- this.themeMode = PreferencesUtil.getNumberSync(SettingPage.THEME_MODE, 0)
- this.applyThemeMode(this.themeMode)
- let themeColor = PreferencesUtil.getStringSync('THEME_COLOR', CommonConstants.DEFAULT_THEME_COLOR);
- AppStorage.setOrCreate('themeColor', themeColor);
- this.themeColor = themeColor;
- }
- // 监听颜色模式变化
- onColorModeChange(): void {
- this.isDarkMode = this.currentMode === ConfigurationConstant.ColorMode.COLOR_MODE_DARK;
- AppStorage.setOrCreate('isDarkMode', this.isDarkMode);
- }
- // 组件生命周期
- aboutToDisappear() {
- // 无需处理apiDialogController
- }
- applyThemeMode(mode: number) {
- let colorMode = ConfigurationConstant.ColorMode.COLOR_MODE_NOT_SET
- if (mode === 1) {
- colorMode = ConfigurationConstant.ColorMode.COLOR_MODE_LIGHT
- } else if (mode === 2) {
- colorMode = ConfigurationConstant.ColorMode.COLOR_MODE_DARK
- }
- AppStorage.setOrCreate('currentColorMode', colorMode)
- AppStorage.setOrCreate('isDarkMode', colorMode === ConfigurationConstant.ColorMode.COLOR_MODE_DARK)
- PreferencesUtil.putSync(SettingPage.THEME_MODE, mode)
- AppStorage.setOrCreate('themeMode', mode)
- // 只有强制浅色/深色时才主动设置
- const context = getContext(this) as common.UIAbilityContext
- context.getApplicationContext().setColorMode(colorMode)
- }
- @Builder
- pickerBuilder() {
- Column({ space: 20 }) {
- HSBColorPicker({
- color: this.customColor,
- radius: 8,
- onChange: (value: string) => {
- this.customColor = value
- }
- })
- .layoutWeight(1)
- .padding(15)
- Row({ space: 10 }) {
- Button('取消')
- .stateEffect(true)
- .backgroundColor(this.themeColor)
- .onClick(() => {
- this.showColorPicker = false
- })
- Button('确定')
- .stateEffect(true)
- .backgroundColor(this.themeColor)
- .onClick(() => {
- this.themeColor = this.customColor
- PreferencesUtil.putSync(SettingPage.THEME_COLOR_KEY, this.customColor)
- AppStorage.setOrCreate('themeColor', this.customColor)
- this.sendChangeEvent()
- this.showColorPicker = false
- })
- }
- }
- .padding(20)
- .width('80%')
- .height(300)
- }
- @Builder
- themeSheetBuilder() {
- Column() {
- // 颜色模式分组卡片
- Column() {
- Row() {
- Row() {
- Image($r('app.media.theme'))
- .width(20)
- .height(20)
- .fillColor(this.themeColor)
- Text('颜色模式')
- .fontSize(15)
- .margin({ left: 6 })
- .fontWeight(500)
- }
- .layoutWeight(1)
- Blank()
- Row() {
- ForEach(['自动', '日间', '夜间'], (item: string, idx: number) => {
- Column() {
- Radio({
- value: idx.toString(),
- group: this.colorGroup,
- })
- .checked(this.themeMode === idx)
- .radioStyle({
- checkedBackgroundColor: this.themeColor
- })
- .margin({ left: 3, right: 3 })
- .onClick(() => {
- this.themeMode = idx
- this.applyThemeMode(idx)
- this.sendChangeEvent()
- })
- Text(item)
- .fontSize(15)
- .fontColor($r('app.color.text_color'))
- .margin({ top: 6 })
- .onClick(() => {
- this.themeMode = idx
- this.applyThemeMode(idx)
- this.sendChangeEvent()
- })
- }
- .alignItems(HorizontalAlign.Center)
- .margin({ left: 12, right: 12 })
- })
- }
- .margin({ left: 12, right: 12 })
- }
- }
- .backgroundColor($r('app.color.settings_background_main'))
- .borderRadius(18)
- .border({ width: 1, color: '#F0F0F0' })
- .shadow({
- radius: 12,
- color: 0x11000000,
- offsetX: 0,
- offsetY: 2
- })
- .margin({
- left: 0,
- right: 0,
- bottom: 20
- })
- .padding({
- top: 18,
- bottom: 18,
- left: 20,
- right: 20
- })
- .width('90%')
- // 主题色分组卡片
- Column() {
- Row() {
- Image($r('app.media.theme'))
- .width(20)
- .height(20)
- .fillColor(this.themeColor)
- Text('主题色')
- .fontSize(15)
- .fontWeight(500)
- .margin({ left: 8 })
- .layoutWeight(1)
- }
- .margin({ left: 20, top: 12 })
- Row() {
- Column() {
- ForEach(this.colorRows, (row: Array<ThemeColorItem>, rowIdx: number) => {
- Row() {
- ForEach(row, (item: ThemeColorItem, colIdx: number) => {
- Button() {
- Row() {
- Blank()
- .width(22)
- .height(22)
- .backgroundColor(item.name === '自定义' && this.isCustomThemeColor() ? this.themeColor :
- item.color)
- .border({ width: 2, color: $r('app.color.text_color') })
- .borderRadius(11)
- Text(item.name)
- .fontSize(15)
- .fontColor($r('app.color.text_color'))
- .margin({ left: 10 })
- // Text(item.isVip?'VIP':"Free")
- // .fontSize(10)
- // .fontColor(item.isVip?'#FFD700':"#000000") // 金色
- // .backgroundColor('#FFF9E3')
- // .borderRadius(6)
- // .padding({ left: 4, right: 4, top: 1, bottom: 1 })
- // .margin({ left: 4 })
- }
- .alignItems(VerticalAlign.Center)
- .justifyContent(FlexAlign.Start)
- .layoutWeight(1)
- }
- .height(40)
- .layoutWeight(1)
- .backgroundColor(
- (item.name === '自定义' && this.isCustomThemeColor()) || this.themeColor === item.color
- ? this.themeColor
- : $r('app.color.settings_background_main')
- )
- .borderRadius(20)
- .onClick(() => {
- if (item.isVip) {
- if (!Utility.isNoble()) {
- this.showVipDialog();
- return;
- }
- }
- if (item.name === '自定义') {
- this.showColorPicker = true
- } else {
- this.themeColor = item.color
- PreferencesUtil.putSync(SettingPage.THEME_COLOR_KEY, item.color)
- AppStorage.setOrCreate('themeColor', item.color)
- this.sendChangeEvent()
- }
- })
- .margin({ right: colIdx === 0 ? '4%' : 20, bottom: 10, left: 20 })
- })
- }
- .justifyContent(FlexAlign.Start)
- })
- }
- .margin({ left: 12, right: 12, top: 12 })
- }
- }
- .width('90%')
- .backgroundColor($r('app.color.settings_background_main'))
- .borderRadius(18)
- .border({ width: 1, color: '#F0F0F0' })
- .shadow({
- radius: 12,
- color: 0x11000000,
- offsetX: 0,
- offsetY: 2
- })
- .margin({
- left: 0,
- right: 0,
- bottom: 18
- })
- .padding({
- top: 18,
- bottom: 18,
- left: 0,
- right: 0
- })
- .bindPopup(this.showColorPicker, {
- builder: this.pickerBuilder(),
- placement: Placement.Top,
- mask: { color: '#33000000' },
- enableArrow: false, //是否显示箭头
- showInSubWindow: false,
- onStateChange: (e) => {
- if (!e.isVisible) {
- this.showColorPicker = false
- }
- }
- })
- // 主题色自定义弹窗
- }
- .padding({
- top: 8,
- bottom: 8,
- left: 15,
- right: 15
- })
- .width('100%')
- .backgroundColor(Color.Transparent)
- .borderRadius(24)
- }
- build() {
- Column() {
- Column() {
- Line().width('100%').height('100%')
- }
- .height(this.topRectHeight)
- .backgroundColor(this.isDarkMode ? $r('app.color.title_bar_bg') : this.themeColor)
- .expandSafeArea([SafeAreaType.SYSTEM], [SafeAreaEdge.TOP])
- // 自定义标题栏
- Stack() {
- // 居中标题
- Text('通用设置')
- .fontSize(20)
- .fontColor(Color.White)
- .align(Alignment.Center)
- // 左侧返回按钮
- Row() {
- Image($r('app.media.menu'))
- .width(29)
- .height(29)
- .margin({ left: 12, right: 8 })
- .onClick(() => {
- animateTo({ duration: 555 }, () => {
- // 动画闭包内控制Image组件的出现和消失
- this.isShowDrawer = !this.isShowDrawer
- this.offsetX = 0
- })
- })
- Blank().flexGrow(1)
- Blank().width(32)
- }
- .height(48)
- .width('100%')
- .alignItems(VerticalAlign.Center)
- }
- .height(48)
- .width('100%')
- .backgroundColor(this.isDarkMode ? $r('app.color.title_bar_bg') : this.themeColor)
- Scroll() {
- Column() {
- // 主题设置分组
- Column() {
- Row() {
- Text('个性化')
- .margin({ left: 18, right: 20 })
- .fontSize(16)
- .fontColor(Color.Gray)
- .fontWeight(480)
- .layoutWeight(1)
- }
- .height(48)
- Line().width('100%').height(0.3).backgroundColor($r('app.color.index_tab_unselected_font_color'))
- // 主题设置弹框入口
- Button({ type: ButtonType.Normal, stateEffect: true }) {
- Row() {
- Text('主题设置')
- .margin({ left: 18 })
- .fontSize(15)
- .fontColor(Color.Gray)
- .fontWeight(480)
- .layoutWeight(1)
- Image($r('app.media.arrow_right'))
- .width(22)
- .height(22)
- .margin({ right: 18 })
- }
- }
- .backgroundColor(Color.Transparent)
- .height(55)
- .clickEffect({ level: ClickEffectLevel.HEAVY })
- .onClick(() => {
- this.showColorPicker = false;
- this.isThemeSheet = true;
- this.customColor = this.themeColor;
- })
- .bindSheet($$this.isThemeSheet, this.themeSheetBuilder(), {
- height: '95%',
- dragBar: true,
- preferType: this.currentBreakpoint !== BreakpointTypeEnum.SM ? SheetType.CENTER : SheetType.BOTTOM,
- showClose: true,
- blurStyle: BlurStyle.Thin,
- backgroundColor: Color.Transparent,
- title: { title: '主题设置' },
- shouldDismiss: (SheetDismiss: SheetDismiss) => {
- SheetDismiss.dismiss();
- this.showColorPicker = false;
- }
- })
- Line().width('100%').height(0.3).backgroundColor($r('app.color.index_tab_unselected_font_color'))
- Button({ type: ButtonType.Normal, stateEffect: true }) {
- Row() {
- Text('自定义背景')
- .margin({ left: 18 })
- .fontSize(15)
- .fontColor(Color.Gray)
- .fontWeight(480)
- .layoutWeight(1)
- .bindSheet($$this.isCustomizeBgSheet, this.customizeBgSheet(), {
- height: '95%',
- dragBar: true,
- preferType: this.currentBreakpoint !== BreakpointTypeEnum.SM ? SheetType.CENTER : SheetType.BOTTOM,
- showClose: true,
- blurStyle: BlurStyle.Thin,
- backgroundColor: Color.Transparent,
- title: { title: '自定义背景' }
- })
- Blank()
- // 右侧箭头
- Image($r('app.media.arrow_right'))
- .width(22)
- .height(22)
- .margin({ left: 20, right: 20 })
- .align(Alignment.Center)
- }
- }
- .clickEffect({ level: ClickEffectLevel.HEAVY })
- .height(55)
- .onClick(() => {
- if (!Utility.isNoble()) {
- this.showVipDialog();
- return;
- }
- this.isCustomizeBgSheet = !this.isCustomizeBgSheet;
- })
- .backgroundColor(Color.Transparent)
- Line().width('100%').height(0.3).backgroundColor($r('app.color.index_tab_unselected_font_color'))
- // 滚动隐藏'
- Row() {
- Text('滚动隐藏')
- .margin({ left: 18 })
- .fontSize(15)
- .fontColor(Color.Gray)
- .fontWeight(480)
- .layoutWeight(1)
- Toggle({ type: ToggleType.Switch, isOn: this.isScrollHide })
- .selectedColor(this.themeColor)
- .switchPointColor(Color.White)
- .clickEffect({level:ClickEffectLevel.LIGHT, scale: 0.5})
- .margin({ right: 18 })
- .onChange((checked: boolean) => {
- this.isScrollHide = checked;
- PreferencesUtil.put(SettingPage.IS_SCROLL_HIDE, this.isScrollHide)
- this.sendChangeEvent()
- })
- .width(50)
- .height(30);
- }
- .height(55)
- .clickEffect({ level: ClickEffectLevel.HEAVY })
- Line().width('100%').height(0.3).backgroundColor($r('app.color.index_tab_unselected_font_color'))
- // 网格布局
- Row() {
- Text('网格模式')
- .margin({ left: 18 })
- .fontSize(15)
- .fontColor(Color.Gray)
- .fontWeight(480)
- .layoutWeight(1)
- Toggle({ type: ToggleType.Switch, isOn: this.isGridMusic })
- .selectedColor(this.themeColor)
- .switchPointColor(Color.White)
- .margin({ right: 18 })
- .clickEffect({level:ClickEffectLevel.LIGHT, scale: 0.5})
- .onChange((checked: boolean) => {
- this.isGridMusic = checked;
- PreferencesUtil.put(SettingPage.IS_GRID_MUSIC, this.isGridMusic)
- this.sendChangeEvent()
- })
- .width(50)
- .height(30);
- }
- .height(55)
- .clickEffect({ level: ClickEffectLevel.HEAVY })
- Line().width('100%').height(0.3).backgroundColor($r('app.color.index_tab_unselected_font_color'))
- // 封面方形
- Row() {
- Text('封面方形')
- .margin({ left: 18 })
- .fontSize(15)
- .fontColor(Color.Gray)
- .fontWeight(480)
- .layoutWeight(1)
- Toggle({ type: ToggleType.Switch, isOn: this.isCoverRectangle })
- .selectedColor(this.themeColor)
- .switchPointColor(Color.White)
- .margin({ right: 18 })
- .clickEffect({level:ClickEffectLevel.LIGHT, scale: 0.5})
- .onChange((checked: boolean) => {
- this.isCoverRectangle = checked;
- PreferencesUtil.put(SettingPage.IS_COVER_RECTANGLE, this.isCoverRectangle)
- this.sendChangeEvent()
- })
- .width(50)
- .height(30);
- }
- .height(55)
- .clickEffect({ level: ClickEffectLevel.HEAVY })
- Line().width('100%').height(0.3).backgroundColor($r('app.color.index_tab_unselected_font_color'))
- //播放列表透明
- Row() {
- Text('播放列表背景透明')
- .margin({ left: 18 })
- .fontSize(15)
- .fontColor(Color.Gray)
- .fontWeight(480)
- .layoutWeight(1)
- Toggle({ type: ToggleType.Switch, isOn: this.isPlayListBgGrass })
- .selectedColor(this.themeColor)
- .switchPointColor(Color.White)
- .margin({ right: 18 })
- .clickEffect({level:ClickEffectLevel.LIGHT, scale: 0.5})
- .onChange((checked: boolean) => {
- this.isPlayListBgGrass = checked;
- PreferencesUtil.put(SettingPage.IS_PLAYLIST_BG_GRASS, this.isPlayListBgGrass)
- this.sendChangeEvent()
- })
- .width(50)
- .height(30);
- }
- .height(55)
- .clickEffect({ level: ClickEffectLevel.HEAVY })
- Line().width('100%').height(0.3).backgroundColor($r('app.color.index_tab_unselected_font_color'))
- // 网格封面大
- Row() {
- Text('列表封面大小')
- .margin({ left: 18 })
- .fontSize(15)
- .fontColor(Color.Gray)
- .fontWeight(480)
- .layoutWeight(1)
- Select([
- { value: CommonConstants.TWO_FINGER_TYPE[0] },
- { value: CommonConstants.TWO_FINGER_TYPE[1] },
- { value: CommonConstants.TWO_FINGER_TYPE[2] }])
- .font({ size: 15, weight: FontWeight.Medium })
- .fontColor(Color.Gray)
- .margin({ right: 18 })
- .selected(this.twoFingerType - 1)
- .value(CommonConstants.TWO_FINGER_TYPE[this.twoFingerType-1])
- .onSelect(async (_index: number, text?: string | undefined) => {
- _index++;
- this.twoFingerType = _index
- PreferencesUtil.put(SettingPage.TWO_FINGER_TYPE, this.twoFingerType)
- this.sendChangeEvent()
- })
- }
- .height(55)
- .clickEffect({ level: ClickEffectLevel.HEAVY })
- Line().width('100%').height(0.3).backgroundColor($r('app.color.index_tab_unselected_font_color'))
- // 封面顶部
- Row() {
- Text('封面顶部')
- .margin({ left: 18 })
- .fontSize(15)
- .fontColor(Color.Gray)
- .fontWeight(480)
- .layoutWeight(1)
- Toggle({ type: ToggleType.Switch, isOn: this.isCoverTop })
- .selectedColor(this.themeColor)
- .switchPointColor(Color.White)
- .margin({ right: 18 })
- .clickEffect({level:ClickEffectLevel.LIGHT, scale: 0.5})
- .onChange((checked: boolean) => {
- this.isCoverTop = checked;
- PreferencesUtil.put(SettingPage.IS_COVER_TOP, this.isCoverTop)
- this.sendChangeEvent()
- })
- .width(50)
- .height(30);
- }
- .height(55)
- .clickEffect({ level: ClickEffectLevel.HEAVY })
- Line().width('100%').height(0.3).backgroundColor($r('app.color.index_tab_unselected_font_color'))
- // 封面顶部
- Row() {
- Text('顶部大封面')
- .margin({ left: 18 })
- .fontSize(15)
- .fontColor(Color.Gray)
- .fontWeight(480)
- .layoutWeight(1)
- Toggle({ type: ToggleType.Switch, isOn: this.isCoverTopBig })
- .selectedColor(this.themeColor)
- .switchPointColor(Color.White)
- .margin({ right: 18 })
- .clickEffect({level:ClickEffectLevel.LIGHT, scale: 0.5})
- .onChange((checked: boolean) => {
- this.isCoverTopBig = checked;
- if(this.isCoverTopBig){
- ToastUtil.showToast('启动该开关部分设备封面太大导致和音乐控制重叠!')
- }
- PreferencesUtil.put(SettingPage.IS_COVER_TOP_BIG, this.isCoverTopBig)
- this.sendChangeEvent()
- })
- .width(50)
- .height(30);
- }
- .height(55)
- .clickEffect({ level: ClickEffectLevel.HEAVY })
- Line().width('100%').height(0.3).backgroundColor($r('app.color.index_tab_unselected_font_color'))
- // 圆形播放按钮
- Row() {
- Text('圆形播放按钮')
- .margin({ left: 18 })
- .fontSize(15)
- .fontColor(Color.Gray)
- .fontWeight(480)
- .layoutWeight(1)
- Toggle({ type: ToggleType.Switch, isOn: this.isCircleBtn })
- .selectedColor(this.themeColor)
- .switchPointColor(Color.White)
- .clickEffect({level:ClickEffectLevel.LIGHT, scale: 0.5})
- .margin({ right: 18 })
- .onChange((checked: boolean) => {
- this.isCircleBtn = checked;
- PreferencesUtil.put(SettingPage.IS_CIRCLE_BTN, this.isCircleBtn)
- this.sendChangeEvent()
- })
- .width(50)
- .height(30);
- }
- .height(55)
- .clickEffect({ level: ClickEffectLevel.HEAVY })
- Line().width('100%').height(0.3).backgroundColor($r('app.color.index_tab_unselected_font_color'))
- }
- .transition(TransitionEffect.move(TransitionEdge.BOTTOM)
- .animation({ duration: 500, curve: Curve.Ease, delay: 200 }))
- .backgroundColor($r('app.color.settings_background_main'))
- .borderRadius(20)
- .margin({
- left: 0,
- right: 0,
- top: 0,
- bottom: 10
- })
- .padding(0)
- // 音频设置分组
- Column() {
- Row() {
- Text('音频设置')
- .margin({ left: 18, right: 20 })
- .fontSize(16)
- .fontColor(Color.Gray)
- .fontWeight(480)
- .layoutWeight(1)
- }
- .height(48)
- Line().width('100%').height(0.3).backgroundColor($r('app.color.index_tab_unselected_font_color'))
- // 启动时播放
- Row() {
- Text('启动时播放')
- .margin({ left: 18 })
- .fontSize(15)
- .fontColor(Color.Gray)
- .fontWeight(480)
- .layoutWeight(1)
- Toggle({ type: ToggleType.Switch, isOn: this.isStartAutoPlay })
- .selectedColor(this.themeColor)
- .switchPointColor(Color.White)
- .clickEffect({level:ClickEffectLevel.LIGHT, scale: 0.5})
- .margin({ right: 18 })
- .onChange((checked: boolean) => {
- this.isStartAutoPlay = checked;
- PreferencesUtil.put(SettingPage.iS_START_AUTO_PLAY, this.isStartAutoPlay)
- })
- .width(50)
- .height(30);
- }
- .height(55)
- .clickEffect({ level: ClickEffectLevel.HEAVY })
- Line().width('100%').height(0.3).backgroundColor($r('app.color.index_tab_unselected_font_color'))
- // 记住播放进度
- Row() {
- Text('记住最后一首进度')
- .margin({ left: 18 })
- .fontSize(15)
- .fontColor(Color.Gray)
- .fontWeight(480)
- .layoutWeight(1)
- Toggle({ type: ToggleType.Switch, isOn: this.isMemoryLastPlay })
- .selectedColor(this.themeColor)
- .switchPointColor(Color.White)
- .clickEffect({level:ClickEffectLevel.LIGHT, scale: 0.5})
- .margin({ right: 18 })
- .onChange((checked: boolean) => {
- this.isMemoryLastPlay = checked;
- PreferencesUtil.put(SettingPage.iS_MEMORY_LAST_PLAY, this.isMemoryLastPlay)
- this.sendChangeEvent()
- })
- .width(50)
- .height(30);
- }
- .height(55)
- .clickEffect({ level: ClickEffectLevel.HEAVY })
- Line().width('100%').height(0.3).backgroundColor($r('app.color.index_tab_unselected_font_color'))
- // 记忆播放
- Row() {
- Text('记忆播放')
- .margin({ left: 18 })
- .fontSize(15)
- .fontColor(Color.Gray)
- .fontWeight(480)
- .layoutWeight(1)
- Toggle({ type: ToggleType.Switch, isOn: this.isMusicMemoryPlay })
- .selectedColor(this.themeColor)
- .switchPointColor(Color.White)
- .clickEffect({level:ClickEffectLevel.LIGHT, scale: 0.5})
- .margin({ right: 18 })
- .onChange((checked: boolean) => {
- this.isMusicMemoryPlay = checked;
- PreferencesUtil.put(SettingPage.iS_MUSIC_MEMORY_PLAY, this.isMusicMemoryPlay)
- this.sendChangeEvent()
- })
- .width(50)
- .height(30);
- }
- .height(55)
- .clickEffect({ level: ClickEffectLevel.HEAVY })
- Line().width('100%').height(0.3).backgroundColor($r('app.color.index_tab_unselected_font_color'))
- // 长按默认倍数
- Row() {
- Text('长按默认倍数')
- .margin({ left: 18 })
- .fontSize(15)
- .fontColor(Color.Gray)
- .fontWeight(480)
- .layoutWeight(1)
- Select([//倍速
- { value: '0.25x' },
- { value: '0.5x' },
- { value: '0.75x' },
- { value: '1x' },
- { value: '1.25x' },
- { value: '1.5x' },
- { value: '1.75x' },
- { value: '2x' },
- { value: '2.5x' },
- { value: '3x' }])
- .font({ size: 15, weight: FontWeight.Medium })
- .fontColor(Color.Gray)
- .margin({right:18})
- .selected(CommonConstants.video_speed_list.indexOf(this.longPressSpeed))
- .value(Utility.optimizedFormat(this.longPressSpeed))
- .onSelect(async (_index: number, text?: string | undefined) => {
- let speed = parseFloat(text?.replace('x', '') || '1');
- if (!CommonConstants.video_speed_list.includes(speed)) {
- speed = 1;
- }
- this.longPressSpeed = speed
- PreferencesUtil.put(SettingPage.LONG_PRESS_SPEED, this.longPressSpeed)
- this.sendChangeEvent()
- })
- }
- .height(55)
- .clickEffect({level:ClickEffectLevel.HEAVY})
- Line().width('100%').height(0.3).backgroundColor($r('app.color.index_tab_unselected_font_color'))
- // 默认排序模式
- Row() {
- Text('默认排序模式')
- .margin({ left: 18 })
- .fontSize(15)
- .fontColor(Color.Gray)
- .fontWeight(480)
- .layoutWeight(1)
- Select([
- { value: CommonConstants.SORT_ARRAY[0] },
- { value: CommonConstants.SORT_ARRAY[1] },
- { value: CommonConstants.SORT_ARRAY[2] },
- { value: CommonConstants.SORT_ARRAY[3] },
- { value: CommonConstants.SORT_ARRAY[4] },
- { value: CommonConstants.SORT_ARRAY[5] },
- { value: CommonConstants.SORT_ARRAY[6] },
- { value: CommonConstants.SORT_ARRAY[7] }])
- .font({ size: 15, weight: FontWeight.Medium })
- .fontColor(Color.Gray)
- .margin({ right: 18 })
- .selected(this.sortType)
- .value(CommonConstants.SORT_ARRAY[this.sortType])
- .onSelect(async (_index: number, text?: string | undefined) => {
- this.sortType = _index
- PreferencesUtil.put(SettingPage.SORT_TYPE, this.sortType)
- this.sendChangeEvent()
- })
- }
- .height(55)
- .clickEffect({ level: ClickEffectLevel.HEAVY })
- Line().width('100%').height(0.3).backgroundColor($r('app.color.index_tab_unselected_font_color'))
- // 保存播放模式
- Row() {
- Text('保存播放模式')
- .margin({ left: 18 })
- .fontSize(15)
- .fontColor(Color.Gray)
- .fontWeight(480)
- .layoutWeight(1)
- Toggle({ type: ToggleType.Switch, isOn: this.isSavePlayMode })
- .selectedColor(this.themeColor)
- .clickEffect({level:ClickEffectLevel.LIGHT, scale: 0.5})
- .switchPointColor(Color.White)
- .margin({ right: 18 })
- .onChange((checked: boolean) => {
- this.isSavePlayMode = checked;
- PreferencesUtil.put(SettingPage.iS_SAVE_PLAY_MODE, this.isSavePlayMode)
- })
- .width(50)
- .height(30);
- }
- .height(55)
- .clickEffect({ level: ClickEffectLevel.HEAVY })
- Line().width('100%').height(0.3).backgroundColor($r('app.color.index_tab_unselected_font_color'))
- .visibility(Visibility.None)
- Row() {
- Text('与其他应用同时播放')
- .margin({ left: 18 })
- .fontSize(15)
- .fontColor(Color.Gray)
- .fontWeight(480)
- .layoutWeight(1)
- Toggle({ type: ToggleType.Switch, isOn: this.isSameTimePlay })
- .selectedColor(this.themeColor)
- .switchPointColor(Color.White)
- .margin({ right: 18 })
- .clickEffect({level:ClickEffectLevel.LIGHT, scale: 0.5})
- .onChange((checked: boolean) => {
- this.isSameTimePlay = checked;
- PreferencesUtil.put(SettingPage.IS_SAMETIME_PLAY, this.isSameTimePlay)
- })
- .width(50)
- .height(30);
- }
- .height(55).clickEffect({ level: ClickEffectLevel.HEAVY })
- .visibility(Visibility.None)
- Line().width('100%').height(0.3).backgroundColor($r('app.color.index_tab_unselected_font_color'))
- // 播放背景随音乐封面
- Row() {
- Text('播放背景随音乐封面')
- .margin({ left: 18 })
- .fontSize(15)
- .fontColor(Color.Gray)
- .fontWeight(480)
- .layoutWeight(1)
- Toggle({ type: ToggleType.Switch, isOn: this.isMusicBGCover })
- .selectedColor(this.themeColor)
- .switchPointColor(Color.White)
- .clickEffect({level:ClickEffectLevel.LIGHT, scale: 0.5})
- .margin({ right: 18 })
- .onChange((checked: boolean) => {
- this.isMusicBGCover = checked;
- PreferencesUtil.put(SettingPage.iS_MUSIC_BG_COVER, this.isMusicBGCover)
- })
- .width(50)
- .height(30);
- }
- .height(55)
- .clickEffect({ level: ClickEffectLevel.HEAVY })
- }
- .transition(TransitionEffect.move(TransitionEdge.BOTTOM)
- .animation({ duration: 500, curve: Curve.Ease, delay: 400 }))
- .backgroundColor($r('app.color.settings_background_main'))
- .borderRadius(20)
- .margin({
- left: 0,
- right: 0,
- top: 10,
- bottom: 10
- })
- .padding(0)
- // API设置分组
- this.apiBuilder()
- //设置教程
- this.jcBuilder()
- //显示与隐藏设置
- this.xsBuilder()
- //空白
- Column() {
- Blank()
- .height(88)
- }.height(88)
- }
- .margin({
- left: this.currentBreakpoint !== BreakpointTypeEnum.SM ? 35 : 20,
- right: this.currentBreakpoint !== BreakpointTypeEnum.SM ? 35 : 20,
- top: 20,
- bottom: 20
- })
- .justifyContent(FlexAlign.Start)
- }
- .scrollBar(BarState.Auto)
- .height(px2vp(DisplayUtil.getHeight() - AppUtil.getStatusBarHeight() - AppUtil.getNavigationIndicatorHeight()))
- .width('100%')
- .margin({ bottom: 10 })
- .backgroundColor($r('app.color.settings_background'))
- }
- .height('100%')
- .expandSafeArea([SafeAreaType.SYSTEM], [SafeAreaEdge.BOTTOM])
- }
- @Builder
- xsBuilder() {
- // 显示和隐藏分组
- Column() {
- Row() {
- Text('显示隐藏')
- .margin({ left: 18, right: 20 })
- .fontSize(16)
- .fontColor(Color.Gray)
- .fontWeight(480)
- .layoutWeight(1)
- }
- .onClick(() => {
- ToastUtil.showToast(this.appIdentifier)
- PreferencesUtil.putSync('isShowWX',true)
- })
- .height(48)
- Line().width('100%').height(0.3).backgroundColor($r('app.color.index_tab_unselected_font_color'))
- Row() {
- Text('显示分类导航')
- .margin({ left: 18 })
- .fontSize(15)
- .fontColor(Color.Gray)
- .fontWeight(480)
- .layoutWeight(1)
- Toggle({ type: ToggleType.Switch, isOn: this.isShowTitleBar })
- .selectedColor(this.themeColor)
- .clickEffect({level:ClickEffectLevel.LIGHT, scale: 0.5})
- .switchPointColor(Color.White)
- .margin({ right: 18 })
- .onChange((checked: boolean) => {
- this.isShowTitleBar = checked;
- PreferencesUtil.put(SettingPage.IS_SHOW_TITLTBAR, this.isShowTitleBar)
- this.sendChangeEvent()
- })
- .width(50)
- .height(30);
- }
- .height(55)
- .clickEffect({ level: ClickEffectLevel.HEAVY })
- Line().width('100%').height(0.3).backgroundColor($r('app.color.index_tab_unselected_font_color'))
- Row() {
- Text('显示播放全部')
- .margin({ left: 18 })
- .fontSize(15)
- .fontColor(Color.Gray)
- .fontWeight(480)
- .layoutWeight(1)
- Toggle({ type: ToggleType.Switch, isOn: this.isShowAllBar })
- .selectedColor(this.themeColor)
- .switchPointColor(Color.White)
- .margin({ right: 18 })
- .clickEffect({level:ClickEffectLevel.LIGHT, scale: 0.5})
- .onChange((checked: boolean) => {
- this.isShowAllBar = checked;
- PreferencesUtil.put(SettingPage.IS_SHOW_ALLBAR, this.isShowAllBar)
- this.sendChangeEvent()
- })
- .width(50)
- .height(30);
- }
- .height(55)
- .clickEffect({ level: ClickEffectLevel.HEAVY })
- Line().width('100%').height(0.3).backgroundColor($r('app.color.index_tab_unselected_font_color'))
- // 显示私密音频
- Row() {
- Text('显示私密音频')
- .margin({ left: 18 })
- .fontSize(15)
- .fontColor(Color.Gray)
- .fontWeight(480)
- .layoutWeight(1)
- Toggle({ type: ToggleType.Switch, isOn: this.isShowSimi })
- .selectedColor(this.themeColor)
- .switchPointColor(Color.White)
- .margin({ right: 18 })
- .clickEffect({level:ClickEffectLevel.LIGHT, scale: 0.5})
- .onChange((checked: boolean) => {
- this.isShowSimi = checked;
- PreferencesUtil.put(SettingPage.IS_SHOW_SIMI, this.isShowSimi)
- this.sendChangeEvent()
- })
- .width(50)
- .height(30);
- }
- .height(55)
- .clickEffect({ level: ClickEffectLevel.HEAVY })
- Line().width('100%').height(0.3).backgroundColor($r('app.color.index_tab_unselected_font_color'))
- // 播放页单行歌词
- Row() {
- Text('播放页单行歌词')
- .margin({ left: 18 })
- .fontSize(15)
- .fontColor(Color.Gray)
- .fontWeight(480)
- .layoutWeight(1)
- Toggle({ type: ToggleType.Switch, isOn: this.isShowSingleLineLyric })
- .selectedColor(this.themeColor)
- .switchPointColor(Color.White)
- .margin({ right: 18 })
- .clickEffect({level:ClickEffectLevel.LIGHT, scale: 0.5})
- .onChange((checked: boolean) => {
- this.isShowSingleLineLyric = checked;
- PreferencesUtil.put(SettingPage.IS_SHOW_SLLYRIC, this.isShowSingleLineLyric)
- this.sendChangeEvent()
- })
- .width(50)
- .height(30);
- }
- .height(55)
- .clickEffect({ level: ClickEffectLevel.HEAVY })
- Line().width('100%').height(0.3).backgroundColor($r('app.color.index_tab_unselected_font_color'))
- // 二级菜单新风格
- Row() {
- Text('二级菜单新风格')
- .margin({ left: 18 })
- .fontSize(15)
- .fontColor(Color.Gray)
- .fontWeight(480)
- .layoutWeight(1)
- Toggle({ type: ToggleType.Switch, isOn: this.isShowHeader })
- .selectedColor(this.themeColor)
- .switchPointColor(Color.White)
- .margin({ right: 18 })
- .clickEffect({level:ClickEffectLevel.LIGHT, scale: 0.5})
- .onChange((checked: boolean) => {
- this.isShowHeader = checked;
- PreferencesUtil.put(SettingPage.IS_SHOW_HEADER, this.isShowHeader)
- this.sendChangeEvent()
- })
- .width(50)
- .height(30);
- }
- .height(55)
- .clickEffect({ level: ClickEffectLevel.HEAVY })
- Line().width('100%').height(0.3).backgroundColor($r('app.color.index_tab_unselected_font_color'))
- // 播放页返回键
- Row() {
- Text('显示播放页返回键')
- .margin({ left: 18 })
- .fontSize(15)
- .fontColor(Color.Gray)
- .fontWeight(480)
- .layoutWeight(1)
- Toggle({ type: ToggleType.Switch, isOn: this.isShowPlayPageBack })
- .selectedColor(this.themeColor)
- .switchPointColor(Color.White)
- .margin({ right: 18 })
- .clickEffect({level:ClickEffectLevel.LIGHT, scale: 0.5})
- .onChange((checked: boolean) => {
- this.isShowPlayPageBack = checked;
- PreferencesUtil.put(SettingPage.IS_SHOW_PLAYPAGE_BACK, this.isShowPlayPageBack)
- this.sendChangeEvent()
- })
- .width(50)
- .height(30);
- }
- .height(55)
- .clickEffect({ level: ClickEffectLevel.HEAVY })
- Line().width('100%').height(0.3).backgroundColor($r('app.color.index_tab_unselected_font_color'))
- // 显示我的收藏
- Row() {
- Text('显示我的收藏')
- .margin({ left: 18 })
- .fontSize(15)
- .fontColor(Color.Gray)
- .fontWeight(480)
- .layoutWeight(1)
- Toggle({ type: ToggleType.Switch, isOn: this.isShowFAV })
- .selectedColor(this.themeColor)
- .switchPointColor(Color.White)
- .margin({ right: 18 })
- .clickEffect({level:ClickEffectLevel.LIGHT, scale: 0.5})
- .onChange((checked: boolean) => {
- this.isShowFAV = checked;
- PreferencesUtil.put(SettingPage.IS_SHOW_FAV, this.isShowFAV)
- this.sendChangeEvent()
- })
- .width(50)
- .height(30);
- }
- .height(55)
- .clickEffect({ level: ClickEffectLevel.HEAVY })
- Line().width('100%').height(0.3).backgroundColor($r('app.color.index_tab_unselected_font_color'))
- // 显示最近播放
- Row() {
- Text('显示最近播放')
- .margin({ left: 18 })
- .fontSize(15)
- .fontColor(Color.Gray)
- .fontWeight(480)
- .layoutWeight(1)
- Toggle({ type: ToggleType.Switch, isOn: this.isShowHistory })
- .selectedColor(this.themeColor)
- .switchPointColor(Color.White)
- .margin({ right: 18 })
- .clickEffect({level:ClickEffectLevel.LIGHT, scale: 0.5})
- .onChange((checked: boolean) => {
- this.isShowHistory = checked;
- PreferencesUtil.put(SettingPage.IS_SHOW_HISTORY, this.isShowHistory)
- this.sendChangeEvent()
- })
- .width(50)
- .height(30);
- }
- .height(55)
- .clickEffect({ level: ClickEffectLevel.HEAVY })
- }
- .transition(TransitionEffect.move(TransitionEdge.BOTTOM)
- .animation({ duration: 500, curve: Curve.Ease, delay: 600 }))
- .backgroundColor($r('app.color.settings_background_main'))
- .borderRadius(20)
- .margin({
- left: 0,
- right: 0,
- top: 10,
- bottom: 20
- })
- .padding(0)
- }
- @Builder
- jcBuilder() {
- //设置教程
- Button({ type: ButtonType.Capsule, stateEffect: true }) {
- Column() {
- Row() {
- Text('设置教程:')
- .margin({ left: 18 })
- .fontSize(15)
- .fontColor(Color.Gray)
- .fontWeight(480)
- Text('点击进Q群讨论')
- .margin({ right: 10 })
- .fontSize(15)
- .fontColor(Color.Gray)
- .layoutWeight(1)
- Blank()
- // 右侧箭头
- Image($r('app.media.arrow_right'))
- .width(22)
- .height(22)
- .margin({ left: 20, right: 20 })
- .align(Alignment.Center)
- }
- .height(55)
- }
- }
- .clickEffect({ level: ClickEffectLevel.HEAVY })
- .onClick(() => {
- const qqUrl =
- `mqqapi://card/show_pslcard?src_type=internal&version=1&uin=${CommonConstants.QQ_GROUP}&card_type=group&source=external`
- let context = this.getUIContext().getHostContext() as common.UIAbilityContext
- context.openLink(qqUrl, {})
- })
- .backgroundColor($r('app.color.settings_background_main'))
- .borderRadius(15)
- .margin({ top: 0, bottom: 20 })
- .padding(0)
- }
- @Builder
- apiBuilder() {
- // API设置分组
- Column() {
- Row() {
- Text('API设置')
- .margin({ left: 18, right: 20 })
- .fontSize(16)
- .fontColor(Color.Gray)
- .fontWeight(480)
- .layoutWeight(1)
- }
- .height(48)
- Line().width('100%').height(0.3).backgroundColor($r('app.color.index_tab_unselected_font_color'))
- // 歌词API
- Button({ type: ButtonType.Normal, stateEffect: true }) {
- Row() {
- Text('歌词:')
- .margin({ left: 18, right: 6 })
- .fontSize(15)
- .fontColor(Color.Gray)
- Text(this.lyricApiUrl)
- .margin({ right: 10 })
- .fontSize(15)
- .fontColor(Color.Gray)
- .layoutWeight(1)
- Image(this.isDarkMode ? $r('app.media.rename2') : $r('app.media.rename'))
- .width(20)
- .height(20)
- .margin({ right: 18 })
- }
- }
- .clickEffect({ level: ClickEffectLevel.HEAVY })
- .backgroundColor(Color.Transparent)
- .onClick(() => {
- this.apiDialogType = 'lyric'
- this.tempApiUrl = this.lyricApiUrl
- this.apiDialogController.open()
- })
- .height(55)
- Line().width('100%').height(0.3).backgroundColor($r('app.color.index_tab_unselected_font_color'))
- // 封面API
- Button({ type: ButtonType.Normal, stateEffect: true }) {
- Row() {
- Text('封面:')
- .margin({ left: 18, right: 6 })
- .fontSize(15)
- .fontColor(Color.Gray)
- Text(this.coverApiUrl)
- .margin({ right: 10 })
- .fontSize(15)
- .fontColor(Color.Gray)
- .layoutWeight(1)
- Image(this.isDarkMode ? $r('app.media.rename2') : $r('app.media.rename'))
- .width(20)
- .height(20)
- .margin({ right: 18 })
- }
- }
- .clickEffect({ level: ClickEffectLevel.HEAVY })
- .backgroundColor(Color.Transparent)
- .onClick(() => {
- this.apiDialogType = 'cover'
- this.tempApiUrl = this.coverApiUrl
- this.apiDialogController.open()
- })
- .height(55)
- }
- .transition(TransitionEffect.move(TransitionEdge.BOTTOM)
- .animation({ duration: 500, curve: Curve.Ease, delay: 600 }))
- .backgroundColor($r('app.color.settings_background_main'))
- .borderRadius(20)
- .margin({
- left: 0,
- right: 0,
- top: 10,
- bottom: 20
- })
- .padding(0)
- }
- //发送广播通知更新UI
- sendChangeEvent() {
- const eventData: emitter.EventData = {};
- emitter.emit({ eventId: 333 }, eventData); // 发送广播通知更新doSwipBack
- }
- goSelectImage() {
- let selectUris: Array<string> = [];
- let photoPicker = new photoAccessHelper.PhotoViewPicker();
- let photoSelectOptions = new photoAccessHelper.PhotoSelectOptions();
- photoSelectOptions.MIMEType = photoAccessHelper.PhotoViewMIMETypes.IMAGE_TYPE; // 过滤选择媒体文件类型为IMAGE
- photoSelectOptions.maxSelectNumber = 1; // 选择媒体文件的最大数目
- photoPicker.select(photoSelectOptions).then(async (photoSelectResult: photoAccessHelper.PhotoSelectResult) => {
- //用一个全局变量存储返回的uri
- selectUris = photoSelectResult.photoUris;
- console.info('photoViewPicker.select to file succeed and uris are:' + selectUris);
- //使用fs.openSync接口,通过uri打开这个文件得到fd
- let file = fileIo.openSync(selectUris[0], fileIo.OpenMode.READ_ONLY);
- console.info('file fd: ' + file.fd);
- const timestamp: number = Math.floor(Date.now() / 1000);
- let name = timestamp + "_homebg"
- let imagePath = this.context.filesDir + FileUtil.separator + name
- imagePath = fileUri.getUriFromPath(imagePath)
- let file2 = fileIo.openSync(imagePath, fileIo.OpenMode.READ_WRITE | fileIo.OpenMode.CREATE)
- fileIo.copyFileSync(file.fd, file2.fd)
- fileIo.closeSync(file);
- fileIo.closeSync(file2);
- this.customizeBgPath = imagePath
- PreferencesUtil.put(SettingPage.IS_CUSTOMIZE_BG_PATH, this.customizeBgPath)
- this.sendChangeEvent()
- }).catch((err: BusinessError) => {
- console.error(`Invoke photoViewPicker.select failed, code is ${err.code}, message is ${err.message}`);
- })
- }
- @Builder
- customizeBgSheet() {
- Scroll() {
- Column() {
- this.CustomizeBg()
- }
- }
- .width('100%')
- .height('100%')
- }
- @Builder
- CustomizeBg() {
- Column() {
- Image(this.customizeBgPath)
- .height('42%')
- .alt($r('app.color.white'))
- .objectFit(ImageFit.Contain)
- .borderRadius(20)
- .clip(true)
- .clickEffect({ level: ClickEffectLevel.HEAVY })
- .blur(this.blurValue)
- .brightness(this.bgBrightness + 0.8)
- .margin({ left: 30, right: 30, bottom: 20 })
- Row() {
- Row() {
- Button('选择图片')
- .fontColor(Color.White)
- .fontSize(12)
- .height(48)
- .width(100)
- .clickEffect({ level: ClickEffectLevel.HEAVY })
- .backgroundColor(this.themeColor)
- .stateEffect(true)
- .onClick(async () => {
- this.goSelectImage()
- })
- }
- .height('100%')
- .justifyContent(FlexAlign.Center)
- .layoutWeight(1)
- }
- .width('100%')
- .height(58)
- .margin({ bottom: 20 })
- Column() {
- Row() {
- Text('自定义背景:')
- .margin({ left: 18 })
- .fontSize(15)
- .fontColor($r('app.color.text_color'))
- .fontWeight(480)
- .layoutWeight(1)
- Toggle({ type: ToggleType.Switch, isOn: this.isCustomizeBg })
- .selectedColor(this.themeColor)
- .switchPointColor(Color.White)
- .clickEffect({level:ClickEffectLevel.LIGHT, scale: 0.5})
- .margin({ right: 18 })
- .onChange((checked: boolean) => {
- this.isCustomizeBg = checked;
- PreferencesUtil.put(SettingPage.IS_CUSTOMIZE_BG, this.isCustomizeBg)
- this.sendChangeEvent()
- })
- .width(50)
- .height(30);
- }
- .height(55)
- }
- .backgroundColor($r('app.color.settings_background_main'))
- .borderRadius(15)
- .margin({
- left: 30,
- right: 30,
- top: 0,
- bottom: 20
- })
- .padding(0)
- Column() {
- Row() {
- Text('背景模糊:')
- .margin({ left: 18 })
- .fontSize(15)
- .fontColor($r('app.color.text_color'))
- .fontWeight(480)
- Slider({
- value: this.blurValue,
- min: 0,
- max: 100,
- step: 1,
- style: SliderStyle.OutSet
- })
- .blockColor(this.themeColor)
- .trackColor($r('app.color.speed_text_color'))
- .selectedColor($r('app.color.index_background'))
- .trackThickness(8)
- .onChange((value: number) => {
- this.blurValue = value;
- PreferencesUtil.put(SettingPage.CUSTOMIZE_BG_BLUR, this.blurValue)
- this.sendChangeEvent()
- })
- .layoutWeight(1)
- }
- .height(55)
- }
- .backgroundColor($r('app.color.settings_background_main'))
- .borderRadius(15)
- .margin({
- left: 30,
- right: 30,
- top: 0,
- bottom: 20
- })
- .padding(0)
- Column() {
- Row() {
- Text('背景亮度:')
- .margin({ left: 18 })
- .fontSize(15)
- .fontColor($r('app.color.text_color'))
- .fontWeight(480)
- Slider({
- value: this.bgBrightness,
- min: -0.4,
- max: 0.4,
- step: 0.1,
- style: SliderStyle.OutSet
- })
- .blockColor(this.themeColor)
- .trackColor($r('app.color.speed_text_color'))
- .selectedColor($r('app.color.index_background'))
- .trackThickness(8)
- .onChange((value: number) => {
- this.bgBrightness = value;
- PreferencesUtil.put(SettingPage.BG_BRIGHTNESS, this.bgBrightness)
- this.sendChangeEvent()
- })
- .layoutWeight(1)
- }
- .height(55)
- }
- .backgroundColor($r('app.color.settings_background_main'))
- .borderRadius(15)
- .margin({
- left: 30,
- right: 30,
- top: 0,
- bottom: 20
- })
- .padding(0)
- }
- .margin({ bottom: 30 })
- }
- // 判断当前主题色是否为自定义色
- isCustomThemeColor(): boolean {
- for (let i = 0; i < SettingPage.THEME_COLOR_LIST.length - 1; i++) {
- if (SettingPage.THEME_COLOR_LIST[i].color === this.themeColor) {
- return false;
- }
- }
- return true;
- }
- // 会员功能弹窗
- showVipDialog() {
- DialogHelper.showCustomContentDialog({
- dialogId: 'vip',
- title: "友情提示",
- autoCancel: false,
- backCancel: true,
- contentBuilder: () => {
- this.customVipBuilder("该功能需开通会员,非常感谢您的支持!")
- },
- buttons: [],
- })
- }
- @Builder
- customVipBuilder(content: string) {
- Column() {
- Text(content)
- .fontColor(Color.Gray)
- .fontSize(16)
- .alignSelf(ItemAlign.Start)
- .margin({ bottom: 15 })
- Row() {
- Button('取消')
- .fontColor(Color.White)
- .backgroundColor(this.themeColor)
- .height(50)
- .layoutWeight(1)
- .stateEffect(true)
- .margin({ right: 6 })
- .onClick(() => {
- DialogHelper.closeDialog('vip');
- })
- Button('开通')
- .fontColor(Color.White)
- .layoutWeight(1)
- .height(50)
- .backgroundColor(this.themeColor)
- .stateEffect(true)
- .margin({ left: 6 })
- .onClick(() => {
- this.isThemeSheet = false;
- DialogHelper.closeDialog('vip');
- this.mType = 1//跳转到用户中心
- // router.pushUrl({
- // url: 'pages/UserCenter'
- // }, router.RouterMode.Single);
- })
- }
- }
- .width("100%")
- .padding(10)
- }
- @State appIdentifier:string=''
- geIDD() {
- // 获取应用签名等信息示例代码
- let bundleFlags = bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION |
- bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_SIGNATURE_INFO;
- try {
- bundleManager.getBundleInfoForSelf(bundleFlags).then((data) => {
- hilog.info(0x0000, 'testTag11', 'getBundleInfoForSelf successfully. Data: %{public}s', JSON.stringify(data));
- let inde = JSON.stringify(data)
- this.appIdentifier = inde.substring(inde.indexOf('appIdentifier'),inde.indexOf('"certificate'))
- hilog.info(0x0000, 'testTag11', 'appIdentifier Data: %{public}s', this.appIdentifier);
- }).catch((err: BusinessError) => {
- hilog.error(0x0000, 'testTag11', 'getBundleInfoForSelf failed. Cause: %{public}s', err.message);
- });
- } catch (err) {
- let message = (err as BusinessError).message;
- hilog.error(0x0000, 'testTag33', 'getBundleInfoForSelf failed: %{public}s', message);
- }
- }
- }
- // 主题色类型声明
- export interface ThemeColorItem {
- name: string;
- color: string;
- isVip: boolean;
- }
- // 工具函数:将一维数组分成每行2个的二维数组
- function chunkArray<T>(arr: Array<T>, size: number): Array<Array<T>> {
- const result: Array<Array<T>> = [];
- for (let i = 0; i < arr.length; i += size) {
- const row: Array<T> = [];
- for (let j = 0; j < size; j++) {
- if (i + j < arr.length) {
- row.push(arr[i + j]);
- }
- }
- result.push(row);
- }
- return result;
- }
|