HarmonyOS 消息首页框架实现

具体需求如下:

1、顶部是自定义的每3秒滚动一次的view,左右图标和去看看跟随内容一起滚动(数据为后台返回动态数据)。

2、中间是固定的四个入口。

3、热门资讯、健康养生这一行可左右滑动,可点击,数据为后台返回,如等于4个,则不显示最右侧的箭头,如超过4个,会显示箭头,点击箭头如视屏所示会出现浮窗效果,点击浮窗内容,刷新列表内容。

4、列表内容上滑时,滑到顶部下方区域,热门资讯、健康养生那一行会停留悬浮。当下拉到合适位置时会跟随列表下滑。

5、主要就是实现悬浮功能、弹窗功能、文字+图片自动滚动功能。

HarmonyOS
2024-10-08 11:13:21
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
zxjiu

可以参考如下demo:

class MyDataSource implements IDataSource {  
  private list: number[] = []  
  constructor(list: number[]) {  
    this.list = list  
  }  
  totalCount(): number {  
    return this.list.length  
  }  
  getData(index: number): number {  
    return this.list[index]  
  }  
  registerDataChangeListener(listener: DataChangeListener): void {  
  }  
  unregisterDataChangeListener() {  
  }  
}  
@Entry  
@Component  
struct SwiperExample {  
  private swiperController: SwiperController = new SwiperController()  
  private data: MyDataSource = new MyDataSource([])  
  @State dataList: string[] = ['内部测试', '内部测试', '内部测试', '内部测试']  
  private arr: string[] = []  
  private scrollerForList: Scroller = new Scroller()  
  aboutToAppear(): void {  
    let list: number[] = []  
    for (let i = 1; i <= 10; i++) {  
      list.push(i);  
    }  
    this.data = new MyDataSource(list)  
    for (let i = 0; i < 20; i++) {  
      this.arr.push('内部测试' + i)  
    }  
  }  
  @State currentMenu: string = "测试0"  
  @State select: boolean = true  
  @State handlePopup: boolean = false  
  private controller: TabsController = new TabsController()  
  @Builder  
  textBuilder(content: string) {  
    Text(content)  
      .onClick(() => {  
        this.handlePopup = !this.handlePopup  
      })  
  }  
  @Builder  
  customDialogBuilder() {  
    Flex({ direction: FlexDirection.Row, wrap: FlexWrap.Wrap }) {  
      ForEach(this.arr, (item: string,index:number) => {  
        Text(item + index).height(40).onClick(() => {  
          this.currentMenu = item  
        }).width(80)  
      })  
    }  
    .width('100%')  
    .backgroundColor(0x80ffffff)  
  }  
  @Builder  
  CartItem() {  
    Row() {  
      Text(this.currentMenu)  
        .layoutWeight(1)  
      Image($r('app.media.startIcon'))  
        .width(60)  
        .height(60)  
    }  
    .height(70)  
    .backgroundColor(0x80ffffff)  
  }  
  build() {  
      Column({ space: 5 }) {  
        Column() {  
          Swiper(this.swiperController) {  
            LazyForEach(this.data, (item: string) => {  
              Row() {  
                Image($r('app.media.app_icon')).width(40).height(40)  
                Text(item.toString())  
                  .width("65%")  
                  .height(40)  
                  .backgroundColor(0xAFEEEE)  
                  .textAlign(TextAlign.Center)  
                  .fontSize(30)  
                Button('去看看').width(80).height(56)  
              }.backgroundColor(Color.Pink)  
            }, (item: string) => item)  
          }  
          .vertical(true)  
          .cachedCount(2)  
          .indicator(false)  
          .autoPlay(true)  
          .interval(4000)  
          .loop(true)  
          .width('100%')  
          .duration(1000)  
          .itemSpace(0)  
          .curve(Curve.Linear)  
        }.width('100%')  
        Scroll() {  
          Column() {  
            Row() {  
              Flex({ justifyContent: FlexAlign.SpaceAround }) {  
                ForEach(this.dataList, (item: string) => {  
                  Column() {  
                    Image($r('app.media.app_icon')).width(80).height(80)  
                    Text(item).fontSize(18)  
                  }  
                })  
              }  
            }.margin({ top: 20 })  
            Row() {  
              Stack() {  
                Tabs({ barPosition: BarPosition.Start, controller: this.controller }) {  
                  ForEach(this.arr, (item: string, index: number) => {  
                    TabContent() {  
                      List({ space: 10.5 }) {  
                        ForEach(this.arr, (item: string, index?: number): void => {  
                          ListItem() {  
                            this.CartItem()  
                          }  
                        })  
                      }  
                      .scrollBar(BarState.Off)  
                      .nestedScroll({  
                        scrollForward: NestedScrollMode.PARENT_FIRST,  
                        scrollBackward: NestedScrollMode.SELF_FIRST  
                      })  
                    }.tabBar(item)  
                  })  
                }  
                .vertical(false)  
                .scrollable(true)  
                .barMode(BarMode.Scrollable)  
                .barHeight(80)  
                .animationDuration(400)  
                .onChange((index: number) => {  
                  console.info(index.toString())  
                })  
                Image($r('app.media.app_icon'))  
                  .width('10%')  
                  .bindPopup(this.handlePopup, {  
                    builder: this.customDialogBuilder,  
                    enableArrow: false,  
                    radius: 0,  
                    mask: false,  
                    onStateChange: (e) => {  
                      if (!e.isVisible) {  
                        this.handlePopup = false  
                      }  
                    }  
                  })  
                  .onClick(() => {  
                    this.handlePopup = !this.handlePopup  
                    console.log('' + this.handlePopup)  
                  })  
                  .margin({ bottom: 690, left: 320 })  
              }  
            }  
            .width('100%')  
          }  
        }  
        .scrollBar(BarState.Off)  
      }  
      .width('100%')  
      .margin({ top: 5 })  
  }  
}
分享
微博
QQ
微信
回复
2024-10-08 16:15:31
相关问题
HarmonyOS 首页框架问题
244浏览 • 1回复 待解决
HarmonyOS 类似eventbus的事件消息框架
177浏览 • 1回复 待解决
框架如何获取系统所有通知消息
1752浏览 • 1回复 待解决
HarmonyOS 应用首页技术选型问题
218浏览 • 1回复 待解决
HarmonyOS 首页下拉刷新异常
172浏览 • 1回复 待解决
HarmonyOS 消息推送功能
116浏览 • 1回复 待解决
HarmonyOS 开发基础框架
226浏览 • 1回复 待解决
HarmonyOS 消息推送问题
254浏览 • 1回复 待解决
HarmonyOS Toast 消息提示
175浏览 • 1回复 待解决
HarmonyOS Navigation UI框架
195浏览 • 1回复 待解决
HarmonyOS 接受不到推送消息
128浏览 • 1回复 待解决