微信小程序实现带刻度尺滑块--滑动标尺/刻度尺(身高、体重选择器)

本文介绍了在微信小程序中实现身高、体重刻度尺选择效果的思路与代码。利用scroll - view组件实现滑动,用for循环生成竖杠刻度。重点解决了刻度指针与数值匹配的问题,给出了从值到像素及从像素到值的计算公式,还提出了精确到一位小数的扩展思路。

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

 本来吧,像这种身高、体重的选择,我感觉一个数字滚轮就很不错,奈何UI给我出难题非要做一个刻度尺。

 思路

这刻度尺不就是一堆竖杠,每个竖杠直接间隔相同,并且间隔和数值匹配起来嘛。这样想实现起来就容易了,利用微信小程序scroll-view组件实现滑动效果,竖杠用for循环,我这里对身高体重的精度是直接到整数的,所以间隔每个竖杠直接间隔的数值是1,间距可以自己订。

但是。。。。。

做到一半发现还有一个刻度指针,这才是重点,要让指针指向的刻度值和数值匹配,这就需要你上边设置的刻度间隔必须准确

直接上代码

wxml:

<view class="flex-col self-center section_8 space-y-8">
        <view class="flex-col section_9 space-y-8">
          <view class="flex-row justify-evenly items-center self-center section_10">
            <text class="font_2">身高:</text>
            <text class="font_4 text_6">{{basicInfo.height}}</text>
            <text class="font_5 text_7">cm</text>
          </view>
          <view class=" section_11 space-y-4" style="height: 150rpx">
            <view class="cur">
              <view class="cur_val" style="margin-left: 155px;"></view>
            </view>
            <scroll-view scroll-x="true" scroll-left="{{heightSalNum}}" scroll-with-animation='true' catchscroll="bindscroll" throttle="{{false}}">
              <view style="background: white; justify-content: center; align-items: flex-start;  display: inline-flex">
                <view class="{{index%10 == 0 ? 'cursor_lang' : 'cursor'}}" wx:for="{{300}}" wx:key="index">
                  <view wx:if="{{(index)%10==0}}" class="cursor_text">{{index}}</view>
                </view>
              </view>
            </scroll-view>
          </view>
        </view>

cur是指针容器,因为我给他规定了宽度是310px,所以给他的子元素也就是指针给了一个距离左边155px,让他居中,当然你也可以用简单点的方式,比如flex

scroll-view是刻度容器,scroll-left指定起始位置,里边使用for循环做了300个刻度,没10个显示刻度值

css: 

.flex-col {
  display: flex;
  flex-direction: column;
}

.flex-row {
  display: flex;
  flex-direction: row;
}

.justify-evenly {
  justify-content: space-evenly;
}

.items-center {
  align-items: center;
}

.self-center {
  align-self: center;
}

.section_9 {
  width: 310px;
  padding-top: 16.67rpx;
  background-color: #ffffff;
  overflow: hidden;
  border-top: solid 2.08rpx #d4d4d4;
}

.space-y-8>view:not(:first-child),
.space-y-8>text:not(:first-child),
.space-y-8>image:not(:first-child) {
  margin-top: 16.67rpx;
}

.section_10 {
  padding: 8.33rpx 0;
  background-color: #ffffff;
  overflow: hidden;
  width: 197.92rpx;
}

.font_2 {
  font-size: 29.17rpx;
  font-family: HarmonyOS Sans SC;
  line-height: 27.08rpx;
  color: #000000e6;
}

.font_4 {
  font-size: 37.5rpx;
  font-family: HarmonyOS Sans Condensed;
  line-height: 27.08rpx;
  color: #22c1b1;
}

.text_6 {
  line-height: 28.13rpx;
}

.font_5 {
  font-size: 33.33rpx;
  font-family: HarmonyOS Sans SC;
  line-height: 18.75rpx;
  color: #000000e6;
}

.text_7 {
  line-height: 17.71rpx;
}

.section_11 {
  background-color: #ffffff;
  overflow: hidden;
  position: relative;
}

.space-y-4>view:not(:first-child),
.space-y-4>text:not(:first-child),
.space-y-4>image:not(:first-child) {
  margin-top: 8.33rpx;
}


.cur {
  position: absolute;
  width: 310px;
  height: 38px;
  z-index: 10;
  display: flex; 
  /* justify-content: center; */
  pointer-events:none;
}

.cur_val {
  width: 0px;
  border: 0.50px #22c1b1 solid;
}

.cursor {
  width: 10px;
  height: 24px;
  border-left: 1px #D9D9D9 solid
}

.cursor_lang {
  width: 10px;
  height: 32px;
  border-left: 2px #D9D9D9 solid
}

.cursor_text {
  color: #B3B3B3;
  font-size: 12px;
  font-family: HarmonyOS Sans SC;
  font-weight: 400;
  line-height: 12px;
  word-wrap: break-word;
  display: flex;
  justify-content: center;
  margin-top: 80rpx;
  width: 80rpx;
  margin-left: -40rpx;
}

js:

this.setData({
        heightSalNum: height * 10 - 155,
})

 这里计算其实位置:

