首页 > 其他分享 >HarmonyOS瀑布流的实现-------唐朝诡事录人物简介

HarmonyOS瀑布流的实现-------唐朝诡事录人物简介

时间:2024-07-28 20:27:33浏览次数:7  
标签:name url media image 诡事录 ------- HarmonyOS 瀑布 introduce

HarmonyOS瀑布流的实现


介绍

  • 当下的大多数产品中瀑布流是一种非常常见的组件,本文将介绍关于waterflow的图片浏览

功能介绍

  • 使用瀑布流实现图片展示
  • 如下图是利用瀑布流做的一个唐朝诡事录人物简介
    瀑布流案例

代码结构

├──entry/src/main/ets                     // 代码区
│  ├──common
│  ├──entryability
│  │  └──EntryAbility.ets                 // 程序入口类
│  ├──pages
│  │  └──Index.ets                     // 主界面
│  ├──view
│  │  ├──FlowItemComponent.ets            // 瀑布流Item组件类
│  │  └──WaterFlowComponent.ets           // 自定义组件类
│  └──viewmodel
│     ├──HomeViewModel.ets                // 瀑布流数据类
│     ├──ProductItem.ets                  // 数据结构类
│     └──WaterFlowDataSource.ets          // 瀑布流数据类

页面布局

@Entry
@Component
struct Index {

  build() {
      Column() {
        WaterFlowComponent();
      }
  }
}

整体结构非常简单就只有一个瀑布流组件。
由于数据量较多,所以我们这里采用懒加载(LazyForEach)方式。
使用LazyForEach进行数据懒加载,要求数据源实现IDataSource接口及成员方法。使用常量waterFlowData完成瀑布流数据项配置,包含图片资源。

数据结构类

首先根据自己的需求定义一个人物信息类和和其接口

export interface IProductItem{

  image_url:Resource;
  name:string;
  introduce:string;
}

export default class ProductItem implements IProductItem{
  image_url: Resource; //人物图片
  name: string;//人物姓名
  introduce: string;//人物简介

  constructor(props:ProductItem) {
    this.image_url = props.image_url;
    this.name = props.name;
    this.introduce = props.introduce;
  }
}

瀑布流数据数组

export class WaterFlowDataSource implements IDataSource{
    private dataArray:ProductItem[] = [];
    private listeners:DataChangeListener[]=[];


//设置瀑布流数据数组
    public setDataArray(productDataArray:ProductItem[]):void{
        this.dataArray = productDataArray;
    }

    //数据的总数
    public totalCount(): number {
        return this.dataArray.length;
    }

    public getData(index: number): ProductItem {
        return this.dataArray[index];
    }

    //注册数据改变的监听器
    registerDataChangeListener(listener: DataChangeListener): void {
        if(this.listeners.indexOf(listener)<0){
            this.listeners.push(listener);
        }
    }

    //注销数据改变的监听器
    unregisterDataChangeListener(listener: DataChangeListener): void {
        let pos =this.listeners.indexOf(listener);
        if(pos>=0){
            this.listeners.splice(pos,1);
        }
    }
}

瀑布流数据资源

资源图片均存放在resource中的media目录中,下面直接代码中直接引用即可

const waterFlowData:IProductItem[]=[
  {
    image_url:$r('app.media.suwuming'),
    name:'苏无名',
    introduce:'狄公弟子'
  },
  {
    image_url:$r('app.media.lulingfeng'),
    name:'卢凌风',
    introduce:'前金吾卫中郎将'
  },
  {
    image_url:$r('app.media.feijishi'),
    name:'费鸡师',
    introduce:'神医'
  },
  {
    image_url:$r('app.media.xijun'),
    name:'裴喜君',
    introduce:'擅长丹青'
  },
  {
    image_url:$r('app.media.yingtao'),
    name:'樱桃',
    introduce:'侠女'
  },
  {
    image_url:$r('app.media.taizi'),
    name:'太子李隆基',
    introduce:'唐玄宗'
  },
  {
    image_url:$r('app.media.gongzhu'),
    name:'公主',
    introduce:'太平公主'
  },
  {
    image_url:$r('app.media.qinxiaobai'),
    name:'秦孝白',
    introduce:'大唐第一画师'
  },
  {
    image_url:$r('app.media.liushiba'),
    name:'刘十八',
    introduce:'甘棠驿'
  },
  {
    image_url:$r('app.media.dugu'),
    name:'独孤遐叔',
    introduce:'爱做梦'
  },
  {
    image_url:$r('app.media.qinghong'),
    name:'轻红',
    introduce:'独孤遐叔之妻'
  },
]

