HarmonyOS鸿蒙Next中界面窗体阴影和半透明效果怎么做

HarmonyOS鸿蒙Next中界面窗体阴影和半透明效果怎么做 类似这种窗口半透明,并且加深阴影怎么做呢


更多关于HarmonyOS鸿蒙Next中界面窗体阴影和半透明效果怎么做的实战教程也可以访问 https://www.itying.com/category-93-b0.html

7 回复

楼主这个界面,应该是容器背景色设置了渐变和组件配置了阴影实现了组件的半透明和阴影效果,可以看下以下方案是否符合诉求:

【背景知识】

HarmonyOS提供阴影接口shadow可以为当前组件添加阴影效果,该接口支持两种类型参数:

  • ShadowOptions类型可自定义阴影效果,用于设置阴影的模糊半径、阴影的颜色、X轴和Y轴的偏移量。在ShadowOptions模式下,当radius=0或者color的透明度为0时,无阴影效果。
  • ShadowStyle类型可简单配置阴影样式,主要改变阴影的大小尺寸。
  • linearGradient设置组件的颜色渐变效果,支持方向控制和多颜色配置。
  • colors参数的约束:ResourceColor表示填充的颜色,number表示指定颜色所处的位置,取值范围为[0,1.0],0表示需要设置渐变色的容器的开始处,1.0表示容器的结尾处。想要实现多个颜色渐变效果时,多个数组中number参数建议递增设置,如后一个数组number参数比前一个数组number小的话,按照等于前一个数组number的值处理。

【解决方案】

@Component
struct shareTestComponent {
  @State gradientAngle: number = 135;
  @State currentColorIndex: number = 0;
  // 渐变色组(包含多个颜色方案)
  colorSchemes: Array<Array<[ResourceColor, number]>> = [
    [
      ['#1e90ff', 0.0],
      ['#4bb9e2', 0.5],
      ['#00bfff', 1.0]
    ],
    [
      ['#00bfff', 0.0],
      ['#4bb9e2', 0.5],
      ['#1e90ff', 1.0]
    ],
  ];

  build() {
    Column() {
      Column() {
        Text('上层组件')
      }
      .shadow({
        radius: 80,
        color: '#b3433f3f',
        // type: ShadowType.BLUR,
        offsetX: 0,
        offsetY: 80
      })
      .borderRadius(50)
      .width(300)
      .height(100)
      .borderColor(Color.White)
      .borderWidth(2)
      .justifyContent(FlexAlign.Center)
      .backgroundColor('#801e90ff')
      .linearGradient({
        angle: this.gradientAngle,
        direction: GradientDirection.LeftTop,
        colors: this.colorSchemes[this.currentColorIndex],
        repeating: true
      })

    }
    .width('100%')
    .height(200)
    .linearGradient({
      angle: this.gradientAngle,
      direction: GradientDirection.LeftTop,
      colors: this.colorSchemes[this.currentColorIndex],
      repeating: true
    })
    .justifyContent(FlexAlign.Center)
  }
}

更多关于HarmonyOS鸿蒙Next中界面窗体阴影和半透明效果怎么做的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


Row() {
  Column()
    .width(200)
    .height(300)
    .backgroundColor('#80FFFFFF') // 半透明白色背景
    .shadow({
      radius: 8,
      color: '#40000000',
      offsetY: 4
    })
}.backgroundColor(Color.Red)
.height('100%')

背景颜色透明加上阴影

关注,顶帖

可以用两个布局容器分别做阴影,

尝试参考以下代码:

// 在任意组件上添加阴影
Text('带阴影文本')
  .fontSize(20)
  .shadow({
    radius: 8,          // 阴影模糊半径
    color: Color.Gray,  // 阴影颜色
    offsetX: 4,         // X轴偏移量
    offsetY: 6          // Y轴偏移量
  })

// 容器组件示例
Column() {
  // 内容区域
}
.width('90%')
.height(200)
.backgroundColor(Color.White)
.shadow(ShadowStyle.OUTER_DEFAULT_MD) // 使用预设阴影样式

半透明效果:

// 在页面根布局设置半透明背景
Column() {
  // 页面内容
}
.width('100%')
.height('100%')
.backgroundColor('#80000000') // ARGB格式,80表示50%透明度

在HarmonyOS Next中,界面窗体阴影可通过设置组件的shadow属性实现,包括模糊半径、颜色和偏移量。半透明效果则通过设置组件的opacity或background属性中的alpha通道来完成。具体实现时,使用ArkUI的组件属性进行配置,无需依赖Java或C语言。

在HarmonyOS Next中,实现界面窗体的半透明和阴影效果,主要通过Window的属性和UI组件的样式来完成。

1. 窗体半透明效果

