HarmonyOS鸿蒙Next中顶栏沉浸光感按钮

HarmonyOS鸿蒙Next中顶栏沉浸光感按钮 问一下大家鸿蒙阅读app的顶栏是怎么出现现在这种,滑动上去带沉浸光感效果的按钮效果呀

图片

图片


更多关于HarmonyOS鸿蒙Next中顶栏沉浸光感按钮的实战教程也可以访问 https://www.itying.com/category-93-b0.html

14 回复

尊敬的开发者,您好
关于您反馈的问题

可以使用自定义沉浸光感的视觉效果

示例代码:

import { HdsNavigation, HdsNavigationTitleMode, HdsTabs, HdsTabsController, HdsNavigationMenuContentOptions, ScrollEffectType, hdsMaterial } from '@kit.UIDesignKit';
import { SymbolGlyphModifier } from '@kit.ArkUI';
 @Entry
 @Component
 export struct Index {
   private scrollerForScroll: Scroller = new Scroller();
   private controller: HdsTabsController = new HdsTabsController();
   @State customMaterialLevel: hdsMaterial.MaterialLevel = hdsMaterial.MaterialLevel.EXQUISITE;

   private menus: HdsNavigationMenuContentOptions = {
     value: [{
       content: {
         label: 'menu1',
         icon: $r('sys.symbol.square_and_pencil')
       }
     }, {
       content: {
         label: 'menu2',
         icon: $r('sys.symbol.star')
       }
     },{
       content: {
         label: 'menu3',
         icon: $r('sys.symbol.more')
       }
     }
     ]
   };

   aboutToAppear(): void {
     // 获取系统支持的材质类型,用于根据设备能力选择合适的材质等级
     let materialTypes: Array<hdsMaterial.MaterialType> = hdsMaterial.getSystemMaterialTypes();
     if (materialTypes.indexOf(hdsMaterial.MaterialType.IMMERSIVE) < 0) {
       // 当前设备不支持IMMERSIVE材质类型,则使用SMOOTH效果以优化性能,降低卡顿和发热风险
       this.customMaterialLevel = hdsMaterial.MaterialLevel.SMOOTH;
     }
   }

   build() {
     HdsNavigation() {
       HdsTabs({ controller: this.controller }) {
         ForEach(MENU_CONFIG, (item: MenuItem) => {
           TabContent() {
             Stack() {
               Scroll(this.scrollerForScroll) {
                 Column() {
                   Image($r('app.media.scenery01')).width('100%') // scenery为自定义资源,开发者需替换本地资源
                 }
               }
               .clipContent(ContentClipMode.SAFE_AREA)
               .height('100%')
             }
           }
           .tabBar(new BottomTabBarStyle({
             normal: item.symbolGlyph, selected: item.symbolGlyph1
           }, item.label))
         })
       }
       .barOverlap(true)
       .vertical(false)
       .barPosition(BarPosition.End)
       .barFloatingStyle({
         barBottomMargin: 28,
         systemMaterialEffect: {
           materialType: hdsMaterial.MaterialType.ADAPTIVE,
           materialLevel: this.customMaterialLevel // 底部悬浮页签自定义沉浸光感材质效果
         }
       })
     }
     .mode(NavigationMode.Stack)
     .titleBar({
       content: {
         title: {
           mainTitle: 'MainTitle',
         },
         menu: this.menus,
       },
       style: {
         scrollEffectOpts: {
           enableScrollEffect: false,
           scrollEffectType: ScrollEffectType.GRADIENT_BLUR,
         },
         systemMaterialEffect: {
           materialType: hdsMaterial.MaterialType.ADAPTIVE,
           materialLevel: this.customMaterialLevel // 标题栏按钮自定义沉浸光感材质效果
         },
       },
       avoidLayoutSafeArea: false,
       enableComponentSafeArea: false
     })
     .bindToScrollable([this.scrollerForScroll])
     .hideBackButton(false)
     .titleMode(HdsNavigationTitleMode.MINI)
     .ignoreLayoutSafeArea([LayoutSafeAreaType.SYSTEM], [LayoutSafeAreaEdge.TOP, LayoutSafeAreaEdge.BOTTOM])
   }
 }

 interface MenuItem {
   symbolGlyph: SymbolGlyphModifier,
   symbolGlyph1: SymbolGlyphModifier,
   label: string,
   defaultBgColor: ResourceColor,
   hoverBgColor: ResourceColor,
   pressBgColor: ResourceColor,
 };

 const MENU_CONFIG: MenuItem[] = [
   {
     symbolGlyph: new SymbolGlyphModifier($r('sys.symbol.alarm_fill_1')).renderingStrategy(SymbolRenderingStrategy.MULTIPLE_COLOR)
       .fontColor([$r('sys.color.ohos_id_color_bottom_tab_icon_off'),
         $r('sys.color.ohos_id_color_bottom_tab_icon_auxcolor_off02')]),
     symbolGlyph1: new SymbolGlyphModifier($r('sys.symbol.alarm_fill_1')).renderingStrategy(SymbolRenderingStrategy.MULTIPLE_COLOR)
       .fontColor([$r('sys.color.ohos_id_color_activated'), $r('sys.color.ohos_id_color_primary_contrary')]),
     label: '闹钟',
     defaultBgColor: Color.Transparent,
     hoverBgColor: $r('sys.color.ohos_id_color_hover'),
     pressBgColor: $r('sys.color.ohos_id_color_click_effect')
   },
   {
     symbolGlyph: new SymbolGlyphModifier($r('sys.symbol.worldclock_fill_2')).renderingStrategy(SymbolRenderingStrategy.MULTIPLE_COLOR)
       .fontColor([$r('sys.color.ohos_id_color_bottom_tab_icon_off'),
         $r('sys.color.ohos_id_color_bottom_tab_icon_auxcolor_off02')]),
     symbolGlyph1: new SymbolGlyphModifier($r('sys.symbol.worldclock_fill_2')).renderingStrategy(SymbolRenderingStrategy.MULTIPLE_COLOR)
       .fontColor([$r('sys.color.ohos_id_color_activated'), $r('sys.color.ohos_id_color_primary_contrary')]),
     label: '时钟',
     defaultBgColor: Color.Transparent,
     hoverBgColor: $r('sys.color.ohos_id_color_hover'),
     pressBgColor: $r('sys.color.ohos_id_color_click_effect')
   },
   {
     symbolGlyph: new SymbolGlyphModifier($r('sys.symbol.stopwatch_2')).renderingStrategy(SymbolRenderingStrategy.MULTIPLE_COLOR)
       .fontColor([$r('sys.color.ohos_id_color_bottom_tab_icon_off'),
         $r('sys.color.ohos_id_color_bottom_tab_icon_auxcolor_off02')]),
     symbolGlyph1: new SymbolGlyphModifier($r('sys.symbol.stopwatch_2')).renderingStrategy(SymbolRenderingStrategy.MULTIPLE_COLOR)
       .fontColor([$r('sys.color.ohos_id_color_activated'), $r('sys.color.ohos_id_color_primary_contrary')]),
     label: '秒表',
     defaultBgColor: Color.Transparent,
     hoverBgColor: $r('sys.color.ohos_id_color_hover'),
     pressBgColor: $r('sys.color.ohos_id_color_click_effect')
   }
 ];

