如何将 ImageView 与底部对齐,填充其宽度和高度,并保持其长宽比?

2024-01-21

背景

ImageView 有各种 XML 属性来缩放其内容,以及各种允许放置视图并设置其大小的布局视图。

但是,我无法弄清楚如何在某些情况下很好地缩放 imageView 。

一个例子是将 ImageView 放在底部(例如,frameLayout 的底部),尽可能缩放其宽度,并仍然保持纵横比(不裁剪)。

问题

我发现的所有组合都不起作用,包括各种 ScaleType 值、adjustViewBounds、gravity 等。

看起来 ImageView 错过了一些重要的 ScaleType 值。

我尝试过的

到目前为止,唯一对我有用的解决方案是将 imageView 设置为底部(使用重力设置为底部和中心水平),并使用类似于此的代码:

final ImageView logoBackgroundImageView = ...;
final LayoutParams layoutParams = logoBackgroundImageView.getLayoutParams();
final Options bitmapOptions = ImageService.getBitmapOptions(getResources(), R.drawable.splash_logo);
final int screenWidth = getResources().getDisplayMetrics().widthPixels;
layoutParams.height = bitmapOptions.outHeight * screenWidth / bitmapOptions.outWidth;
logoBackgroundImageView.setLayoutParams(layoutParams);

这通常是有效的,并且不需要太多更改即可使其在非全屏模式下工作,但我想知道是否有更简单的方法。

如果高度太大,它可能不起作用,因此您可能需要更改它,以便在发生这种情况时,将宽度设置得更小,以允许所有内容适合容器。

问题

是否有解决方案或库可以解决与 ImageView 相关的各种问题?


编辑:这是我尝试做的示例图像,这次是在垂直 LinearLayout 中,该 LinearLayout 将 ImageView 限制在中间,位于另外 2 个视图之间:

正如您所看到的,在某些(或全部?)预览中,中间图像向右对齐,而不是保持在中间(水平)。

我希望它占据它所获得的所有空间并进行缩放(保持纵横比),但与它所拥有的空间的底部对齐。

下面是我尝试过的一种组合的 XML 示例:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:background="#FF339AE2">

    <View
        android:layout_width="match_parent"
        android:id="@+id/topView"
        android:layout_alignParentTop="true"
        android:layout_height="100dp"
        android:background="#FF00ff00"
        />


    <FrameLayout
        android:layout_below="@+id/topView"
        android:layout_width="match_parent"
        android:layout_centerHorizontal="true"
        android:layout_above="@+id/bottomView"
        android:layout_height="match_parent">

        <ImageView
            android:layout_width="match_parent"
            android:background="#FFffff00"
            android:layout_gravity="bottom|center_horizontal"
            android:src="@android:drawable/sym_def_app_icon"
            android:scaleType="fitEnd"
            android:layout_height="match_parent"
            />
    </FrameLayout>

    <View
        android:background="#FFff0000"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:id="@+id/bottomView"
        android:layout_width="match_parent"
        android:layout_height="100dp"/>

</RelativeLayout>

再次请注意,我已经尝试了多种组合,但没有一个起作用,因此如果您建议在 XML 中进行某些更改,请先尝试一下。另请注意,上面是 POC(以便于阅读)。

顺便说一句,我建议的解决方法适用于某些(或大多数?)情况,但并非全部。您只需旋转设备即可注意到它。也许有一种方法可以修复它,或者从 ImageView 扩展以提供额外的情况。


您需要三个属性的组合:

android:layout_height="wrap_content"
android:scaleType="fitCenter"
android:adjustViewBounds="true"

