HarmonyOS 鸿蒙Next 循环Image,图片抖闪问题

发布于 1周前 作者 ionicwang 最后一次编辑是 5天前 来自 鸿蒙OS

HarmonyOS 鸿蒙Next 循环Image,图片抖闪问题

要实现头像循环轮播控件

Android:是这个思路

https://blog.csdn.net/hongli_sun/article/details/125878468?spm=1001.2014.3001.5506

鸿蒙把Text换成了Image,会出现图片抖闪现象

@ObservedV2

class HeadItem {

  title: string = ''

  @Trace scale: number = 1

  @Trace visible: boolean = true

  color: number = 0xFFFFFF * Math.random()

  imageUrl:string = ''

}

@Entry

@Component

export struct CatePage {

  @State headList:HeadItem[] = []

  scroller: Scroller = new Scroller()

  @State showIndex:number = 1

  intervalNum = -1

  @State ImageWidth:number = 50

  hotCrazyAvatarList: Array<string> = [];



  aboutToAppear(): void {

    this.hotCrazyAvatarList.push("http://file.bangruijituan.com/87ce36ddaade0f2814c12ab72fb2139e477d7de228fcfb8d32b7adfacce642af.png")

    this.hotCrazyAvatarList.push("https://pxmpic.cnrmall.com/matter/ad/8f/ad8fad7a7add568e178240ce63595b4f.png")

    this.hotCrazyAvatarList.push("https://pxmpic.cnrmall.com/matter/1e/73/1e73dc286dee292374fdf4b50bad18b2.png")

    this.hotCrazyAvatarList.push("https://pxmpic.cnrmall.com/matter/70/ac/70ac1fb6059cb1f8bb66a553268c0b8d.png")

    this.hotCrazyAvatarList.push("https://pxmpictest.cnrmall.com/matter/32/ea/32ea0aaede3aad42b151988f8708d3e2.png")

    this.hotCrazyAvatarList.push("http://file.bangruijituan.com/87ce36ddaade0f2814c12ab72fb2139e477d7de228fcfb8d32b7adfacce642af.png")

    this.hotCrazyAvatarList.push("https://pxmpic.cnrmall.com/matter/ad/8f/ad8fad7a7add568e178240ce63595b4f.png")

    this.hotCrazyAvatarList.push("https://pxmpic.cnrmall.com/matter/1e/73/1e73dc286dee292374fdf4b50bad18b2.png")

    this.hotCrazyAvatarList.push("https://pxmpic.cnrmall.com/matter/70/ac/70ac1fb6059cb1f8bb66a553268c0b8d.png")

    this.hotCrazyAvatarList.push("https://pxmpictest.cnrmall.com/matter/32/ea/32ea0aaede3aad42b151988f8708d3e2.png")

    for (let index = 0; index < this.hotCrazyAvatarList.length; index++) {

      let item = new HeadItem()

      item.title = index.toString()

      item.imageUrl  = this.hotCrazyAvatarList[index]

      this.headList.push(item)

    }

    this.showIndex = Math.floor(this.hotCrazyAvatarList.length / 2)

    this.showNext()

    this.intervalNum = setInterval(()=>{

      this.showNext()

    },2000)

  }

  aboutToDisappear(): void {

    clearInterval(this.intervalNum)

  }

  build() {

    Column() {

      Scroll(this.scroller){

        Row(){

          ForEach(this.headList,(item:HeadItem,index)=>{

            Image(item.imageUrl)

              .width(this.ImageWidth)

              .height(this.ImageWidth)

              .borderRadius('50%')

              .clip(true)

              .margin({left:-10})

              .scale({ x: item.scale, y: item.scale })

              .visibility(item.visible ? Visibility.Visible : Visibility.Hidden)

          })

        }

        .margin({left:-50})

      }

      .scrollBar(BarState.Off)

      .scrollable(ScrollDirection.Horizontal)

      .width(155)

      .height(100)

      .align(Alignment.Center)

      .hitTestBehavior(HitTestMode.None)

    }

  }

  showNext(){

    animateTo({

      duration: 1000,

      curve: Curve.EaseOut,

      iterations: 1,

      playMode: PlayMode.Normal,

      onFinish:()=>{

        this.headList.push(this.headList[0])

        this.headList.shift()

        this.scroller.scrollBy(-this.ImageWidth + 10,0)

      }

    }, () => {

      console.info("加入头像"+this.headList[this.showIndex].title)

      this.headList[this.showIndex].visible = true

      this.headList[this.showIndex + 1].visible = false

      this.headList[this.showIndex].scale = 1.1

      if(this.showIndex >= 3){

        this.headList[this.showIndex - 3].scale = 0.8

        this.headList[this.showIndex - 3].visible = false

      }

      this.scroller.scrollBy(this.ImageWidth - 10,0)

      if(this.showIndex === 0){

        this.headList[this.headList.length - 1].scale = 1

      }else{

        this.headList[this.showIndex - 1].scale = 1

      }

    })

  }

}

更多关于HarmonyOS 鸿蒙Next 循环Image,图片抖闪问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复
给ForEach设置下key值
ForEach(this.headList,(item:HeadItem,index)=>{
            Image(item.imageUrl)
              .width(this.ImageWidth)
              .height(this.ImageWidth)
              .borderRadius('50%')
              .clip(true)
              .margin({left:-10})
              .scale({ x: item.scale, y: item.scale })
              .visibility(item.visible ? Visibility.Visible : Visibility.Hidden)
          },(headItem:HeadItem,index)=>headItem.title)<button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 8px; right: 8px; font-size: 14px;">复制</button>

更多关于HarmonyOS 鸿蒙Next 循环Image,图片抖闪问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next系统中,遇到循环展示图片(Image)时出现抖闪问题,通常与图片的加载、渲染及内存管理有关。以下是一些可能的解决方案:

  1. 优化图片资源:确保图片格式(如PNG、JPEG)和大小适合设备性能,避免使用过大或未优化的图片。

  2. 使用图片缓存:通过实现图片缓存机制,减少重复加载同一图片的开销。可以利用系统提供的图片缓存接口或第三方库。

  3. 调整UI线程任务:确保图片加载和更新操作不在UI线程中频繁进行,可以使用异步任务或后台线程来处理这些操作。

  4. 检查动画和过渡效果:如果使用了动画或过渡效果,确保它们不会导致图片频繁重绘或加载,从而引发抖闪。

  5. 内存管理:检查应用的内存使用情况,确保在循环展示图片时,内存得到有效管理和释放,避免内存泄漏或内存紧张导致的性能问题。

  6. 更新系统或SDK:确保HarmonyOS系统或相关SDK是最新版本,以获取最新的性能优化和bug修复。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部