参考文档:使用自定义沉浸光感效果

此外也可参考三方组件库:hds_button

更多关于HarmonyOS鸿蒙Next中顶栏沉浸光感按钮的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


看了下鸿蒙7的发布会,等7吧,到时候好像各种组件都提供接口了,

这个目前没有现成的组件,可以魔改封装多个HdsTabs实现(一个按钮用一个HdsTabs),关于自定义Tab内容可以参考我的这篇实战文章:

沉浸光感HDS底部页签:HdsTabs自定义tabBar解决方案

找HarmonyOS工作还需要会Flutter的哦,有需要Flutter教程的可以学学大地老师的教程,很不错,B站免费学的哦:https://www.bilibili.com/video/BV1S4411E7LY/?p=17,

还是推荐官方的集合:

【开发者实践】HarmonyOS 6.1.0 创新特性“悬浮页签+沉浸光感”精品文章专题

https://developer.huawei.com/consumer/cn/forum/topic/0203212953843950072?fid=0109140870620153026&ha_source=znx

cke_2259.png

刚刚发现官方的一个新demo,参考一下:

https://gitcode.com/HarmonyOS_Samples/Spatialization/tree/dev

HarmonyOS的分布式文件系统让我在多设备间传输文件变得轻松无比。

开发者您好,目前没有现成的组件,可以魔改封装多个HdsTabs实现(一个按钮用一个HdsTabs),

期待HarmonyOS能在未来推出更多针对特定场景的优化功能。

开发者您好,预计【26年9月下旬到10月上旬】交付,版本发布时间以官网为准。

支持一下

HdsTab组件

HdsTab结合Blank+非安全区,

在HarmonyOS Next中,顶栏沉浸光感按钮通过ArkUI实现。启用全屏沉浸使用windowStage.getMainWindow().setWindowLayoutFullScreen(true)。利用@State@Watch监听环境亮度或背景色,调用@ohos.multimedia.image分析区域亮度,动态切换按钮foregroundColorimage资源,达成自动光感适配。

在 HarmonyOS 鸿蒙 Next 中实现顶栏随滑动展现沉浸光感按钮效果,主要是利用 Scroll 组件滚动位置监听,结合 状态变量 动态调整顶栏样式。滑动时,根据 scrollOffset 计算透明度与模糊度,使顶栏从透明渐变为毛玻璃质感;同时按钮通过 onTouch 或动态着色触发光感反馈,比如渐变色彩、缩放动画等。沉浸光感常用 .blendMode 或背景模糊 .backdropBlur 配合渐变遮罩来实现,配合 animateTo 显式动画,即可达到阅读 App 那种平滑过渡的光影效果。

回到顶部