The adjustViewBounds需要属性,因为ImageView默认情况下,测量自身以匹配可绘制对象的原始尺寸,而不考虑根据缩放类型执行的任何缩放。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将 ImageView 与底部对齐,填充其宽度和高度,并保持其长宽比? 的相关文章

  • java.lang.IllegalArgumentException:此组件要求您指定有效的 android:textAppearance 属性

    我的布局文件之一中有一个 com google android material button MaterialButton 组件 当我使用最新版本的 Material Components 库 com google android mat
  • android edittext中的字符映射

    我想让我的编辑文本就像我写字符 g 时一样 它是相关的映射自定义字符应该写成印地语中的 我认为应该有字符映射 但没有知识任何人都可以帮助我 怎么做 其他应用程序https play google com store apps details
  • 如何自定义菜单项的背景颜色?

    我正在尝试定制Toolbar的弹出菜单 现在我无法设置菜单项的背景颜色 我的 styles xml 如下所示
  • Xamarin Android Webview Javascript

    我正在尝试通过 Xamarin for Android 创建一个移动应用程序 它有一个显示网站的 WebView 问题是正常按钮会触发 但 javascript 事件不会触发 我已经启用了 Javascript 但没有运气 如何在 Andr
  • 从响应中获取标头(Retrofit / OkHttp 客户端)

    我正在使用 Retrofit 与 OkHttp 客户端和 Jackson 进行 Json 序列化 并希望获取响应的标头 我知道我可以扩展 OkClient 并拦截它 但这发生在反序列化过程开始之前 我基本上需要的是获取标头以及反序列化的 J
  • 如何使用 Google Maps for Android V2 处理地图移动结束?

    我想在地图中心更改后立即对地址进行地理编码 如何使用新的 Android 版 Google 地图 V2 处理地图移动 我说的是用户用手指拖动地图的情况 查看新的地图 API Override public void onMapReady G
  • 将现有 VARCHAR 列与 Room 结合使用

    我正在尝试将现有的数据库与 Android Room 一起使用 但是 我的一个表有一个 VARCHAR 列 Room 似乎只支持 TEXT 不支持 VARCHAR 而且 sqlite 不允许修改列类型 那么 有没有办法使用Room中现有的带
  • 如何在我现有的 Android 应用程序中使用 Telegram API(包括聊天应用程序)?

    我想使用 telegram API 在我现有的 Android 应用程序中开发聊天功能 我不知道如何实施 我认为 看看Telegram 数据库库 测试版 从这里TDLib https core telegram org tdlib 俄语 但
  • 在 Cordova 应用程序中获取额外功能

    我们有两个 Android 应用程序 一个使用本机 Java 实现 另一个使用 Ionic 编写 Ionic 应用程序启动我的应用程序 这是使用灯插件 https github com lampaa com lampa startapp 我
  • 图像作为电子邮件附件

    我想构建一个应用程序 我可以在电子邮件中附加图像 打开图像并将其设置为我的壁纸 我想让它跨平台 所以你能告诉我是否可以使用phonegap 或者我是否必须为iphone和android构建一个本机应用程序 您好 如果您只想通过电子邮件附加图
  • 从 BroadcastReceiver 类调用活动方法

    我知道我可以做一个内部接收器类来调用接收器中的任何方法 但我的主要活动太大了 要做的事情也很多 因此 我需要一个扩展广播接收器的类 但它不是内部类 并且可以从我的主要活动中调用一种方法 我不知道是否可能 但我的活动是家庭活动和 single
  • 如何在谷歌地图android上显示多个标记

    我想在谷歌地图android上显示带有多个标记的位置 问题是当我运行我的应用程序时 它只显示一个位置 标记 这是我的代码 public class koordinatTask extends AsyncTask
  • okhttp 获取失败响应

    我已经在我的 android 客户端中实现了 okhttp 来进行网络调用 当我收到失败响应时 我会收到失败代码以及与该代码相关的文本作为消息 但我没有收到服务器发送给我的自定义失败响应 在我实施的代码中的失败响应中 我收到的消息只是 错误
  • logcat 中 mSecurityInputMethodService 为 null

    我写了一点android应显示智能手机当前位置 最后已知位置 的应用程序 尽管我复制了示例代码 并尝试了其他几种解决方案 但似乎每次都有相同的错误 我的应用程序由一个按钮组成 按下按钮应该log经度和纬度 但仅对数 mSecurityInp
  • 我应该释放或重置 MediaPlayer 吗?

    我有自己的自定义适配器类 称为 WordAdapter 并且我正在使用媒体播放器 名为pronounce WordAdapter 类中的全局变量 我有不同的活动 其中每个列表项都有线性布局 名为linearLayout 我正在设置onCli
  • 您使用什么物理 Android 设备进行测试?

    有什么好的推荐用于测试目的的物理 Android 设备吗 我正在苹果阵营寻找像 iPod touch 这样的设备 可以帮助 iOS 开发人员测试他们的东西 我知道有 Nexus One 但那东西相当昂贵 而且我并不真正关心手机的东西 而是可
  • 在 Samsung Galaxy S5 Android 5.0 上使用 MediaPlayer 加载音频流需要超过 10 秒

    由于更新至 Android 5 0 MediaPlayer 在 Samsung Galaxy S5 上无法正常工作 启动音频流后加载时间超过 10 秒 示例代码 MediaPlayer mPlayer new MediaPlayer Str
  • 通过电子邮件发送文本文件附件

    我正在尝试附加一个文本文件以便通过电子邮件发送 但每当我打开电子邮件应用程序时 它都会说该文件不存在 请帮助 Intent i new Intent Intent ACTION SEND i setType text plain i put
  • Android:如何从网络异步获取搜索建议?

    我创建了一个可搜索的活动 现在 我想添加从网络服务获取的搜索建议 我想异步获取这些建议 根据添加自定义建议 http developer android com guide topics search adding custom sugge
  • Android 后台倒计时器

    我有一个 Android 应用程序 它管理一个倒计时器 类 CountDownTimer 它显示在应用程序屏幕中 以显示到达 00 00 还剩多少时间 我现在的问题是 当我按主页按钮或启动另一个应用程序时 应用程序 计时器不会在后台运行 所

