草庐IT

android - 设备屏幕尺寸对缩放的 ImageViews 有奇怪的影响

coder 2023-12-03 原文

更新: 多设备屏幕尺寸是一个转移注意力的问题 - 问题只是图像没有适本地放大以填满屏幕 - 请参阅 Ivan 的回答评论。

我有一个包含一张图片的布局文件:

<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/image"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:adjustViewBounds="true"
    android:scaleType="centerCrop" />

然后我分配一个 drawable,它很小并且必须按比例放大:

setContentView(R.layout.image_story);
ImageView image = (ImageView)findViewById(R.id.image);
image.setImageDrawable(s.image);

这是它在两个具有不同屏幕尺寸的 AVD 上的呈现方式。这些应该是相同的(底部的详细问题)。抱歉图片太大。

使用 scaleType=centerCrop:

有 centerInside

AVD:

编辑:

使用 layout_height="fill_parent"和 scaleType="centerInside"

我有一个具有默认值的 2.1 AVD,因此屏幕较小,这完全符合预期 - 图像按比例放大以填充宽度, View 高度包裹到缩放后的高度。

在我的屏幕较长的 Droid Bionic 和任何具有相同屏幕尺寸的 AVD 上,这不起作用 - 图像被缩放以填充宽度,但 View 被包裹到原始 预缩放图像高度,因此顶部和底部被裁掉。

我不知道为什么设备屏幕纵横比会对此产生影响。我已经尝试了无数种布局参数和比例类型的组合,试图让它在 Bionic 上运行。在较小的屏幕上,一切都完全符合预期,而不是在较大的屏幕上。如果我在 dp 中明确设置图像高度,它会按预期工作,但我永远不知道图像(或屏幕)的尺寸是多少。有什么建议吗?

最佳答案

这确实是一个很好的问题。

这就是它表现如此的原因(来自 ImageView.onMeasure(int, int) [line 661] ):

// Try adjusting height to be proportional to width
if (!done && resizeHeight) {
    int newHeight = (int)((widthSize - pleft - pright)
            / desiredAspect) + ptop + pbottom;
    if (newHeight <= heightSize) { // line 661
        heightSize = newHeight;
    } // line 663
}

它所做的是,只有当基于可绘制对象的纵横比和调整后的宽度(在我们的例子中,即父 View 的确切宽度)的新高度小于时,它才会调整 View 的高度 比调整后的高度(在我们的例子中,这只是 drawable 的原始高度加上填充。如果你想让我进一步降低这一点,请告诉我。)

我不明白的是为什么有新高度必须更小的限制。仅当我们的 heightSize 为 EXACTLY 或 AT_MOST 并且已设置为上限时才有意义。在其他情况下,它没有必要如此。

所以实际上应该调用另一个 661 到 663 而不是 661 到

heightSize = resolveAdjustedSize(newHeight, mMaxHeight, heightSpec);

确保我们只在应该限制时使用高度限制(即,我们在 heightSpec 中得到了 AT_MOST 限制,并且 heightSpec 中的高度值小于新高度。除非我们使用可变宽度,否则不会发生在这里.)

也许,我错过了什么。伙计们,无论谁正在阅读本文,如果您发现其中的任何缺陷,请发表评论,特别是如果您是 Google Android 团队的一员:)

PS 作为解决方法,我建议您实现自定义 ImageView 并覆盖 onMeasure(int, int) 以将边界设置为您的确切宽高比。如果您需要有关实际代码的帮助,请告诉我。

UPD 我要写下名字以引起 Google 聪明的 android 人的注意(我希望他们已经设置了 Google Alerts):Romain Guy、Roman Nurik、Reto Meier ,请看一下这个讨论。

关于android - 设备屏幕尺寸对缩放的 ImageViews 有奇怪的影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9233259/

