image组件动画问题

现象描述:

stack组件下使用两个image组件堆叠,一个image组件通过动画样式设置透明度从1-0,隐藏起来,另一张显示出来,从而来实现图片切换,前一张图片会概率性的闪现然后消失。

问题代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
<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>
?????<image?class="img"?id="img2"?if="{{ximg}}"?src="{{preUrl}}"?oncomplete="imgcomplete2"?style="{{‘opacity:‘?+?preop?+?‘;‘}}"></image>
????</stack>
??</div>
</template>
??
<script>
export?default?{
??data:?{
?????imgsrc:?["https://ss1.bdstatic.com/70cFuXSh_Q1YnxGkpoWK1HF6hhy/it/u=1603365312,3218205429&fm=26&gp=0.jpg",
????"https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fimg.aiimg.com%2Fuploads%2Fuserup%2F0909%2F2Z64022L38.jpg&refer=http%3A%2F%2Fimg.aiimg.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1611368024&t=879ac47e0bd97e413b5462946d9ae4ed",
????"https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fpic3.16pic.com%2F00%2F01%2F11%2F16pic_111395_b.jpg&refer=http%3A%2F%2Fpic3.16pic.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1611368024&t=70c702a55248113dafa6e243dc253625",
????"https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fa2.att.hudong.com%2F27%2F81%2F01200000194677136358818023076.jpg&refer=http%3A%2F%2Fa2.att.hudong.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1611368024&t=11199190c6ac8e3371f16d7568d40daa",
?????"https://ss1.bdstatic.com/70cFuXSh_Q1YnxGkpoWK1HF6hhy/it/u=1089874897,1268118658&fm=26&gp=0.jpg",
?????"https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fa3.att.hudong.com%2F92%2F04%2F01000000000000119090475560392.jpg&refer=http%3A%2F%2Fa3.att.hudong.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1611368024&t=3b33c5b006bcba88a24d03cfbca1ad20",
?????"https://ss0.baidu.com/7Po3dSag_xI4khGko9WTAnF6hhy/zhidao/pic/item/9c16fdfaaf51f3de9ba8ee1194eef01f3a2979a8.jpg",
?????"https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fa1.att.hudong.com%2F62%2F02%2F01300542526392139955025309984.jpg&refer=http%3A%2F%2Fa1.att.hudong.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1611368024&t=6500d50b1680d27bb60fe044e90ce41b",???????
????????????],
????imgUrl:‘‘,
????preUrl:‘‘,
????ximg:true,
????preop:0,
????i:0
??},
??onInit:?function?()?{
??????this.imgUrl?=?this.imgsrc[0]
??},
??onCallAnimationClick()?{
?????if(this.i?>?6){
?????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,就会出现这个情况。

解决方法:

template中第二个image组件的style="{{‘opacity:‘ + preop + ‘;‘}}"去掉,改为通过动画样式来调用,从0-1变化。

修改代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
<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>
?????<image?class="img"?id="img2"?if="{{ximg}}"?src="{{preUrl}}"?oncomplete="imgcomplete2"?></image>
????</stack>
??</div>
</template>
??
<script>
export?default?{
??data:?{
????imgsrc:?["https://ss1.bdstatic.com/70cFuXSh_Q1YnxGkpoWK1HF6hhy/it/u=1603365312,3218205429&fm=26&gp=0.jpg",
????"https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fimg.aiimg.com%2Fuploads%2Fuserup%2F0909%2F2Z64022L38.jpg&refer=http%3A%2F%2Fimg.aiimg.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1611368024&t=879ac47e0bd97e413b5462946d9ae4ed",
????"https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fpic3.16pic.com%2F00%2F01%2F11%2F16pic_111395_b.jpg&refer=http%3A%2F%2Fpic3.16pic.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1611368024&t=70c702a55248113dafa6e243dc253625",
????"https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fa2.att.hudong.com%2F27%2F81%2F01200000194677136358818023076.jpg&refer=http%3A%2F%2Fa2.att.hudong.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1611368024&t=11199190c6ac8e3371f16d7568d40daa",
?????"https://ss1.bdstatic.com/70cFuXSh_Q1YnxGkpoWK1HF6hhy/it/u=1089874897,1268118658&fm=26&gp=0.jpg",
?????"https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fa3.att.hudong.com%2F92%2F04%2F01000000000000119090475560392.jpg&refer=http%3A%2F%2Fa3.att.hudong.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1611368024&t=3b33c5b006bcba88a24d03cfbca1ad20",
?????"https://ss0.baidu.com/7Po3dSag_xI4khGko9WTAnF6hhy/zhidao/pic/item/9c16fdfaaf51f3de9ba8ee1194eef01f3a2979a8.jpg",
?????"https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fa1.att.hudong.com%2F62%2F02%2F01300542526392139955025309984.jpg&refer=http%3A%2F%2Fa1.att.hudong.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1611368024&t=6500d50b1680d27bb60fe044e90ce41b",???????
????????????],
????imgUrl:‘‘,
????preUrl:‘‘,
????ximg:true,
????preop:0,
????i:0
??},
??onInit:?function?()?{
??????this.imgUrl?=?this.imgsrc[0]
??},
??????...?????//省略
??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();
????},
}
</script>

?

欲了解更多详情,请参见:

快应用动画:

https://developer.huawei.com/consumer/cn/doc/development/quickApp-References/quickapp-api-animate

快应用通用样式:

https://developer.huawei.com/consumer/cn/doc/development/quickApp-References/quickapp-common-settings#h1-1575449213432

?

原文链接:https://developer.huawei.com/...
原作者:Mayism

上一篇:用over进行开窗 distribute by sort by和partition by order by 用于去重哪个效率比较高?


下一篇:QT常用控件(一)——菜单栏和对话框