宽度根据屏幕宽度百分比确定后,高度如何设置成与宽度相同的问题

上海张律师
• 阅读 1

​ ##HarmonyOS 应用开发##

先交代一下问题的背景:

我在做一个多图上传的插件,我希望一行显示3张图片,并且每个都是正方形,那么在理想情况下,每个图片的宽度应该是屏幕宽度的三分之一,如果再考虑到间距的问题,我希望设置为:屏幕宽度的三分之一 - 20

效果如图

宽度根据屏幕宽度百分比确定后,高度如何设置成与宽度相同的问题

在开发过程中,我遇到了问题,即把宽度设置为屏幕宽度的三分之一很容易,直接33%就可以了(父组件100%宽度),但是高度如何设置成33%屏幕宽度呢?在写web或者小程序的时候就很简单,直接33vw就可以了,但是ArkUI里没有vw这个属性。

一开始的思路是,直接获取屏幕的宽度数值,然后动态计算,这里用的是@ohos.display (屏幕属性),具体获取的代码如下

display.getAllDisplayPhysicalResolution().then((r)=>{
  this.imgwidth = px2vp(r[0].physicalWidth) / 3 - 20;
})

这种写法的好处在于,能够获取到真实的屏幕宽度数据,即数据是准确的,但是问题在于,由于是用到了设备相关的属性,所以需要用模拟器或者真机才能测试,在预览器中是无法显示的,这对于开发来说不太方便,刚开始我还花了很长时间研究为什么这个组件没有在屏幕里出来……当然,除此之外,这种写法还会带来性能上的问题。

于是我开始找寻其他的替代方法

其实把这个问题拆解以后,我的目的实际上是让每个图片的高度=宽度,而宽度是可以通过calc动态计算获取的,那么只要保证高宽比为1,就能确保高度与宽度一致了,对于这个要求,通用属性的aspectRatio就可以满足了

aspectRatio(value: number)

指定当前组件的宽高比,aspectRatio=width/height。

仅设置width、aspectRatio时,height=width/aspectRatio。 仅设置height、aspectRatio时,width=height*aspectRatio。 同时设置width、height和aspectRatio时,height不生效,height=width/aspectRatio。 因此,只要把这个值设置为1就能成功实现目的

具体代码如下:

    .width('calc(33.33% - 20vp)')
    .aspectRatio(1)

点赞
收藏
评论区
推荐文章
晴空闲云 晴空闲云
2年前
css中box-sizing解放盒子实际宽高计算
我们知道传统的盒子模型,如果增加内边距padding和边框border,那么会撑大整个盒子,造成盒子的宽度不好计算,在实务中特别不方便。boxsizing可以设置盒模型的方式,可以很好的设置固定宽高的盒模型。盒子宽高计算假如我们设置如下盒子:宽度和高度均为200px,那么这会这个盒子实际的宽高就都是200px。但是当我们设置这个盒子的边框和内间距的时候,那
小嫌 小嫌
3年前
css中块状元素和内联元素
CSS中,html中的标签元素大体被分为三种不同的类型:块状元素、内联元素(又叫行内元素)和内联块状元素。块状元素块状元素特点1、每个块级元素都从新的一行开始,并且其后的元素也另起一行。2、元素的高度、宽度、行高以及顶和底边距都可设置。3、元素宽度在不设置的情况下,是它本身父容器的100%(和父元素的宽度一致),除非设定一个宽度。常用的块状元素有:、
绝对absolute定位后,元素宽度问题
由于设置了绝对定位,宽度以子元素内容的宽度一致,此时设置什么最小宽度那些都没用,但是又不能写死宽度,需要根据内容来撑开采用whitespace:nowrap;强制不换行,让其内容撑开position:absolute;whitespace:nowrap;前在这里插入图片描述(https://imghelloworld
阿邹 阿邹
4年前
LayoutInflater.inflate()参数用法及导致适配器布局宽度高度错乱问题
这个LayoutInflater.inflate()应该用的都挺频繁的,比如你的fragment,你的适配器里面都会有用到。但它的参数的意义你都理解嘛?有没有遇到过这样一个问题?你的适配器宽度明明设置了全部但是实际上却没有,布局错乱了,然后你苦寻无果,最后你直接在代码中动态重新设置了一次宽度,获取屏幕的宽度在代码中动态直接设置。今天我们就来解释一
Stella981 Stella981
3年前
EC20 raspberry pi 树莓派 4g上网 发短信
介绍由于项目需求,为了减少宽度,采用了树莓派zero,找了好久的网络模块,最后找到这款ec20宽度与树莓派zero基本相同~。我使用的是EC20(CEFAG)全功能版本,4ggps。硬件连接连接!be9ca9d4de0cb9a75230a357fdc76a8f.md.jpg(https://wx1.s
Wesley13 Wesley13
3年前
CSS实现自适应九宫格布局 大全
看到微博和朋友圈都实现了图片九宫格,曾经有次面试也问到了九宫格这个问题,当时想到的是先固定每个单元格的宽高,然后进行浮动。今天想折腾一下,实现自适应父元素宽度的布局。这次我只写了四种方式去实现九宫格,算上inlineblock的话就是五种了。首先要注意的是九宫格容器是宽高相等的正方形,并且是自适应的,这里关键是实现宽高相等,有些人想到了相对视口宽度
Wesley13 Wesley13
3年前
Unity3D GUI笔记
Rect(intleft,inttop,intwidth,intheight)//left:离屏幕左边距离;top:离屏幕上边距离;width:Rect宽度;height:Rect高度;文本:Label(Rect(),Stringtext)//text:文字内容按钮:Button(Rect(),Tex
Wesley13 Wesley13
3年前
CSS复习笔记二:浮动和清除浮动
 一、浮动的性质1、浮动的元素脱离标准文档流,并且可以设置宽度和高度。2、浮动的元素相互贴靠3、浮动的元素有“文字环绕”效果       含有图片的div浮动,段落不浮动,文字会环绕图片。4、div浮动了且没有设置宽度,那么将自动收缩为内容的宽度。浮动(脱标)的元素是不能把容器惩处高度的。二、浮动的清除
Wesley13 Wesley13
3年前
css为什么要清除浮动
DIV1宽度为100px,DIV2宽度为50px,如果上级DIV层的宽度大于DIV1DIV2的宽度,DIV2设置浮动属性float:left,DIV2会像流水一样,自动显示在DIV1的右侧,如果上级DIV层的宽度等于或者小于DIV1DIV2的宽度,那么,DIV2层就会被挤到DIV1的下方.如果DIV1设置了清除属性,DIV2就
IT全栈视野 IT全栈视野
10个月前
全面剖析像素单位 px、vp、fp
一、像素单位pxpx是像素(Pixel)的缩写,是最常见的屏幕分辨率单位。它是一个绝对单位,表示屏幕上的一个物理像素点。例如,在一个分辨率为1920×1080的屏幕上,一个宽度为100px的元素,就会占据屏幕宽度的100/1920部分。优点:直观易懂,在不