export {waterFlowData};

瀑布流组件中子组件的构建

@Component
export default struct FlowItemComponent {
  item: ProductItem = waterFlowData[0];

  build() {
  //这个子组件采用Column布局 
    Column(){
    //图片的相关设置
      Image(this.item?.image_url)
        .width(400)
        .height(100)
        .objectFit(ImageFit.Contain)
        .margin({
          top:12,
          bottom:12
        })
        //姓名的相关设置
      Text(this.item?.name)
        .fontSize(24)
        .fontWeight(FontWeight.Bold)
        .alignSelf(ItemAlign.Start)
        .fontColor(Color.Black)
        //简介的相关设置
      Text(this.item?.introduce)
        .fontSize(24)
        .fontWeight(FontWeight.Bold)
        .alignSelf(ItemAlign.Start)
        .fontColor(Color.Black)
    }
    .borderRadius(10)
    .backgroundColor(Color.White)
    .padding({
      left:5,
      right:5,
      bottom:5
    })
  }

}

瀑布流效果的实现

瀑布流效果实现步骤如下:

  1. 在生命周期函数aboutToAppear()中初始化瀑布流数据。
  2. WaterFlow容器添加参数footer设置瀑布流滑动至尾部时展示的内容,提示已滑动到底部。
  3. LazyForEach()从数据源中按需迭代数据,在瀑布流容器子组件FlowItem内展示数据项。
  4. 使用瀑布流属性layoutDirection设置主轴方向为FlexDirection.Column列方向,columnsTemplate设置布局列数为两列,columnsGap列间距及rowsGaph行间距
@Component
export default struct WaterFlowComponent{
    private datasource:WaterFlowDataSource = new WaterFlowDataSource();

    aboutToAppear(): void {
    //初始化瀑布流数据
        this.datasource.setDataArray(waterFlowData);

    }

    build() {
        WaterFlow({footer:():void => this.itemFoot()}){
            LazyForEach(this.datasource,(item1:ProductItem)=>{
            //瀑布流容器子组件
                FlowItem(){
                //展示数据项
                    FlowItemComponent({item:item1})
                }
            },(item:ProductItem,index:number)=>JSON.stringify(item)+index.toString())//将对象转换为字符串
        }
        //对子组件重新布局
        .layoutWeight(1)
        //布局的主轴方向为列方向
        .layoutDirection(FlexDirection.Column)
        //列布局设置为两列
.columnsTemplate('1fr 1fr')
		//设置列间距
        .columnsGap(1)
        //设置行间距
        .rowsGap(1)
    }


//瀑布流尾部显示内容
    @Builder
    itemFoot() {
        Column() {
            Text('已经到底了')
                .fontColor(Color.Gray)
                .fontSize(15)
                .width('100%')
                .height(20)
                .textAlign(TextAlign.Center)
        }
    }
}

标签:name,url,media,image,诡事录,-------,HarmonyOS,瀑布,introduce
From: https://blog.csdn.net/samroom/article/details/140752776

