2 回复
参考如下demo
@Extend(Column)
function commonStyle(width: string, color: Resource, opacity: number) {
.width(width)
.height('100%')
.backgroundColor(color)
.opacity(opacity)
.borderRadius(2)
}
@Entry
@Component
export default struct YangTest1Page {
@State arr: number[] = [];
@State ColumnBgColor: Resource = $r('app.color.gray_C0C0C0') //C0C0C0
@State ColumnOpacityCom: number = 0.5;
@State ListOpacityCom: number = 0.5;
@State listItemHeight: string = '20%'
startAnimation() {
animateTo({
duration: 600, // 动画时长
tempo: 0.6, // 播放速率
curve: Curve.EaseInOut, // 动画曲线
delay: 200, // 动画延迟
iterations: -1, // 播放次数
playMode: PlayMode.Alternate, // 动画模式
onFinish: () => {
console.info('play end')
}
}, () => {
this.ListOpacityCom = 0.1;
})
}
build() {
Column() {
List({ initialIndex: 0 }) {
ForEach(this.arr, (item: number) => {
ListItem() {
Column() {
Row() {
Column().commonStyle('50%', this.ColumnBgColor, this.ColumnOpacityCom)
Column().commonStyle('30%', this.ColumnBgColor, this.ColumnOpacityCom)
}.justifyContent(FlexAlign.SpaceBetween).width('100%').height('25%')
Blank().height('8%')
Row() {
Column().commonStyle('50%', this.ColumnBgColor, this.ColumnOpacityCom)
Column().commonStyle('30%', this.ColumnBgColor, this.ColumnOpacityCom)
}.justifyContent(FlexAlign.SpaceBetween).width('100%').height('10%')
Blank().height('8%')
Row() {
Column().layoutWeight(1)
Column().commonStyle('30%', this.ColumnBgColor, this.ColumnOpacityCom)
}.justifyContent(FlexAlign.SpaceBetween).width('100%').height('10%')
Blank().height('8%')
Row()
.height('12%')
.backgroundColor(this.ColumnBgColor)
.width('100%')
.opacity(this.ColumnOpacityCom)
.borderRadius(2)
}.margin({ top: '4%', bottom: '2%' })
}
.width('90%')
.height(this.listItemHeight)
}, (item: number) => JSON.stringify(item))
}
.alignListItem(ListItemAlign.Center)
.listDirection(Axis.Vertical) // 排列方向
.divider({ strokeWidth: 1, color: $r('app.color.gray_F4F5F7') }) // 每行之间的分界线 F4F5F7
.edgeEffect(EdgeEffect.Spring) // 滑动到边缘无效果
.onScrollIndex((firstIndex: number, lastIndex: number) => {
console.info('first' + firstIndex)
console.info('last' + lastIndex)
})
.scrollBar(BarState.Off)
.opacity(this.ListOpacityCom)
.width('100%')
.onAppear(() => {
this.startAnimation()
})
}.width('100%').height('100%').padding({ top: 5 })
.onAreaChange((oldValue: Area, newValue: Area) => {
const listHeight = Number(newValue.height)
const length = Math.round(listHeight / 120)
for (let i = 0; i < length; i++) {
this.arr.push(i)
}
this.listItemHeight = Math.floor(100 / length) + '%'
})
}
}
更多关于HarmonyOS 鸿蒙Next 骨架屏的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
HarmonyOS 鸿蒙Next 骨架屏是一种用于在内容加载过程中向用户展示页面结构预览的技术,旨在提升应用界面的响应速度和用户体验。骨架屏通过提前展示页面的大致布局和占位符,使用户在数据加载时能够感知到应用的活跃状态,减少因长时间白屏或空屏造成的等待焦虑。
在HarmonyOS中实现骨架屏,开发者需要利用鸿蒙系统提供的UI组件和动画能力,设计并展示一个与最终页面布局一致的简化版本。这通常包括确定页面的基本框架、设置占位符的样式(如颜色、大小等)以及实现占位符的淡入淡出等动画效果。
鸿蒙Next版本可能提供了更丰富的API和工具来支持骨架屏的开发,使得实现过程更加简便和高效。开发者可以通过查阅鸿蒙官方文档,了解最新的API接口和使用方法,以便在应用中集成骨架屏功能。
值得注意的是,骨架屏的设计应与应用的整体风格和用户体验保持一致,避免过于复杂或突兀的动画效果,以确保用户界面的流畅性和一致性。
如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html