HarmonyOS 鸿蒙Next中如何避免图片切换时动画异常

HarmonyOS 鸿蒙Next中如何避免图片切换时动画异常 【关键词】

动画样式、透明度、image、stack

【问题背景】

快应用中想在图片切换时加入一些动画效果,使用stack组件下使用两个image组件堆叠,一个image组件通过动画样式设置透明度从1-0隐藏起来,另一张显示出来,从而来实现图片切换效果,但是,前一张图片会概率性地闪现,然后消失。问题代码如下:

<template>
  <div class="page-wrapper">
    <input type="button" class="button" onclick="onCallAnimationClick" value="Animation 动画" />
    <stack style="width: 400px; height: 400px">
      <image class="img" id="img1" src="{{imgUrl}}" oncomplete="imgcomplete" />
      <image class="img" id="img2" if="{{ximg}}" src="{{preUrl}}" oncomplete="imgcomplete2" style="{{'opacity:' + preop + ';'}}" />
    </stack>
  </div>
</template>
<script>
  export default {
    data: {
      imgsrc: [
        "../Common/logo.png",
        "../Common/b.jpg",
        "../Common/logo.png",
        "../Common/b.jpg",
        "../Common/logo.png"
      ],
      imgUrl: '',
      preUrl: '',
      ximg: true,
      preop: 0,
      i: 0
    },
    onInit: function () {
      this.imgUrl = this.imgsrc[0]
    },
    onCallAnimationClick() {
      if (this.i > 3) {
        this.i = 0;
        this.imgUrl = this.imgsrc[this.i]
      } else {
        this.i++
        this.imgUrl = this.imgsrc[this.i]
      }
      console.log('imgcomplete=', this.i)
    },
    imgcomplete() {
      console.log('imgcomplete 1')
      this.preop = 1
      var options = {
        duration: 500,
        easing: 'linear',
        delay: 0,
        fill: 'forwards',
        iterations: 1
      }
      var frames = [{
        opacity: 1
      },
      {
        opacity: 0
      }];
      var animation = this.$element('img2').animate(frames, options);
      animation.play();
      var self = this
      animation.onfinish = function () {
        console.log("imgcomplete animation  onfinish");
        self.ximg = false
        self.preop = 0
        setTimeout(() => {
          self.ximg = true
          self.preUrl = self.$element("img1").attr.src
        }, 30);
      }
    },
    imgcomplete2() {
      console.log('imgcomplete 2')
      setTimeout(() => {
        this.preop = 1
      }, 50);
    },
  }
</script>
<style>
  .page-wrapper {
    flex-direction: column;
    justify-content: center;
    align-items: center;
  }
  .img {
    width: 100%;
    height: 100%;
  }
  .button {
    color: #20a0ff;
    background-color: #ffffff;
    padding: 10px 20px;
    border: 1px solid #20a0ff;
    border-radius: 40px;
  }
</style>

【问题分析】

上述代码用两个image组件实现了图片切换时淡入淡出的动画效果,主要是通过透明度实现的。第二个image的css中设置了透明度,但是imgcomplete()方法中又对该image组件做了透明度动画,透明度值从1到0,同时代码中又将css中绑定的透明度变量preop设置为1。

当动画方法完成时间早于css实现的时间,就会出现这个情况。

【解决方案】

  1. 将template中第二个image组件的style="{{‘opacity:’ + preop + ‘;’}}"去掉。
<image class="img" id="img2" if="{{ximg}}" src="{{preUrl}}" oncomplete="imgcomplete2" ></image>
  1. 改为通过动画样式来调用,从0-1变化。
imgcomplete2() {
  console.log('imgcomplete 2')
  var options = {
    duration: 10,
    easing: 'linear',
    delay: 0,
    fill: 'forwards',
    iterations: 1
  }
  var frames = [{
    opacity: 0
  },
  {
    opacity: 1
  }];
  var animation = this.$element('img2').animate(frames, options);
  animation.play();
},

更多关于HarmonyOS 鸿蒙Next中如何避免图片切换时动画异常的实战教程也可以访问 https://www.itying.com/category-93-b0.html

1 回复

更多关于HarmonyOS 鸿蒙Next中如何避免图片切换时动画异常的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,避免图片切换时动画异常,可以采取以下措施:

  1. 使用统一的动画框架:确保所有图片切换使用相同的动画框架和参数,避免不一致。
  2. 预加载图片:在动画开始前预加载图片,避免因加载延迟导致动画卡顿或异常。
  3. 优化动画时长:设置合理的动画时长,避免过长或过短导致视觉不适。
  4. 使用硬件加速:启用硬件加速提升动画流畅度,减少异常。
  5. 检查资源文件:确保图片资源正确且无损坏,避免因资源问题导致动画异常。
  6. 调试与测试:在不同设备和场景下测试,确保动画表现一致。

通过以上方法,可以有效避免图片切换时动画异常,提升用户体验。

回到顶部