窗体的半透明效果主要通过设置Windowbackground属性来实现。

  • 方法一:在WindowStage中设置onWindowStageCreate生命周期中,获取当前窗口并设置其背景。

    import { window } from '@kit.ArkUI';
    
    onWindowStageCreate(windowStage: window.WindowStage) {
      // 获取主窗口
      let mainWindow = windowStage.getMainWindow();
      // 设置窗口背景为半透明黑色 (ARGB: A=0.5, R=0, G=0, B=0)
      // 格式为十六进制:0xAARRGGBB
      mainWindow.setWindowBackgroundColor('#80000000');
      // ... 其他窗口设置和UI加载
    }
    
    • #8000000080表示透明度(0x80约等于50%),000000表示黑色。你可以根据需要调整ARGB值。
  • 方法二:在UI页面根组件设置 你也可以在UI页面的根组件(如Column)上设置背景色,但这通常影响的是组件区域而非整个窗口(除非组件充满窗口)。

    @Entry
    @Component
    struct TransparentPage {
      build() {
        // 在根组件设置半透明背景
        Column() {
          // 页面内容...
        }
        .width('100%')
        .height('100%')
        .backgroundColor('#80000000') // 组件背景半透明
      }
    }
    

2. 窗体阴影效果

阴影效果主要通过UI组件的通用属性 shadow 来添加。这个属性可以应用于大多数容器组件(如ColumnRowStackFlex)和基础组件(如ButtonText)。

shadow 属性是一个对象,包含以下参数:

  • radius: 阴影模糊半径,值越大阴影越模糊、越柔和。必须设置,否则阴影不显示。
  • color: 阴影颜色。默认为黑色。
  • offsetX: 阴影在X轴方向的偏移量。正数向右。
  • offsetY: 阴影在Y轴方向的偏移量。正数向下。
  • fill: (可选)阴影是否填充组件内容区域。默认为false,阴影在组件背景框外显示;设为true时,阴影会填充至组件背景之下(常用于实现“发光”效果)。

示例代码:为一个卡片添加阴影

@Entry
@Component
struct ShadowExample {
  build() {
    Column() {
      // 一个带有阴影和半透明背景的卡片
      Column() {
        Text('HarmonyOS Next')
          .fontSize(20)
          .fontColor(Color.White)
        Text('阴影与半透明示例')
          .fontSize(14)
          .fontColor(Color.White)
          .opacity(0.8)
      }
      .padding(20)
      .width('90%')
      .backgroundColor('#CC333333') // 卡片本身为深色半透明
      .borderRadius(16) // 圆角,阴影会跟随圆角形状
      // 设置阴影
      .shadow({
        radius: 20,        // 模糊半径
        color: '#40000000', // 半透明黑色阴影
        offsetX: 0,
        offsetY: 5        // 阴影向下偏移5vp
      })
    }
    .width('100%')
    .height('100%')
    .justifyContent(FlexAlign.Center)
    .backgroundColor('#F5F5F5') // 页面背景色
  }
}

结合使用:半透明窗体与内部组件阴影

一个常见的场景是创建一个半透明的模态窗口(Dialog),其内部内容区域带有阴影以增强层次感。

// 模拟一个模态弹窗
@Entry
@Component
struct ModalDialogExample {
  build() {
    Stack({ alignContent: Alignment.Center }) {
      // 主页面内容(被遮罩)
      Column() {
        Text('主页内容')
      }
      .width('100%')
      .height('100%')

      // 半透明遮罩层
      Column()
        .width('100%')
        .height('100%')
        .backgroundColor('#60000000') // 深色半透明遮罩

      // 弹窗内容(带有阴影)
      Column() {
        Text('弹窗标题')
          .fontSize(18)
          .margin({ bottom: 10 })
        Text('这是一个带有阴影的半透明弹窗示例。')
      }
      .padding(30)
      .width('80%')
      .backgroundColor(Color.White) // 弹窗背景为白色
      .borderRadius(24)
      // 为弹窗添加显著的阴影
      .shadow({
        radius: 35,
        color: '#30000000',
        offsetX: 0,
        offsetY: 10
      })
    }
    .width('100%')
    .height('100%')
  }
}

关键点总结:

  1. 窗体半透明:使用window模块的setWindowBackgroundColor方法,或在根组件设置backgroundColor为带透明通道的颜色(格式#AARRGGBB)。
  2. 组件阴影:使用组件的.shadow()样式方法,务必设置radius(模糊半径),并可通过offsetXoffsetY控制阴影方向,color控制阴影颜色和透明度。
  3. 组合效果:通过Stack布局叠加半透明遮罩层和带有阴影的组件,可以轻松实现模态对话框等高级界面效果。
回到顶部