仪表盘滑动效果 uni-app 微信小程序

本文详细介绍了如何在uni-app微信小程序中实现一个滑动时让三角按钮围绕圆圈转动的交互效果。通过计算触摸点的位置和象限,利用数学方法计算旋转角度,最终结合CSS实现平滑转动。文章提供了具体的代码实现步骤,适用于前端开发者学习。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 需求:滑动时使三角按钮围绕圆圈转动;

在网上找了下类似的只有图表展示,并不能手动滑动。

思考过程如下:

1.实现转动的效果

通过改变旋转的角度可以让按钮转起来

transform:rotate(0deg);
transition:all .1s;

 2.获取转动的角度

首先我们在图形中画个坐标轴xy,先按钮处于第一象限时,按钮旋转的角度就是bc边的夹角,

a边的长度是: 屏幕触摸位置的x值减去节点到屏幕左侧的距离再减去节点一半的宽度;

b边的长度是: 屏幕触摸位置的y值减去节点到屏幕上侧的距离再减去节点一半的高度之后取绝对值;

有了a和b的长度之后就用勾股定理算出c的长度;

用 a / c 之后用 Math.asin 方法取反正弦值 之后再  * 180/Math.PI ;

所得到的值就是bc边的夹角了;

如果按钮处于第四象限时,

 这时a边与b边的计算方法调换;其他的与处于第一象限时一样,最后的角度加上90度;

第三象限与第一象限计算方法相同,最后的角度加上180度;

第二象限与第四象限计算方法相同,最后的角度加上270度;

这样我们就获取到了滑动到任何位置的角度了。

代码实现:

 html、css代码我这里就不贴了,根据自己的界面样式实现即可。

首先在onload中获取下外层节点的属性并计算出中心点的位置;

//由于小程序中不支持ref所以使用这种方式;
uni.createSelectorQuery().select('.inner').boundingClientRect(
	(rect) => {
		this.rect = rect;
		this.rect.width_c = this.rect.width / 2;
		this.rect.height_c = this.rect.height / 2;
		console.log(this.rect);
	}
).exec();

然后再外层节点中监听下touchmove

<view class="inner" @touchmove="move">

move中内容如下:

/* 
触摸位置的值减去节点距离屏幕边缘的位置 就得到了触摸点在节点中所在的位置;
注意这里的值并不是坐标轴里面的xy值,而是从节点的左上角向右向下延伸的值;
*/
let left = e.touches[0].pageX - this.rect.left;
let top = e.touches[0].pageY - this.rect.top;

// 这里根据中心点的位置判断下,触摸点所在的象限;
let now_index = 0;
if (left < this.rect.width_c) {
	if (top < this.rect.height_c) {
		now_index = 3
	} else {
		now_index = 2;
	}
} else {
	if (top < this.rect.height_c) {
		now_index = 0;
	} else {
		now_index = 1;
	}
}

// 触摸点在节点中所在的位置减去节点宽高的一半之后取绝对值,这样就确定了坐标轴中xy的值了。然后根据勾股定理计算出斜边的值;
let x = Math.abs(left - this.rect.width_c);
let y = Math.abs(top - this.rect.height_c);
let z = Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2));


// 根据触摸点所在的象限判断 是取哪条边的值除以斜边之后取反正弦值
let asin = 0;
if (now_index == 0 || now_index == 2) {
	asin = Math.asin(x / z);
} else {
	asin = Math.asin(y / z);
}
// 计算出反正弦值后 * 180 / Math.PI后就得出了角度,再加上之前象限的角度就得到了所要旋转的角度了,之后赋值给html中的样式就可以了
let angle = Number((asin * 180 / Math.PI).toFixed(2)) + (now_index * 90);

写到这里需求就基本实现了。

原创不易,希望大家多多留言点赞。

仪表盘滑动效果-优快云直播仪表盘滑动效果 uni-app 微信小程序https://live.youkuaiyun.com/v/182330

