温馨提示:本篇博客的详细代码已发布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下载运行哦!
@Reusable
@Component
export struct ImageItemView {
// ...
}
@Component
:声明这是一个自定义组件,HarmonyOS 中所有 UI 组件必须使用此装饰器@Reusable
:实现组件复用机制,当组件被移除时会进入复用缓存池,下次创建时直接复用(类似 Android RecyclerView 的回收机制)aboutToAppear(): void {
this.initCurrentImageInfo(); // 初始化图片信息
}
@Consume private bgc: Color; // 共享背景色
@Link isEnableSwipe: boolean; // 控制滑动切换
@State isEnableOffset: boolean = false; // 位移开关
@State imageScaleInfo: ScaleModel; // 缩放状态
@State imageOffsetInfo: OffsetModel; // 位移状态
@Consume
:跨组件共享状态(与祖先组件的 @Provide
配对使用),这里用于全局背景色管理@Link
:父子组件双向绑定,isEnableSwipe
控制是否允许滑动切换图片@State
:组件内部状态管理,变化时会触发 UI 更新initCurrentImageInfo(): void {
const imageSource = image.createImageSource(this.imageUri);
imageSource.getImageInfo().then((data) => {
// 计算宽高比和默认尺寸
this.imageWHRatio = data.size.width / data.size.height;
this.imageDefaultSize = this.calcImageDefaultSize(...);
// 判断适配方向(宽度优先/高度优先)
this.fitWH = this.imageDefaultSize.width === windowWidth ? "width" : "height";
});
// 创建像素地图用于显示
imageSource.createPixelMap().then((data) => {
this.imagePixelMap = data;
});
}
calcImageDefaultSize
Image(this.imagePixelMap)
.width(this.fitWH === "width" ? $r(...) : undefined)
.height(this.fitWH === "height" ? $r(...) : undefined)
.aspectRatio(this.imageWHRatio)
.objectFit(ImageFit.Cover)
aspectRatio
自动计算另一维度$r("app.string...")
引用资源文件中的尺寸值(实现多设备适配)ImageFit.Cover
:保持宽高比缩放,使图片至少一边填满容器aspectRatio
配合实现自适应布局calcImageDefaultSize(imageWHRatio: number, size: window.Size): image.Size {
if (imageWHRatio > size.width / size.height) {
return { width: size.width, height: size.width / imageWHRatio };
} else {
return { height: size.height, width: size.height * imageWHRatio };
}
}
calcFitScaleRatio(imageSize: image.Size, windowSize: window.Size): number {
return Math.max(windowSize.width / imageSize.width,
windowSize.height / imageSize.height);
}