【问题标题】:AppCompatImageView displaying big image using ScaleType.CENTER and the use of paddingAppCompatImageView 使用 ScaleType.CENTER 显示大图和使用 padding
【发布时间】:2022-01-07 01:05:36
【问题描述】:

我有一个 3264x1836 的图像,并在尺寸为 1280x720 的自定义 AppCompatImageView 中显示它。我想保留图像大小,所以我使用ScaleType.CENTER,但我也希望它的左上角位于我的自定义视图的坐标 0,0 处,因此我相应地设置了填充左和上。
现在,为了实现这一点,我必须使用 3264-1280(宽度之间的差异)作为左侧填充,并使用 1836-720(高度之间的差异)作为顶部填充,而在我看来,这些值都应该除以 2 .
谁能解释一下原因?

【问题讨论】:

    标签: android android-layout android-imageview


    【解决方案1】:

    您很可能会破坏 AppCompatImageView 代码,因为它要求它做一些没有预料到或测试过的事情。

    虽然上述情况可能仍然正确,但您应用的填充是正确的。以下是计算:

    为简单起见,让我们看一下移动图形所需的左侧填充。相同类型的计算将适用于顶部填充。

    图形的宽度大于ImageView的宽度。

    d = wgraphic - wimageview

    如果图形在ImageView中居中,那么左右两边的悬垂将是宽度差的1/2。

    s = d / 2

    图形在 ImageView 的内边距内居中。必须指定的填充量必须刚好足以使图形的中心移动 s 量。

    ImageView 没有填充的初始中心是

    ci = wimageview / 2

    左填充( p )的移位中心是

    cs = p + (wimageview - p) / 2

    所以,

    s = cs - ci = p + (wimageview - p) / 2 - (wimageview / 2)

    求解 s 移位所需的填充,我们得到 p = 2s = d。换句话说,我们需要的填充是您所看到的所需移位的两倍。

    不涉及填充的修复方法是指定

     android:scaleType="matrix" 
    

    您应该删除填充。新的比例类型会将单位矩阵应用于图像并将其放置在左上角而不调整大小。

    【讨论】:

    • 我对您的解决方案进行了一些尝试,它完成了它必须做的事情,但这对我不利。事实上,我的目标比我在我试图简化的问题中解释的要复杂得多。我需要在 ScaleType.CENTER_CROP 视图和四个角缩放视图之一之间切换。矩阵适用于左上角,但不适用于其他三个既不使用填充也不使用 translate() 的地方。无论如何,谢谢!
    • @Luca 所以,我已经按照说明回答了您的问题,但您需要回答您没有提出的问题。
    • 问题是“有人能解释为什么吗?”而不是“有人可以提出替代方案吗?”。但这只是无用的澄清。相反,更重要的是,我与 setTranslate 和 setScale 一起在矩阵上进行了更多工作,并找到了一个干净且更优雅的解决方案。总之,您回答了这个问题并提出了一个有效的替代方案,干得好!
    猜你喜欢
    • 2022-01-03
    • 1970-01-01
    • 2017-05-31
    • 2013-01-25
    • 2012-06-23
    • 1970-01-01
    • 1970-01-01
    • 2018-05-13
    • 2020-04-13
    相关资源
    最近更新 更多