随机推荐

  • 敲除 javascript foreach 绑定

    我试图允许用户创建一个铸造并向该铸造对象添加一组类别 我试图使用淘汰赛的 foreach 绑定到类别数组 并让用户向铸造添加新类别 我创建了一个 jsfiddle 来说明我在这里试图解释的内容 http jsfiddle net msell
  • Ruby 中的大指数?

    我只是在做一些与大学相关的 Diffie Hellman 练习 并尝试使用 ruby 遗憾的是 Ruby 似乎无法处理大指数 警告 在 a b 中 b 可能太大 NaN 有什么办法解决吗 例如 特殊的数学课或类似的课程 附注这是有问题的代码
  • 获取 Azure 队列中的消息 ID

    有没有办法在将消息插入队列Azure后获取消息ID CloudStorageAccount storageAccount CloudStorageAccount parse storageConnectionString CloudQueu
  • 我可以克隆未来吗?

    我想为未来编写一些通用的重试逻辑 我知道具体的返回类型 并且想在未来重试相同的操作 我的代码只能访问未来 我不想将每个 fn 调用站点包装在闭包中以启用重新创建它 似乎 未来 是 fn args 的组合 并且当 await被调用后 它会运行
  • 如何解决“无法读取 null 的属性‘appendChild’”错误?

    我尝试使用下面的代码 它在我的网站上的幻灯片中添加按钮 window onload function loadContIcons var elem document createElement img elem src http arno
  • Django 模板看不到 CSS 文件

    我正在构建一个 django 应用程序 但无法获取模板来查看 CSS 文件 我的 settings py 文件如下所示 MEDIA ROOT os path join os path abspath os path dirname file
  • Spring Boot未加载application.dev.properties文件

    在我的项目中 我想使用环境特定的属性文件 例如 如果我将其运行到开发中 它应该使用 application dev properties 对于生产它应该使用 application prod properties 等等 我的资源文件夹中有以
  • 当内容较长时,itextsharp 不会创建新页面

    我尝试从 3 天开始寻找制作一份 pdf 文档的方法 如果有任何帮助 我将不胜感激 我有几个表单字段可以毫无问题地访问和填写 我想在此字段下方放置动态创建的表 该表可以足够长 可以包含多个页面 这是我的问题 我无法将此表添加到其下方带有表单
  • 使用上次响应中的数据预填写 Google 表单

    我正在构建一个 Google 表单 我是唯一使用的表单 我每天使用该表单两次 或多或少 我希望某些字段预先填写我上次给出的响应值 因为它们的值不会经常更改 我将我的回复保存在 Google 电子表格中 以便可以从那里获取它们 但我对 Goo
  • 渲染多对多字段

    我试图在模板中显示多个字段 但我得到的只是空白 我将其显示如下 for vehicle in vehicle features features li vehicle features li endfor 我的模型如下 class Vehi
  • 如何使用最新版本的 FFMPEG 在视频录制中创建时间间隙?

    我是论坛的新手 所以我希望我正确地提出了这个问题 我已经下载了最新版本的 FFMPEG 我想用它通过在其中插入时间间隙来修改现有视频 这就是我所说的时间间隔 如果我输入的视频持续 2 秒并以 FPS 10 录制 则其帧的时间戳将如下 0 1
  • 删除 apk 后,每当我启动调试时,它都会告诉我该包尚未安装

    我打开了模拟器 并使用命令提示符删除了我的应用程序 我没有关闭模拟器 然后我进入 Eclipse 并点击 调试 但没有将 apk 部署到模拟器 只是告诉我该包尚未在系统中注册 New package not yet registered w
  • gtk2hs:删除小部件后请求重新计算窗口大小

    我有一个带有三个条目小部件和一个按钮的窗口 我使用该按钮以编程方式删除其中一个小部件 问题是主窗口在被删除后不会改变其大小以适应新的布局 我可以想象我需要向主循环发送一些信号或事件 这会导致重新计算 但我一直无法找到这样的功能 这是一些示例
  • Django的bulk_create函数示例

    我试图理解 Django 中的bulk create 这是我试图转换的原始查询 for e in q msg Message objects create recipient number e mobile content batch co
  • 如何更改 TreeView 节点高度,在节点中绘制 3 条线

    我将 D7 与 TreeView 不是 VirtualTreeView 一起使用 如何更改节点高度以使用 OwnerDraw 并在节点矩形中绘制 3 或 5 或更多 行 文本 所以树应该看起来像这样 显示根节点 2 个节点 aaa 和 bb
  • 使用 PM2 运行自定义 npm 脚本

    我目前正在开发几个 Telegram 机器人 但我想将它们全部保存在同一个 git 存储库中 问题是 另一方面 我想将它们作为单独的进程运行 由于我使用的是 Telegraf 框架 因此要运行机器人 请执行以下操作 micro bot sr
  • 如何在容器内保存对不同元素的多个引用?

    考虑这个简单的例子 v Vec
  • mailchimp api 2.0通过php订阅?

    我需要一个如何通过电子邮件地址订阅 mailchimp 时事通讯的示例 请在此处查看新的 api 链接 https bitbucket org mailchimp mailchimp api php https bitbucket org
  • 两种使用局部敏感哈希查找最近邻居的算法,哪一种?

    目前我正在研究如何使用局部敏感哈希来查找最近邻居 然而 当我阅读论文和搜索网络时 我发现了两种执行此操作的算法 1 使用L个哈希表和L个随机LSH函数 从而增加两个相似文档获得相同签名的机会 例如 如果两个文档的相似度为 80 那么它们有
  • 如何将 ImageView 与底部对齐,填充其宽度和高度,并保持其长宽比?

    背景 ImageView 有各种 XML 属性来缩放其内容 以及各种允许放置视图并设置其大小的布局视图 但是 我无法弄清楚如何在某些情况下很好地缩放 imageView 一个例子是将 ImageView 放在底部 例如 frameLayou