【鸿蒙实战开发】HarmonyOS-Swiper切换动效实现

一、背景

本篇是关于常见的交互实现,即Swiper左右滑动的伸缩效果

二、目标

点击查看

如上图所示,在滑动过程中,移走的缩小,移入的放大,同时展示相邻两项的一部分,这在app中也是一种很常见的交互。

三、实现步骤

在开始之前,我们可以先回顾一下原来Android中的实现;步骤也很简单,我们在ViewPage2外层设置可以突破边界,即:android:clipChildren=“false”, 然后PageTransformer来实现,滑动过程中的的动画;代码如下:

mBinding.vp2SquareChild.setPageTransformer(PetPageTransformer())

使用setPageTransformer给ViewPage2设置PageTransformer对象

class PetPageTransformer :  ViewPager2.PageTransformer {
    override fun transformPage(page: View, position: Float) {
        page.setPadding(
            page.context.resources.getDimension(R.dimen.d_6).toInt(),
            0,
            page.context.resources.getDimension(R.dimen.d_6).toInt(),
            0
        )
        var scale = 0.0f
        var alpha = 0.0f
        if(position in 0.0f..1.0F) {  //1
            scale = 1.0f - (position * 0.1f)
            alpha = 1.0f - (position * 0.5f)
        }else if (-1.0f <= position && position < 0.0f){   //2
            scale = (position * 0.1f) + 1.0f
            alpha = (position * 0.5f) + 1.0f
        }

        page.scaleY = scale
        page.alpha = alpha
    }
}

PageTransformer内部做两件事:

●设置padding

加上前面的android:clipChildren=“false” ,实现相邻项的部分展示

●根据返回的position做动画处理

position为正数或负数表示相邻项的移动比例,根据这个比例换算出动画执行的属性值,且设置给view即可。
关于Android的实现就完成了,那鸿蒙上实现会不会类似呢,我觉得差不多,哈哈:

1、设置相邻项边距

我们需要相邻项展示部分内容的效果,如下图:
在这里插入图片描述

在鸿蒙中这个比较简单,只要给Swiper设置下面的属性即可:

.prevMargin(this.swiperMargin) // 漏出前一项的部分
.nextMargin(this.swiperMargin)// 漏出后一项的部分

2、设置相邻项的缩放动画

我们知道Android中是通过transformPage(page: View, position: Float) 函数回调来处理的,Swiper也有类似的函数,这就是:

 .onGestureSwipe((index, event)

index我们可以理解,指当前展示的项,event是SwiperAnimationEvent:

declare interface SwiperAnimationEvent {
    /**
     * Offset of the current page to the start position of the swiper main axis. The unit is vp.
     *
     * @type { number }
     * @default 0.0 vp
     * @syscap SystemCapability.ArkUI.ArkUI.Full
     * @since 10
     */
    /**
     * Offset of the current page to the start position of the swiper main axis. The unit is vp.
     *
     * @type { number }
     * @default 0.0 vp
     * @syscap SystemCapability.ArkUI.ArkUI.Full
     * @crossplatform
     * @atomicservice
     * @since 11
     */
    currentOffset: number;
    /**
     * Offset of the target page to the start position of the swiper main axis. The unit is vp.
     *
     * @type { number }
     * @default 0.0 vp
     * @syscap SystemCapability.ArkUI.ArkUI.Full
     * @since 10
     */
    /**
     * Offset of the target page to the start position of the swiper main axis. The unit is vp.
     *
     * @type { number }
     * @default 0.0 vp
     * @syscap SystemCapability.ArkUI.ArkUI.Full
     * @crossplatform
     * @atomicservice
     * @since 11
### 解决 Vue-Awesome-Swiper 切换时的抖问题 为了有解决 `vue-awesome-swiper` 插件在图片加载过程中的页面问题,可以采取以下措施: #### 使用 Wrapper 容器并调整 CSS 样式 创建一个外部容器 `.wrapper` 来包裹 Swiper 组件,并通过设置特定的 CSS 属性来确保即使图片尚未完全加载也能保持布局稳定。 ```css .wrapper { overflow: hidden; width: 100%; height: 0; padding-bottom: 30.48%; /* 这个比例可以根据实际需求调整 */ background-color: #eee; .swiper-img { width: 100%; } } ``` 此方法利用了 `padding-bottom` 技巧来模拟固定高宽比的果,从而避免因图片延迟加载而导致的内容重排[^4]。 #### 初始化配置优化 对于分页器 (pagination) 不显示的问题,可以通过适当修改 Swiper 实例化参数来进行修复。确保 pagination 配置项已正确定义并且启用了相应的功能选项。 ```javascript const swiperOptions = { loop: true, autoplay: { delay: 2500, disableOnInteraction: false, }, pagination: { el: '.swiper-pagination', clickable: true, }, }; ``` 此外,在态添加新幻灯片后记得调用 `swiper.update()` 方法更新实例状态,以便正确反映最新的 DOM 变更情况[^5]。 #### 图片预加载策略 考虑到网络状况不佳可能导致资源下载时间过长进而引发视觉上的卡顿感,建议提前对即将展示的大尺寸图像实施懒加载或异步获取机制。这不仅有助于提升用户体验流畅度,还能减少不必要的带宽消耗。 综上所述,上述三种手段相结合能够显著改善基于 `vue-awesome-swiper` 构建的应用程序中存在的切换画不稳定现象。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值