[译] ConstraintLayout基础系列之尺寸横纵比 dimensions

news/2024/7/4 13:33:34

原文:ConstraintLayout basics guidelines
作者:Mark Allison


ConstraintLayout的尺寸 dimensions

有时候,我们需要创建一些固定方向比的 View 组件,最常使用固定横纵比的就是当 ImageView 用于展示一些固定横纵比的图片的时候。举些例子,书面封面(尺寸横纵比多种多样),电影海报(一般是 4:6 ),电影剧照(一般是 1.85:1 或 2.39:1 ),电视剧(一般是 4:3 或 16:9 )

对于不熟悉什么是横纵比的,横纵比就是表示了 View 的宽度与高度的比例 w:h 。例如,对于一个拥有横纵比为 4:6 拥有宽度为 40dp 的 View 组件有着高度是 60dp ,若它的宽度改为 30dp 则它的高度就是 45dp

若我们现实的图片能保证同样的横纵比和像素大小,我们可以简单的在两个方向上使用 wrap_content 即可。然而,现实情况由于数学四舍五入等多种原因都有可能造成实际现实的一些小误差。如果只是现实一个图片可能不会有多大问题,但是如果多个图片展示的时候小问题也会被有很不好的视觉效果,甚至当有 View 对齐于这些图片的 ImageView 的时候,也因此产生了变化,整体就会造成布局不平衡混乱了。

对于这个问题的解决方案之一是,通过创建继承于 ImageView 的子类,并通过覆写 onMeasure() 来实现固定横纵比的布局。常用的 support library 中的 PercentLayout 也提供了一些机制来结局这类横纵比问题。

同样的 ConstraintLayout 也提供了机制来专门解决这个问题,选择想要控制横纵比的 View 然后通过属性视图中修改 ratio 值来改变横纵比,如下图红色圈内设置:

如上图,我们设置的 View 组件有着向父组件的 start 和 top 边缘的约束,它的 end 边缘则约束向一条参考线,而 bottom 边缘则没有被约束,这个 View 的 layout_widthlayout_height 都被设置成 match_constraint,表示他们会根据所有的约束来设置宽高。在布局阶段这个组件的宽度就被计算好了,但是它的高度好像没有被确定。然后,因为设置了宽高横纵比,高度其实也被确定了,只是宽度的一个函数输出值(在以上例子中横纵比是 16:9 )

这样设置的好处就是,当宽度变化的时候,高度自动跟着变化,如下图通过移动这个 View 组件 end 边缘约束向的参照线就可以看到效果。

在 XML 中的尺寸横纵比 DimensionRatio

上例中的 XML 源码如下:

<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:app="http://schemas.android.com/apk/res-auto"
  xmlns:tools="http://schemas.android.com/tools"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  tools:context="com.stylingandroid.scratch.MainActivity">

  <View
    android:id="@+id/imageView"
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:layout_marginStart="16dp"
    android:layout_marginTop="16dp"
    app:layout_constraintDimensionRatio="h,15:9"
    app:layout_constraintEnd_toStartOf="@+id/guideline"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent" />

  <android.support.constraint.Guideline
    android:id="@+id/guideline"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    app:layout_constraintGuide_percent="0.39" />

</android.support.constraint.ConstraintLayout>

可以发现,设置横纵比的属性是 app:layout_constraintDimensionRatio ,而这个值有两个部分组成:方向和比例值。

通过上面的视图编辑器,我们已经知道了宽度就是输入的固定值,从而设置了方向是 h 标识了 horizontal 。其实这个方向可以不用设置,在运行时的 layout 布局过程就可以计算推断出来,但显示的在 xml 源码中声明避免了所有可能出现模棱两可的情况发生。在大多数情况下,这非常不必要因为本身方向是不言自明的,就像例子中,唯有高度没被约束,很容易推断出来高度是根据宽度来的变量函数。

这种横纵比的组件往往又很大的说服力,当横纵比的权利被赋予的时候。