相关文章

  • 深度模型中的优化 - 基本算法篇
    序言在深度学习中,模型优化是提升模型性能与训练效率的关键环节。深度模型通过优化算法不断调整其内部参数,以最小化损失函数,从而实现对复杂数据的有效拟合与预测。本篇章将简要概述深度模型中的几种基本优化算法,包括梯度下降法及其变种,这些算法在推动深度学习领域的发展中起......
  • 全网最全最新100道C++面试题:20-40
    前述:本文初衷是为了总结本人在各大平台看到的C++面经,我会在本文持续更新我所遇到的一些C++面试问题,如有错误请一定指正我。新建立了一个收集问答的仓库,欢迎各位小伙伴来更新鸭interview_experience:本仓库初衷是想为大家提供一个便利,全面,准确的面试题学习场地,大家都可以对仓库......
  • SciTech-BigDataAIML-Python Time Series Handbook - Kalman filter: 卡尔曼滤波器算
    网上文档:Python时间序列手册:有ipynb和PDF文件:https://filippomb.github.io/python-time-series-handbook/notebooks/07/kalman-filter.htmlMITPDF:AnIntroductiontotheKalmanFilter-MITIllinoisUniversityPDF:UnderstandingtheBasisoftheKalmanF......
  • Elasticsearch 入门实战(9)--Java API Client 使用二
    本文继续上文(Elasticsearch入门实战(5)--JavaAPIClient使用一(Index,Document,Ingest,SQLAPIs))介绍 JavaAPIClient,相关的环境及软件信息如下:CentOS 7.6.1810、Java1.8.0_341(客户端用)、Elasticsearch8.13.4、elasticsearch-java8.13.4。1、SearchAPIs1.1、Count......
  • KD-Tree 学习笔记
    KD-Tree学习笔记建树如果当前超长方体只有一个点,返回这个点选择一个维度(轮流)选择中位数(\(O(n)\))递归应用定理二维KDT中节点代表矩阵与任意一个矩形(边界上)有交的只有\(O(\sqrtn)\)个。证明:考虑一条直线,与KDT的交集,此层最多有两个,递归得到递归式,然后套主定理。......
  • 剪贴板工具 - CopyQ
    HelloWorld安装Windows(Scoop)scoopbucketaddextrasscoopinstallextras/copyq配置通过File菜单的Preferences项打开设置窗口。General通用勾选Vistylenavigation。Layout布局接着修改应用的布局:勾选Hidetoolbar、Hidetoolbarlabels,不显示工具......
  • 第十三节 JMeter基础-终级订单支付【IF控制器】
    声明:本文所记录的仅本次操作学习到的知识点,其中商城IP错误,请自行更改。 背景:电商系统主要的接口,到目前为止,就剩下最后的最重要的订单支付了。也是功能最多的一块,例如购物车提交订单、订单列表、订单详情、订单支付、订单取消、订单删除、订单收货、订单售后等等。思路:1、前提......
  • Python科研武器库 - 字符串操作 - 路径字符串分割 os.path.split()、os.path.splitext
    使用场景:科研中批量处理数据时的,文件路径分割以及文件格式判断。对于文件格式判断,是因为实际文件的格式多种多样,就拿图像为例,就有.png.jpg.bmp等等。更不用说,有时候还有一些干扰文件需要屏蔽(比如Mac系统的.DS_Store文件)。这就需要我们判断文件格式,再对特定格式的文件进行操......
  • 【esp32 学习笔记】(esp-idf 版本)从点灯开始——点亮LED
    【配置CMakeLists】首先配置自定义组件的CMake文件:components->led->CMakeLists.txt完整配置内容如下:file(TO_CMAKE_PATH"$ENV{IDF_PATH}"IDF_PATH) #将Windows下ESP-IDF的路径转化CMAKE路径idf_component_register(SRCS"led.c"          INCLUDE_......
  • Solution - Atcoder ARC114F Permutation Division
    令\(a\)为题目中的\(P\)。首先考虑后手的重排策略是什么。因为\(a\)是个排列,元素互不相同,那么肯定就是按照每一段的第一个数的大小,越大的放在越前面。那么当\(a_1\lek\)的时候,显然先手会把以\(1\simk\)开头来划分段。因为否则存在一个开头\(>k\)的段,后手把其放......