团队:坚果派[1] 公众号:“大前端之旅”[2] 润开鸿生态技术专家,华为HDE,CSDN博客专家,CSDN超级个体,CSDN特邀嘉宾,InfoQ签约作者,OpenHarmony布道师,电子发烧友专家博客,51CTO博客专家,擅长HarmonyOS/OpenHarmony应用开发、熟悉服务卡片开发。团队现有7个华为HDE,以及若干对鸿蒙应用开发有心得的人,欢迎合作。
image-20231126154851803
image-20231126154907218
image-20231126154926113
我们在鸿蒙的ark ui 里面列表使用我们的Swiper组件来实现 我们的轮播图
import { PictureItem } from '../bean/PictureItem';
/**
* Pictures of banner.
*/
export const PICTURE_BANNER: PictureItem[] = [
{ 'id': '1', 'name': '怒海', 'description': '怒海波涛', 'image': $r('app.media.image1') },
{ 'id': '2', 'name': '大山深处', 'description': '大山深处感人的亲情之歌', 'image': $r('app.media.image2') },
{ 'id': '3', 'name': '荒漠', 'description': '荒漠的亲情之歌', 'image': $r('app.media.image3') }
];
/**
* type of pictures.
*/
export enum PictureType {
BANNER = 'banner',
}
/**
* Picture entity class.
*/
export class PictureItem {
id: string;
name: string;
description: string;
image: Resource;
constructor(id: string, name: string, description: string, image: Resource) {
this.id = id;
this.name = name;
this.description = description;
this.image = image;
}
}
/**
* Common constants for all features.
*/
export class CommonConstants {
/**
* animation duration of tab content switching.
*/
static readonly DURATION_ADS = 200;
/**
* height of carousel title.
*/
static readonly HEIGHT_CAROUSEL_TITLE = 90;
/**
* fontSize of description.
*/
static readonly FONT_SIZE_DESCRIPTION = 12;
/**
* font size of title.
*/
static readonly FONT_SIZE_TITLE = 20;
static readonly FONT_WEIGHT_LIGHT = 400;
/**
* bold font.
*/
static readonly FONT_WEIGHT_BOLD = 700;
/**
* page layout weight.
*/
static readonly LAYOUT_WEIGHT = 1;
/**
* border angle.
*/
static readonly BORDER_RADIUS = 12;
/**
* line height for more.
*/
static readonly LINE_HEIGHT_MORE = 19;
/**
* rolling duration.
*/
static readonly SWIPER_TIME = 1500;
/**
* margin of text bottom.
*/
static readonly BOTTOM_TEXT = 4;
/**
* margin of banner top.
*/
static readonly TOP_ADS = 12;
/**
* margin of banner left.
*/
static readonly ADS_LEFT = 12;
/*
* maximum width.
*/
static readonly FULL_WIDTH = '100%';
/**
* maximum height.
*/
static readonly FULL_HEIGHT = '100%';
/**
* width of tab page.
*/
static readonly PAGE_WIDTH = '100%';
/**
* height of banner.
*/
static readonly HEIGHT_BANNER = '27%';
}
import router from '@ohos.router';
import { PictureItem } from '../bean/PictureItem';
import { PictureType } from '../constants/PictureConstants';
import { initializePictures, startPlay, stopPlay } from './PictureViewModel';
import { CommonConstants } from '../constants/CommonConstant';
@Extend(Text) function textStyle(fontSize: number, fontWeight: number) {
.fontSize(fontSize)
.fontColor($r('app.color.start_window_background'))
.fontWeight(fontWeight)
}
/**
* Carousel banner.
*/
@Component
export struct Banner {
@State index: number = 0;
private imageArray: Array<PictureItem> = [];
private swiperController: SwiperController = new SwiperController();
aboutToAppear() {
// Data Initialization.
this.imageArray = initializePictures(PictureType.BANNER);
// Turn on scheduled task.
startPlay(this.swiperController);
}
aboutToDisappear() {
stopPlay();
}
build() {
Swiper(this.swiperController) {
ForEach(this.imageArray, item => {
Stack({ alignContent: Alignment.TopStart }) {
Image(item.image)
.objectFit(ImageFit.Fill)
.height(CommonConstants.FULL_HEIGHT)
.width(CommonConstants.FULL_WIDTH)
.borderRadius(CommonConstants.BORDER_RADIUS)
.align(Alignment.Center)
.onClick(() => {
console.log("点击事件 item"+item.id)
})
Column() {
Text($r('app.string.movie_classic'))
.textStyle(CommonConstants.FONT_SIZE_DESCRIPTION, CommonConstants.FONT_WEIGHT_LIGHT)
.margin({ bottom: CommonConstants.BOTTOM_TEXT })
Text(item.name)
.textStyle(CommonConstants.FONT_SIZE_TITLE, CommonConstants.FONT_WEIGHT_BOLD)
}
.alignItems(HorizontalAlign.Start)
.height(CommonConstants.HEIGHT_CAROUSEL_TITLE)
.margin({ top: CommonConstants.TOP_ADS, left: CommonConstants.ADS_LEFT })
}
.height(CommonConstants.FULL_HEIGHT)
.width(CommonConstants.FULL_WIDTH)
}, item => JSON.stringify(item))
}
.width(CommonConstants.PAGE_WIDTH)
.height(CommonConstants.HEIGHT_BANNER)
.index(this.index)
.indicatorStyle({ selectedColor: $r('app.color.start_window_background') })
.indicator(true)
.duration(CommonConstants.DURATION_ADS)
}
}
.indicator(true)
.duration(CommonConstants.DURATION_ADS)
import { PictureItem } from '../bean/PictureItem';
import { PICTURE_BANNER} from '../constants/PictureConstants';
import { PictureType } from '../constants/PictureConstants';
import { CommonConstants } from '../constants/CommonConstant';
/**
* Initialize picture data according to type.
*
* @param initType Init type.
*/
export function initializePictures(initType: string): Array<PictureItem> {
let imageDataArray: Array<PictureItem> = [];
switch (initType) {
case PictureType.BANNER:
PICTURE_BANNER.forEach((item) => {
imageDataArray.push(new PictureItem(item.id, item.name, item.description, item.image));
})
break;
default:
break;
}
return imageDataArray;
}
let timerIds: number[] = [];
/**
* start scheduled task.
*
* @param swiperController Controller.
*/
export function startPlay(swiperController: SwiperController) {
let timerId = setInterval(() => {
swiperController.showNext();
}, CommonConstants.SWIPER_TIME);
timerIds.push(timerId);
}
/**
* stop scheduled task.
*/
export function stopPlay() {
timerIds.forEach((item) => {
clearTimeout(item);
})
}
arkui 写法和flutter非常的像 有兴趣的同学可以多尝试哈 今天的文章就讲到这里 。最后呢 希望我都文章能帮助到各位同学工作和学习 如果你觉得文章还不错麻烦给我三连 关注点赞和转发 谢谢
[1]
https://space.bilibili.com/480883651: https://link.juejin.cn?target=https%3A%2F%2Fspace.bilibili.com%2F480883651
[2]
https://mp.weixin.qq.com/s/p0Y5Z92CMzxiFmmBNuOzpw: https://link.juejin.cn?target=https%3A%2F%2Fmp.weixin.qq.com%2Fs%2Fp0Y5Z92CMzxiFmmBNuOzpw