有关android - 设备屏幕尺寸对缩放的 ImageViews 有奇怪的影响的更多相关文章

  1. ruby-on-rails - 添加回形针新样式不影响旧上传的图像 - 2

    我有带有Logo图像的公司模型has_attached_file:logo我用他们的Logo创建了许多公司。现在,我需要添加新样式has_attached_file:logo,:styles=>{:small=>"30x15>",:medium=>"155x85>"}我是否应该重新上传所有旧数据以重新生成新样式?我不这么认为……或者有什么rake任务可以重新生成样式吗? 最佳答案 参见Thumbnail-Generation.如果rake任务不适合你,你应该能够在控制台中使用一个片段来调用重新处理!关于相关公司

  2. 屏幕录制为什么没声音?检查这2项,轻松解决 - 2

    相信很多人在录制视频的时候都会遇到各种各样的问题,比如录制的视频没有声音。屏幕录制为什么没声音?今天小编就和大家分享一下如何录制音画同步视频的具体操作方法。如果你有录制的视频没有声音,你可以试试这个方法。 一、检查是否打开电脑系统声音相信很多小伙伴在录制视频后会发现录制的视频没有声音,屏幕录制为什么没声音?如果当时没有打开音频录制,则录制好的视频是没有声音的。因此,建议在录制前进行检查。屏幕上没有声音,很可能是因为你的电脑系统的声音被禁止了。您只需打开电脑系统的声音,即可录制音频和图画同步视频。操作方法:步骤1:点击电脑屏幕右下侧的“小喇叭”图案,在上方的选项中,选择“声音”。 步骤2:在“声

  3. 【鸿蒙应用开发系列】- 获取系统设备信息以及版本API兼容调用方式 - 2

    在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList​()Obt

  4. 安卓apk修改(Android反编译apk) - 2

    最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路

  5. .net - .NET 将如何影响 Python 和 Ruby 应用程序? - 2

    我很好奇.NET将如何影响Python和Ruby应用程序。用IronPython/IronRuby编写的应用程序是否会非常特定于.NET环境,以至于它们实际上将变得特定于平台?如果他们不使用任何.NET功能,那么IronPython/IronRuby相对于非.NET同类产品的优势是什么? 最佳答案 我不能说任何关于IronRuby的东西,但是大多数Python实现(如IronPython、Jython和PyPy)都试图尽可能忠实于CPython实现。不过,IronPython正在迅速成为这方面的佼佼者之一,并且在PlanetPyth

  6. ruby-on-rails - 禁用设备的 :confirmable on-the-fly to batch-generate users - 2

    Devise是一个Ruby库,它为我提供了这个User类:classUser当写入:confirmable时,注册时会发送一封确认邮件。上周我不得不批量创建300个用户,所以我在恢复之前注释掉了:confirmable几分钟。现在我正在为用户批量创建创建一个UI,因此我需要即时添加/删除:confirmable。(我也可以直接修改Devise的源码,但我宁愿不去调和它)问题:如何即时添加/删除:confirmable? 最佳答案 WayneConrad的解决方案:user=User.newuser.skip_confirmation

  7. ruby-on-rails - 浮点乘法的 Ruby 奇怪问题 - 2

    有没有人用ruby​​解决这个问题:假设我们有:a=8.1999999我们想将它四舍五入为2位小数,即8.20,然后乘以1,000,000得到8,200,000我们是这样做的;(a.round(2)*1000000).to_i但是我们得到的是8199999,为什么?奇怪的是,如果我们乘以1000、100000或10000000而不是1000000,我们会得到正确的结果。有人知道为什么吗?我们正在使用ruby​​1.9.2并尝试使用1.9.3。谢谢! 最佳答案 每当你在计算中得到时髦的数字时使用bigdecimalrequire'bi

  8. ruby - 奇怪的 ruby​​ for 循环行为(为什么这样做有效) - 2

    defreverse(ary)result=[]forresult[0,0]inaryendresultendassert_equal["baz","bar","foo"],reverse(["foo","bar","baz"])这行得通,我想了解原因。有什么解释吗? 最佳答案 如果我使用each而不是for/in重写它,它看起来像这样:defreverse(ary)result=[]#forresult[0,0]inaryary.eachdo|item|result[0,0]=itemendresultendforainb基本上就

  9. ruby-on-rails - ruby数组奇怪的东西(无限数组) - 2

    当我写下面的代码时:x=[1,2,3]x我得到这个输出:[1,2,3,[...]][1,2,3,[...]][1,2,3,[...]]我不应该只得到[1,2,3,[1,2,3]]吗?解释是什么? 最佳答案 这没什么奇怪的。数组的第四个元素就是数组本身,所以当你求第四个元素时,你得到的是数组,当你求第四个元素的第四个元素时,你得到的是数组,当你求第四个元素时,你得到的是数组。第四个元素的第四个元素的第四个元素的元素......你得到了数组。就这么简单。唯一有点不寻常的是Array#to_s检测到这样的递归,而不是进入无限循环,而是返回

  10. ruby - 比较 rspec 中的 float 时的奇怪行为 - 2

    以下测试中的第3个失败:specify{(0.6*2).shouldeql(1.2)}specify{(0.3*3).shouldeql(0.3*3)}specify{(0.3*3).shouldeql(0.9)}#thisonefails这是为什么呢?这是浮点问题还是ruby​​或rspec问题? 最佳答案 从rspec-2.1开始specify{(0.6*2).shouldbe_within(0.01).of(1.2)}在那之前:specify{(0.6*2).shouldbe_close(1.2,0.01)}

随机推荐