最后还要提到的是,上文提到的宽高属性被设置成 match_constraint 实际上在 XML 源码中表现是被设置成 0dp,这就像 LinearLayoutweight 属性一样,会在 XML 中设置为 0dp ,而实际大小会根据父组件在布局 layout 过程中的大小来决定计算出来。

最新系列教程,可以关注我的博客 https://biaomingzhong.github.io/


http://www.niftyadmin.cn/n/2420555.html

相关文章

〖Python APP 自动化测试实战篇⑦〗- 实战 - appium 定位手机元素的超级方法 - uiautomator

万叶集&#x1f389; 隐约雷鸣&#xff0c;阴霾天空。 &#x1f389;&#x1f389; 但盼风雨来&#xff0c;能留你在此。 &#x1f389;前言&#xff1a; ✌ 作者简介&#xff1a;渴望力量的哈士奇 ✌&#xff0c;大家可以叫我 &#x1f436;哈士奇&#x1f436; &#xff0c;一…

redis 客户端操作命令

1.对value操作的命令exists(key)&#xff1a;确认一个key是否存在del(key)&#xff1a;删除一个keytype(key)&#xff1a;返回值的类型keys(pattern)&#xff1a;返回满足给定pattern的所有key keys *randomkey&#xff1a;随机返回key空间的一个keyrename oldname newname…

关于 appium 启动 app 后闪退的问题 - (已解决)

万叶集&#x1f389; 隐约雷鸣&#xff0c;阴霾天空。 &#x1f389;&#x1f389; 但盼风雨来&#xff0c;能留你在此。 &#x1f389;前言&#xff1a; ✌ 作者简介&#xff1a;渴望力量的哈士奇 ✌&#xff0c;大家可以叫我 &#x1f436;哈士奇&#x1f436; &#xff0c;一…

php 贝叶斯算法,PHP如何实现机器学习之朴素贝叶斯算法

本文主要介绍了PHP实现机器学习之朴素贝叶斯算法,结合实例形式详细分析了朴素贝叶斯算法的概念、原理及php实现技巧,需要的朋友可以参考下&#xff0c;希望能帮助到大家。本文实例讲述了PHP实现机器学习之朴素贝叶斯算法。分享给大家供大家参考&#xff0c;具体如下&#xff1a…

日志和实时流计算处理

到目前为止&#xff0c;我还仅仅只是描述了一些把数据从一个地方拷贝到其他地方的多种的方法。然而&#xff0c;在存储系统间挪动字节并不是故事的结尾。实际上我们发现&#xff0c;“日志”是“流”的另外一种说法&#xff0c;而日志&#xff08;的处理&#xff09;是流计算处…

关于 appium 如何关闭 app (已解决)

万叶集&#x1f389; 隐约雷鸣&#xff0c;阴霾天空。 &#x1f389;&#x1f389; 但盼风雨来&#xff0c;能留你在此。 &#x1f389;前言&#xff1a; ✌ 作者简介&#xff1a;渴望力量的哈士奇 ✌&#xff0c;大家可以叫我 &#x1f436;哈士奇&#x1f436; &#xff0c;一…

〖Python APP 自动化测试实战篇⑧〗- 实战 - appium 模拟手机滑动操控的操作

万叶集&#x1f389; 隐约雷鸣&#xff0c;阴霾天空。 &#x1f389;&#x1f389; 但盼风雨来&#xff0c;能留你在此。 &#x1f389;前言&#xff1a; ✌ 作者简介&#xff1a;渴望力量的哈士奇 ✌&#xff0c;大家可以叫我 &#x1f436;哈士奇&#x1f436; &#xff0c;一…

Java和U3D比较,如何比较Unity中GameObject的名称

所以我正在做简单的游戏&#xff0c;把正确的答案放在正确的位置 . 这就是当你把正确的贴纸放在插槽上时你得分 . 例如&#xff0c;如果你把贴纸“a”放到插槽“b”&#xff0c;那你得到了一点 . 然后贴纸“a”&#xff0c;贴纸成为插槽“b”的孩子 . 问题是&#xff0c;当我使…