<think>好的,我现在需要帮助用户了解如何使用Supabase在线数据库管理微信小程序的数据。首先,我需要回顾用户的问题和已有的引用内容,确保回答准确且符合他们的需求。 用户之前提到想用Supabase管理微信小程序的数据,所以得先明确Supabase的基本功能以及如何在小程序中集成。根据引用内容,特别是引用[1]和[4],Supabase支持微信小程序,提供数据库、存储、认证等API,且脚手架包括uni-app和微信原生小程序,这可能对用户有帮助。 接下来,我应该分步骤说明集成过程。首先,创建项目和数据库,这部分需要指导用户在Supabase控制台操作。然后安装SDK,引用[1]提到使用supabase-js,但微信小程序可能需要特殊配置,比如使用自定义的localStorage,或者处理跨域问题,但根据引用[4],MemFire Cloud已经提供了微信小程序的脚手架,可能简化了这些步骤。 数据操作部分,引用[3]提到使用RPC调用数据库函数,或者直接查询表。需要给出具体的代码示例,比如查询数据、插入数据,以及如何实时监听数据变化,这可能是用户需要的功能。同时,用户认证部分,引用[4]中的登录注册功能需要整合,可能使用Supabase的auth模块。 安全设置方面,需要指导用户设置行级安全策略,确保数据权限正确,这可能在Supabase的表权限中配置。存储管理部分,引用[1]和[4]提到云存储,可以说明如何上传和下载文件。 另外,引用[2]中的技术栈如Node.js、Express可能涉及后端,但如果用户希望纯前端实现,可能需要强调Supabase可以直接从前端调用API,无需额外后端。同时,引用[3]提到的视图和函数调用,可以作为高级功能简要提及。 最后,生成相关问题时,需要考虑用户可能遇到的后续问题,比如性能优化、安全措施、实时数据同步等,确保问题有针对性,帮助用户进一步探索。 需要检查所有步骤是否符合微信小程序的限制,比如网络请求必须使用HTTPS,Supabase的API是否符合这一点。同时,确保示例代码正确,比如使用uni-app或微信原生框架的语法,可能需要调整supabase-js的初始化配置,比如使用自定义的fetch方法或适配器。 可能遇到的挑战包括微信小程序的域名白名单,用户需要在微信后台配置Supabase的域名,这点需要提醒用户。另外,数据安全是关键,必须强调RLS的设置,避免数据泄露。 总结回答结构:分步骤教程,包含项目设置、SDK安装、数据操作、认证、存储、安全,最后注意事项和相关问题。确保每个步骤都有代码示例和解释,参考引用内容中的信息,特别是使用supabase-js的API调用方式,并引用相关来源。</think>### 如何使用 Supabase 管理微信小程序数据的分步教程 #### 1. **创建Supabase项目与数据库** - 登录 [Supabase官网](https://supabase.com),创建新项目并进入仪表盘- 在 **Table Editor** 中创建数据表(例如 `todos` 表),定义字段如 `id`, `title`, `is_completed`,并启用行级安全(RLS)[^1][^4]。 #### 2. **集成Supabase SDK到小程序** - 安装 `@supabase/supabase-js` 库: ```bash npm install @supabase/supabase-js ``` - 初始化客户端(在 `app.js` 或全局配置文件中): ```javascript import { createClient } from '@supabase/supabase-js'; const supabase = createClient( 'YOUR_SUPABASE_URL', 'YOUR_SUPABASE_ANON_KEY' ); ``` **注意**:微信小程序需在后台配置Supabase域名白名单(如 `*.supabase.co`)[^1][^4]。 #### 3. **数据操作示例** - **查询数据**(获取未完成的任务): ```javascript const { data, error } = await supabase .from('todos') .select('*') .eq('is_completed', false); ``` - **插入数据**: ```javascript const { data, error } = await supabase .from('todos') .insert([{ title: '学习Supabase', is_completed: false }]); ``` - **实时监听**(WebSocket长连接): ```javascript const subscription = supabase .from('todos') .on('INSERT', payload => console.log('新数据:', payload)) .subscribe(); // 页面卸载时取消订阅 onUnload(() => subscription.unsubscribe()); ``` #### 4. **用户认证集成** - 启用 **Auth** 模块,配置微信小程序登录方式(如手机号或第三方OAuth)。 - 实现登录逻辑: ```javascript const { user, error } = await supabase.auth.signIn({ provider: 'wechat', }); ``` - 获取用户会话状态: ```javascript const { data: { user } } = await supabase.auth.getUser(); ``` #### 5. **文件存储管理** - 上传文件到 `storage` 桶: ```javascript const { data, error } = await supabase.storage .from('avatars') .upload('user1.jpg', file); ``` - 生成文件访问链接: ```javascript const url = supabase.storage .from('avatars') .getPublicUrl('user1.jpg'); ``` #### 6. **安全配置** - **RLS策略**:在Supabase控制台为每张表设置访问规则。例如仅允许用户修改自己的数据: ```sql CREATE POLICY user_policy ON todos FOR ALL USING (auth.uid() = user_id); ``` - **API密钥保护**:始终使用匿名密钥(`ANON_KEY`)而非服务端密钥,避免前端暴露敏感权限[^3][^4]。 #### 注意事项 1. **性能优化**:频繁查询可结合数据库索引或调用预定义函数(通过 `supabase.rpc()`)[^3]。 2. **数据量控制**:避免在前端一次性加载大量数据,使用分页查询(`.range()`)[^3]。 3. **错误处理**:所有操作需包含 `try/catch` 或检查 `error` 字段,确保网络异常时友好提示。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

晓_枫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值