ArkUI项目实战之基于eTS实现第三方分享弹出框(一) 原创 精华

Haoc_小源同学
发布于 2022-8-22 14:34
浏览
5收藏

@toc

前言

之前做#HarmonyOS技术训练营#基于JS实现的AI作诗应用的时候发现官方目前还不支持将内容分享至第三方应用,便有了开发这个组件的想法(后面听说官方接下来也将支持第三方分享弹出框了)。该项目为笔者花了大概一周的时间,文章将分为上下两部分,分别实现基本布局、Swiper滑动组件,一步一步带你玩转ArkUI框架开发!

概述

模拟鸿蒙操作系统上的分享弹框组件

演示效果

如下图所示,点击分享图标的时候(这里为一个Button按钮)弹出分享框,再次点击向下箭头时退出弹窗,不可通过点击遮障层退出,左右滑动可切换分页

ArkUI项目实战之基于eTS实现第三方分享弹出框(一)-鸿蒙开发者社区

关键代码

ArkUI项目实战之基于eTS实现第三方分享弹出框(一)-鸿蒙开发者社区

首先我们对弹出框的UI界面的布局进行分析,可以将布局分为两层,上面一层为一个箭头图标,下面则为显示可分享应用的区域,按照4*2进行排列。参考代码如下:

1.在index.ets中添加一个Button按钮,显示<font color=“red”>第三方分享弹出框</font>

@Entry
@Component
struct Index {
  build() {
    Row() {
      Column() {
        Button("第三方分享弹出框")
      }.width('100%')
    }.height('100%')
  }
}

2.新建一个自定义弹窗,并且为Button添加点击事件,点击时弹出弹窗

// 新建自定义弹窗
@CustomDialog
struct MyDialog {
  dialogController: CustomDialogController;

  build() {
    Column() {
      Row() {
        Image($r('app.media.ic_public_arrow_down_0'))
          .width(32)
          .height(32)
          .onClick(() => {
            this.dialogController.close()
          })
      }
      .justifyContent(FlexAlign.Center)

      Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.Start, wrap: FlexWrap.Wrap }) {
        Column() {
          Image($r('app.media.weixin'))
            .objectFit(ImageFit.None)
            .width(79)
            .height(79)
          Text('发送给朋友')
        }
        .padding(5)
      }
      .padding({ bottom: 50 })
    }
    .width('100%')
  }
}

其中布局关系如下图所示,由于箭头图标和下面蓝色显示区域为垂直方向布局,所以我们使用Column容器将两者包裹起来,使用Row布局容器展示箭头图片并设置居中显示,使用Flex弹性布局容器包裹多个Item,其中direction参数设置主轴为水平方向,wrap参数设置为多行排列。每个Item由图片以及文本上下分布组成,使用Column容器进行包裹

ArkUI项目实战之基于eTS实现第三方分享弹出框(一)-鸿蒙开发者社区

@Entry
@Component
struct Index {
// 实例化CustomDialogController构建MyDialog自定义弹窗
  dialogController: CustomDialogController = new CustomDialogController({
    builder: MyDialog()
  });

  build() {
    Row() {
      Column() {
        Button("第三方分享弹出框")
          // 添加按钮点击事件
          .onClick(() => {
            this.dialogController.open()
          })
      }.width('100%')
    }.height('100%')
  }
}

因为添加多个Item时,会造成代码过于冗余,而每个Item的结构都是一样的,所以我们可以自定义一个shareItem组件

ArkUI项目实战之基于eTS实现第三方分享弹出框(一)-鸿蒙开发者社区

@Component
struct shareItem {
  @State imgSrc: Resource = $r('app.media.icon')
  @State text: string = ''

  build() {
    Column() {
      Image(this.imgSrc)
        .objectFit(ImageFit.None)
        .width(79)
        .height(79)
      Text(this.text)
    }
    .padding(5)
  }
}

传入imgSrctext参数即可

shareItem({ imgSrc: $r('app.media.weixin'), text: '发送给朋友' })
shareItem({ imgSrc: $r('app.media.pengyouquan'), text: '发送到朋友圈' })
shareItem({ imgSrc: $r('app.media.qq'), text: '发送给朋友' })
shareItem({ imgSrc: $r('app.media.lanya'), text: '蓝牙' })
shareItem({ imgSrc: $r('app.media.zhifubao'), text: '支付宝' })

此时弹出框默认在屏幕中间显示,并且点击遮障层可退出弹窗,在实例化构建自定义弹窗时添加以下属性:

autoCancel: false,  // 不允许点击遮障层退出
alignment: DialogAlignment.Bottom,  // 设置弹窗在垂直底部对齐显示

可以看到此时弹窗已经在底部居中显示了,但是左右边框距离屏幕留有空间,再添加customStyle属性并设置为true,允许自定义弹窗样式

ArkUI项目实战之基于eTS实现第三方分享弹出框(一)-鸿蒙开发者社区

由于添加自定义样式属性后,弹框的基本样式失效,我们需要对其设置背景颜色以及边框圆角

build() {
  Column() {
	...
  }
  .width('100%')
  .backgroundColor('white')
  .borderRadius(35)
}

最终实现效果如下图所示:

ArkUI项目实战之基于eTS实现第三方分享弹出框(一)-鸿蒙开发者社区

由于目前eTS暂不支持设置边框部分圆角,这与鸿蒙系统实现的效果有一定区别,后期加入支持之后可进行优化

参考资料

1、@Component-组件化-声明式语法-基于TS扩展的声明式开发范式-UI开发-基于JS开发-开发-HarmonyOS应用开发 | HarmonyOS

2、@CustomDialog-组件化-声明式语法-基于TS扩展的声明式开发范式-UI开发-基于JS开发-开发-HarmonyOS应用开发 | HarmonyOS

结语

本期到这里结束啦!感谢看到最后的小伙伴们,不知道有没有讲得不清楚的或者写得不好的地方,欢迎指出来哦!下一期我们将使用Swiper滑动组件实现弹窗的滑动分页功能!

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
已于2022-9-15 13:58:08修改
7
收藏 5
回复
举报
3条回复
按时间正序
/
按时间倒序
红叶亦知秋
红叶亦知秋

为了更好的UI,能自定义的界面肯定是必要的

回复
2022-8-22 16:51:24
Tuer白晓明
Tuer白晓明

可以用Panel容器组件试试😉😉😉——Panel可滑动面板

回复
2022-8-22 21:57:02
Haoc_小源同学
Haoc_小源同学 回复了 Tuer白晓明
可以用Panel容器组件试试😉😉😉——Panel可滑动面板

感谢!当时开发的时候有注意到,回头可以试试

回复
2022-8-23 08:35:59
回复
    相关推荐