微信小程序rpx适配误差问题

在开发小程序的时候遇到了两个有关计算view高度发生的问题,解决也花了不少的时间,特此记录一下。

一、计算view高度和实际情况匹配不上

一个列表展开后显示若干卡片,我做了一个展开动画,需要计算总的高度。

// 卡片高度100   上下margin 各为8
height: 110rpx;
margin: 8rpx 6rpx 8rpx 6rpx;



// 我开始计算 一行的高度是126
var height = parseInt(cardCount / 2) * 126;
if (cardCount % 2 != 0) {
   height += 126;
}
var heightValue = height + "rpx";
animation.height(heightValue).opacity(1).step();

在苹果手机(iPhone6)显示的是正确的,安卓手机总是算的比实际的高不少,导致动画结束后整个布局就会被拉长

我们都知道微信小程序rpx和px的转换是这样的: 

var px =  rpx / 750 * wx.getSystemInfoSync().windowWidth

// 如果是375的手机,那么:
1 rpx = 0.5px

// 如果是360的手机,那么
1 rpx = 0.48px

// 如果是414的手机,那么
1 rpx = 0.552px

接下来继续我上面的问题

// 我在调试中发现,我的卡片的高度居然是52px  margin居然是3px,也就是说我一行是58px

// 正常算的话高度是52.8px  margin是3.84px

// 而我自己计算的126rpx 转换为px则是60.48px 去除小数点后是60px

问题所在:小程序在rpx和px转换的时候,把小数点后的值给去了,只保留了整数

那么就有了解决方案

// 计算高度
var cardCount = that.data.list[index].secondList.length;
var cardHeight = parseInt(110 / 750 * wx.getSystemInfoSync().windowWidth);
var cardHeightMargin = parseInt(8 / 750 * wx.getSystemInfoSync().windowWidth);
var height = parseInt(cardCount / 2) * (cardHeight + 2 * cardHeightMargin);
if (cardCount % 2 != 0) {
   height += cardHeight + 2 * cardHeightMargin;
}
var heightValue = height + "px";
// 设置动画属性
animation.height(heightValue).opacity(1).step();

这样算出来的结果就是正确的了,至于上面说的是苹果手机和安卓手机的问题,其实只要是375的手机,显示上就没什么问题,其他宽度的就会出现问题。

 

二、分割线错位、padding和实际情况对不上

                  

需求是做一个分类的目录(在小程序上搞这个、这需求、都不想吐槽了),每一个item有四根分割线,根据一些逻辑看哪些显示或者不显示,一共5级,那么padding 依次是10、40、70、100、130rpx,逐级递增30rpx,但是做出来就有问题了,上一级底部的竖线和下一级顶部的竖线有可能错开,可能也就1px。不同手机不同的错位,这个手机1级、3级目录是错开的,另一个手机5级目录都是错开的,都是只错开1px。其实和上面的例是一个类型的问题。

//就拿360的手机来说:

10rpx = 4.8 = 4px
40rpx = 19.2 = 19px
70rpx = 33.6 = 33px
100rpx = 48 = 48px
130rpx = 62.4 = 62px

// 我们感觉是逐级差30rpx 没啥问题
// 但是我们看看结果,他们之间差的有可能是15px也有可能是14px
// 这就是导致错位的结果

那么就有了解决方案

// onLoad中计算真正的px值
onLoad: function (options) {
    var padding10 = parseInt(10 / 750 * wx.getSystemInfoSync().windowWidth);
    var padding30 = parseInt(30 / 750 * wx.getSystemInfoSync().windowWidth);

    this.setData({
      padding10: padding10,
      padding30: padding30
    })
},


wxml中去设置
style="padding-left:{{padding10}}px"
style="padding-left:{{padding10 + padding30}}px"
style="padding-left:{{padding10 + 2 * padding30}}px"
style="padding-left:{{padding10 + 3 * padding30}}px"
style="padding-left:{{padding10 + 4 * padding30}}px"

这样算出来的结果就是正确的了,任何机型都ok的。其实这个问题因为是超级细的分割线,如果不是分割线,而是一个有很大宽度的view,我想大部分人也不一定会发现居然有1~2px的距离差。

 

总结

1、小程序的rpx和android的dp的概念感觉挺相似,但是:在小程序下所有手机屏幕宽度是固定的750rpx,而安卓下所有手机的宽度可不是固定的。

2、如果是做类似一个view距离父布局左右各30rpx这种的,那在手机上显示是没多大问题的。

3、但是如果做到计算高度,计算距离,就像我上面提到的两个问题,如果不注意的话,就会出现不准确,错位的问题。

问题根源:注意px和rpx转换后的小数点问题、转换后只保留整数

抽一点时间记录一下这个问题,希望可以帮到遇到这些问题的人!

如果帮到了您,请给个赞,您的赞是我的动力,谢谢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值