height是你后台穿过来的身高,因为我每个刻度间隔设置的是10px并且指针的位置在距离左侧155px的位置,所以得出公式 height * 10 - 155

像这样

scroll-view的起始位置,移动距离等等都是基于像素,也就是你得到的值都是像素

 比如当我们的值是177时,scroll-view的起始位置(像素)就因该是177*10(我们设置的每个空的像素),也就是起始位置是1770px

此时得到了scroll-view的起始位置,但是由于scroll-view的起始位置参照的是元素最左侧和位于元素中间的指针位置差了155px,起始位置为1770px的时候指针位置就成了1770px + 155px,指针指向的刻度也成了(1770px + 155px)/10

所以在这我们需要从起始位置减去指针和起始位置的间距

最后就得出了上边的公式:height * 10 - 155

  //身高卡尺
  bindscroll: function (e) {
    // 移动距离
    let left = e.detail.scrollLeft;
    let curVal = Math.round((left + 155) / 10);
    this.setData({
      ['basicInfo.height']: curVal
    })
  },

 道理和上边一样,上边是从值变为像素,这里需要从像素变成值。

left是移动距离(像素),移动距离的参照同样是最左边,所以对齐刻度要在这加上155,此时就是指针指定刻度在这个scrollview中的所在像素

使用这个像素除以10,得到的就是身高的值

扩展:

我的理解按这样计算每个空格间隔是10px,代表1cm,是不是没1px就代表0.1cm,那么不进行取整,保留一位小数的话,能不能得出精确到一位小数的身高?

本来想做成组件的,由于不想写了就不做了,想做的小伙伴可以试着写一下

### 解决 Python 中因权限不足导致加载数据集时发生 `RuntimeError` 的方法 当尝试加载数据集时遇到 `Permission denied` 错误,通常是因为程序试图访问受保护的资源而未获得适当权限。以下是可能的原因及其解决方案: #### 1. 文件或目录缺少执行/读取权限 如果目标文件或脚本本身缺乏必要的权限,则会触发此错误。可以通过修改文件权限来解决问题。 ```bash chmod 777 datax.py ``` 上述命令赋予了 `datax.py` 完全权限(读、写、执行),适用于调试阶段[^1]。然而,在生产环境中应谨慎设置权限,仅授予所需的最低权限级别以保障安全性。 #### 2. Hadoop 集群中的权限问题 在分布式计算场景下,尤其是涉及 Apache Flink 或 HDFS 的应用中,可能会因为用户角色的不同而导致权限冲突。例如,Flink 用户无法向 `/user` 路径写入数据时会出现以下异常: ```plaintext Caused by: org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.security.AccessControlException): Permission denied: user=flink, access=WRITE, inode="/user":hdfs:supergroup:drwxr-xr-x ``` 这表明当前运行作业的用户 (`flink`) 缺少对该路径的写入权限[^2]。可以采取以下措施之一解决该问题: - **调整 HDFS 权限**: 使用管理员账户更改指定目录的权限。 ```bash hdfs dfs -chmod 777 /path/to/directory ``` - **切换至具有权限的用户**: 如果存在其他具备所需权限的角色 (如 `hdfs`),则考虑改用这些身份提交任务。 #### 3. PyTorch 加载模型权重失败引发的权限错误 对于基于深度学习框架的应用而言,比如 YOLOv5 训练过程中也可能遭遇类似的权限拒绝状况。具体表现为尝试恢复先前保存的状态字典(`state_dict`)却找不到对应的权重组件: ```python d = torch.load(last, map_location='cpu')['opt'] ``` 这种情况下报错的根本原因是前次中断训练后未能妥善关闭相关连接或者清理临时文件所致[^3]。因此建议按照下面方式排查并修正潜在隐患: - 确认所有输入参数均有效无误; - 删除残留缓存项后再重新启动流程; 另外值得注意的是某些操作系统会对特定位置实施额外的安全策略(例如 Windows 上 C:\Program Files\ 下的内容默认受到严格管控), 故最好把工作区迁移到允许自由操作的空间里去. --- ### 提供一段示范代码用于验证修复效果 假设我们正在处理本地存储的数据集,并希望规避任何不必要的许可障碍,那么可以从头构建一个简单的例子来进行测试: ```python import os from torchvision import datasets, transforms def load_dataset(data_dir): transform = transforms.Compose([ transforms.ToTensor(), transforms.Normalize((0.5,), (0.5,)) ]) try: train_set = datasets.MNIST(root=data_dir, train=True, download=True, transform=transform) test_set = datasets.MNIST(root=data_dir, train=False, download=True, transform=transform) print(f"Dataset loaded successfully from {data_dir}.") except Exception as e: print(f"Failed to load dataset due to error: {e}") if __name__ == "__main__": current_directory = "./datasets" if not os.path.exists(current_directory): os.makedirs(current_directory) os.chmod(current_directory, 0o777) # Ensure directory has proper permissions load_dataset(current_directory) ``` 通过预先创建好存放资料的位置并且设定恰当属性值之后再调用函数即可顺利完成整个过程而不至于再次碰到类似难题。 ---
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值