HarmonyOS Next自定义Scroll滑动 指示器

最近项目中有个需求,关于滑动组件 Scroll 底部指示器跟随手势滑动等比例展示的效果,下图展示了要实现的效果。

image.png

自定义指示器组件

这里其实不是一个进度条,所以需要我们需要自定义绘制该组件,在鸿蒙中绘制组件单独使用,用于在页面上绘制指定的图形。有7种绘制类型,分别为Circle(圆形)、Ellipse(椭圆形)、Line(直线)、Polyline(折线)、Polygon(多边形)、Path(路径)、Rect(矩形),这里我么使用 Rect 进行矩形绘制,一个黑色的 Rect当做指示器的背景,蓝色当做指示器的进度。然后动态设置进度的左边距。

@Entry
@Component
export struct RectIndicator {

  @Prop marginLeft: number = 0 //indicator距离进度距离左边间距,默认是 0
  indicatorHeight: number = 20 //indicator的高度
  indicatorWidth: number = 200 //indicator的背景宽度
  indicatorProgressWidth: number = 160 //indicator 的进度宽度

  build() {
    Stack() {
      //绘制矩形背景
      Rect({ width: this.indicatorWidth, height: this.indicatorHeight })
        .radius(this.indicatorHeight / 2)
        .fill($r('app.color.bg_gray'))
        .stroke(Color.Transparent)

      //绘制矩形进度
      Rect({ width: this.indicatorProgressWidth, height: this.indicatorHeight })
        .radius(this.indicatorHeight / 2)
        .fill($r('app.color.main_color'))
        .margin({ left: this.marginLeft })
        .stroke(Color.Transparent)
    }.alignContent(Alignment.Start)
  }
}

添加 Scroll 监听

新建一个 RectIndicator 类,需要把两个矩形层叠在一起,所以外层使用Stack布局进行嵌套。调用该自定义组件的时候,可以设置 组件的宽度(indicatorWidth) ,高度(indicatorHeight),进度的宽度(indicatorProgressWidth)以及动态设置进度的左边距(marginLeft),可以通过监听 Scroll 的滑动事件来动态设置 marginLeft。

Scroll(this.scroll) {
   Row() {
     ForEach(SUB_MENUS, (item: Menu, index) => {
       Column() {
         Image(item.menuIcon).width(28).height(28)
         Text(item.menuText).fontSize(12).fontColor($r("app.color.text_two")).margin({ top: 5 })
       }.width("20%").id("item")
     })
   }
 }.scrollable(ScrollDirection.Horizontal)
 .margin({ top: 12 })
 .scrollBar(BarState.Off)
 //滑动监听
 .onDidScroll((_xOffset, _yOffset, scrollState) => {
   //当前状态为滑动状态
   if (scrollState == ScrollState.Scroll) {
     //获取滚动的偏移量,通过控制器获取比较准确
     const currentOffsetX = this.scroll.currentOffset().xOffset
     LogUtil.debug("滑动偏移量", vp2px(currentOffsetX).toString())
     //子组件宽度*2=未显示出来的组件/指示器灰色部分
     let ratio = this.itemWidth * 2 / 10
     //指示器进度的偏移量=scroll 的偏移量/比率
     this.indicatorLeft = vp2px(currentOffsetX) / ratio
   }
 })

onDidScroll 可以对滑动组件(包括但不限于 Scroll)设置监听,这里判断 scrollState 为滑动状态,获取当前滑动的偏移量 currentOffsetX,通过Scroll 的偏移量计算出 指示器的左间距(indicatorLeft)。

使用自定义RectIndicator组件

 RecIndicator({
          marginLeft: this.indicatorLeft, //左间距
          indicatorHeight: 4,  //指示器的高度
          indicatorWidth: 30,  //指示器的背景宽度
          indicatorProgressWidth: 20  //指示器进度的宽度
 }).margin({ top: 8, bottom: 8 })

使用方法:调用RecIndicator自定义组件,将高度,宽度等相关参数传递组件内,这里的进度宽度,可以通过 Scroll 组件长度计算出来,这里我就这只给一个宽度,不影响使用。

需要注意的是,indicatorLeft需要加一个@State 注解,保证组件可以根据indicatorLeft来实时刷新 UI。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 225,337评论 6 524
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 96,560评论 3 406
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 172,632评论 0 370
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 61,219评论 1 303
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 70,219评论 6 401
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 53,670评论 1 316
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 42,018评论 3 431
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 41,000评论 0 280
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 47,552评论 1 326
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 39,565评论 3 347
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 41,692评论 1 355
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 37,280评论 5 351
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 43,009评论 3 341
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 33,435评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 34,587评论 1 277
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 50,276评论 3 383
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 46,752评论 2 367

推荐阅读更多精彩内容