微信小程序实现手机屏幕左右旋转,页面元素左右移动,小程序加速计

这篇博客介绍了如何在微信小程序中利用加速度计API监听手机旋转,并通过transform或transition实现页面元素随着手机旋转平滑移动。通过比较,发现使用transition的移动效果更为流畅。
摘要由CSDN通过智能技术生成

一、业务背景

在做微信小程序的项目时,有一个需求是当用户左右旋转手机屏幕时,页面上特定的元素要随着用户的旋转动作左右移动。当将手机屏幕向左旋转时,人物向左移动;手机屏幕向右旋转时,人物向右移动。
微信小程序实现手机屏幕左右旋转,页面元素左右移动,小程序加速计

二、用到的微信API

这里主用到了微信小程序的加速计:

  • 开始监听加速度数据,wx.startAccelerometer(Object object)
  • 监听加速度数据事件,wx.onAccelerometerChange(function callback)

微信小程序实现手机屏幕左右旋转,页面元素左右移动,小程序加速计
官方文档链接:https://developers.weixin.qq.com/miniprogram/dev/api/device/accelerometer/wx.startAccelerometer.html

先来写个demo,看下 wx.onAccelerometerChange() 回调函数里参数的打印:

wx.startAccelerometer({
	interval: 'normal',
	success: () => {
		wx.onAccelerometerChange((res) => {
			console.log('res :>> ', res);
		})
	}
})

这个API效果在微信开发者工具里模拟不了,只能在手机上看。微信开发者工具点击预览,在手机的控制台上我们可以看到,将手机屏幕向左旋转至垂直于水平面,打印出来的 x 值无限接近于 -1。将手机屏幕向右旋转至垂直于水平面,打印出来的 x 值无限接近于 1。

微信小程序实现手机屏幕左右旋转,页面元素左右移动,小程序加速计
有了这个API的帮助,我们就可以愉快地开始写效果了。

三、效果实现

思路:如果元素向左向右最大移动的距离是20,而且既然我能拿到手机旋转的 res.x 值,那么当手机旋转的时候,将元素向左或向右移动 res.x *20 距离,不就可以了。

既然是移动,首先想到的就是用 transform 来实现这个效果,在手机上预览时,发现人物在移动的过程中会一卡一卡的,不是很流畅,就像下面这样。
微信小程序实现手机屏幕左右旋转,页面元素左右移动,小程序加速计
思考了好久后,想到既然是要做动画效果,那么能想到的有以下三种方式:

  • animation
  • transition
  • requestAnimationFrame

transform 不行,那就换 transition。两种实现方式在下面也都写出来了。

3.1 transform

当手机屏幕旋转时,设置元素的 transform:translateX(res.x*20)

页面结构代码:

<view class="wrap">
  <image src="/assets/bg.png" />
  <image src="/assets/img.png" style="transform:translateX({{left}}%);" />
</view>

css 代码:

.wrap {
  width: 100%;
  height: 422rpx;
  position: relative;
}

image {
  width: 100%;
  height: 100%;
  position: absolute;
  top: 0;
  left: 0;
}

js 代码:

Page({
  data: {
    left: ""
  },
  onShow() {
	wx.startAccelerometer({
		interval: 'normal',
		success: () => {
			wx.onAccelerometerChange((res) => {
				this.setData({
					left: res.x*20
				})
			})
		}
	}),
	onHide: function () {
		// 停止监听加速计数据
		wx.offAccelerometerChange()
		wx.stopAccelerometer()
	}
})

3.2 transition

用 transition 来实现位移的效果,当手机屏幕旋转时,改变元素的 left 值,还可以指定转速曲线和时间。具体的效果大家可以试一下。

css 和 js 代码同上,只需要将上面的 html 改成下面这样,就可以实现完美的移动了。

<view class="wrap">
  <image src="/assets/bg.png" />
  <image src="/assets/img.png" style="left:{{left}}%;transition:left .3s;" />
</view>

在同一情况下旋转手机屏幕,两种实现方式的效果对比,可以看出使用 transition 元素移动的效果更流畅一些。
微信小程序实现手机屏幕左右旋转,页面元素左右移动,小程序加速计

后来我想了下, 好像 transform 结合 animation 一起使用,也可以达到这个效果。

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
微信小程序的Canvas API提供了一个`rotate()`方法,用于在画布上进行图形的旋转。如果你想旋转画布中心点,实际上Canvas是围绕其左上角进行旋转的。但在实际应用中,我们可以先确定需要旋转的图形的位置,然后相对于这个位置进行旋转。 例如,如果你有一个特定的圆形,你想让它绕着画布中心旋转,你需要做的是: 1. 首先获取圆形相对于画布中心的偏移量(x、y坐标)。 2. 使用`save()`保存当前状态,包括变换矩阵。 3. 设置新的旋转中心(通常设置为画布宽度和高度的一半,即画布的中心点)。 4. 调用`translate(x, y)`将坐标系移动旋转中心。 5. 调用`rotate(angle)`进行旋转,其中angle是旋转的角度(单位通常是弧度)。 6. 绘制你的圆形。 7. 使用`restore()`恢复之前的状态。 下面是一个简化的伪代码示例: ```javascript let centerX = wx.canvas.currentContext.width / 2; let centerY = wx.canvas.currentContext.height / 2; // 获取圆心偏移 let circleOffsetX = ...; let circleOffsetY = ...; // 保存原始状态 wx.canvas.currentContext.save(); // 移动旋转中心 wx.canvas.currentContext.translate(centerX, centerY); // 旋转 wx.canvas.currentContext.rotate(angle); // 绘制圆形 wx.canvas.currentContext.beginPath(); wx.canvas.currentContext.arc(circleOffsetX + centerX, circleOffsetY + centerY, radius, 0, Math.PI * 2); wx.canvas.currentContext.fill(); // 恢复原状态 wx.canvas.currentContext.restore(); ``` 记得替换`...`处的实际值,并根据需求调整旋转角度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值