Android ImageView scaleType使用

目录

一、src设置图片资源

二、scaleType设置图片缩放类型

三、scaleType具体表现

matrix: 

fitXY:

fitStart:

fitCenter: 

fitEnd:

Center:

centerCrop:

centerInside:

控制ImageView和图片的大小保持一致

maxHeight最大高度         

maxWidth最大宽度

adjustViewBounds调整View的界限

四、自定义imageview


一、src设置图片资源

在drawable文件夹中导入图片资源

二、scaleType设置图片缩放类型

通过上面的图片可以看到,我导入的图片并没有占满整个ImageView控件,上下都有空白。这时可以通过scaleType来控制图片的缩放。

查看scaleType的源码,可以看到scaleType有很多值。

<attr name="scaleType">
            <!-- matrix:不改变原图大小,将图片放在ImageView的左上角 -->
            <enum name="matrix" value="0" />
            <!-- fitXY 不按比例缩放图片,使得图片填充整个 ImageView,可能会导致图片拉伸变形 -->
            <enum name="fitXY" value="1" />
            <!-- fitStart:保持图片的宽高比不变,直到较长的边与ImageView控件的边长相等,缩放完成后将图片放置于ImageView的左上角-->
            <enum name="fitStart" value="2" />
            <!-- fitCenter:按比例缩放图片,使得图片完全显示在 ImageView 中,且居中显示,可能会留有空白 -->
            <enum name="fitCenter" value="3" />
            <!-- fitEnd:按比例缩放图片,使得图片完全显示在 ImageView 中,且靠右下角显示,可能会留有空白 -->
            <enum name="fitEnd" value="4" />
            <!-- center:将图片居中显示,不进行缩放。不改变原图大小。如果原图小于ImageView的大小,则保持原图大小,显示在ImageView的中心,当原图大于ImageView的大小时,只保留原图片中间的部分,其他部分裁剪掉 -->
            <enum name="center" value="5" />
            <!--centerCrop:保持图片宽高比不变,缩放图片,直到完全覆盖ImageView,图片要在ImageView中居中。可能会出现图片显示不完整 -->
            <enum name="centerCrop" value="6" />
            <!-- centerInside:按比例缩放图片,使得整个图片完全显示在 ImageView 中,可能会留有空白 -->
            <enum name="centerInside" value="7" />
</attr>

三、scaleType具体表现

现在准备两张图片,RC.jpg(图片比ImageView大很多),RC2.jpg(图片比ImageView小) 

matrix: 

fitXY:

fitXY会改变原图片的宽高比,然后通过缩放使整个图片都显示在ImageView中

fitStart:

fitCenter: 

fitEnd:

Center:

当我使用RC.jpg图片时,由于该图片很大,所以ImageView只会显示原图片中间大小为200dp*200dp(也就是ImageView的大小)的范围,也就是图中红色框的部分,其余部分全部裁剪掉。

最终显示的效果如下图:

但是如果我们使用RC2.jpg图片,由于该图片比ImageView小,所以会把RC2.jpg整个图片放在中间的位置,如下图

Center的特点:不改变图片的大小,按照原图片的大小显示在ImageView中间,但会将超出的部分裁剪

centerCrop:

通俗的讲就是以ImageView的宽高比为依据,在图片中间部分按照该比例取最大限度的范围,然后缩放显示在ImageView中。

比如我ImageView的大小设置的是200dp*200dp,也就是1:1大小,那么就在原图片中间部分1:1比例取一个最大的范围,然后缩小(因为我RC.jpg图片很大所以就是缩小,如果使用RC2.jpg那就是放大)显示在ImageView中

                                

centerInside:

如果图片比ImageView大,那就缩小到把整个图片都放到ImageView中,此时类似于fitCenter

如果图片比ImageView小,那就直接将图片原大小放置在ImageView中间,此时类似于Center

控制ImageView和图片的大小保持一致

maxHeight最大高度         

maxWidth最大宽度

adjustViewBounds调整View的界限

通过使用maxWidth和maxHeight来控制图片的最大宽度和最大高度,其中adjustViewBounds的值要设置为true才会生效。

当图片大于设置的maxWidth,maxHeight时,根据小的值(maxWidth为200dp,maxHeight为300dp,maxWidth小,所以以宽200dp为依据保持原图比例不变)来等比例缩小。

当图片的大小小于设置的maxWidth,maxHeight时,ImageView的大小就是原图片的大小。

四、自定义imageview

需求:把图片按照宽高、比例扩大,直到铺满手机屏幕宽度,高度按照原图片之前的比例扩大显示,如果刚刚好,不用做任何处理。

  <com.widget.CustomFullImageView
                android:id="@+id/iv_desc_icon"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_marginTop="10dp"
                android:src="@drawable/test_icon" />
public class CustomFullImageView extends androidx.appcompat.widget.AppCompatImageView {

    public CustomFullImageView(Context context) {
        super(context);
    }

    public CustomFullImageView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public CustomFullImageView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        Drawable drawable = getDrawable();
        if (drawable != null) {
            int width = MeasureSpec.getSize(widthMeasureSpec);

            int imageWidth = drawable.getIntrinsicWidth();
            int imageHeight = drawable.getIntrinsicHeight();

            if (imageWidth > 0 && imageHeight > 0) {
                float scale = (float) width / imageWidth;

                // 计算按比例扩大后的高度
                int newHeight = (int) (imageHeight * scale);

                // 设置测量后的宽高
                setMeasuredDimension(width, newHeight);
            } else {
                super.onMeasure(widthMeasureSpec, heightMeasureSpec);
            }
        } else {
            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/891445.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【优选算法】(第四十一篇)

目录 被围绕的区域&#xff08;medium&#xff09; 题目解析 讲解算法原理 编写代码 迷宫中离⼊⼝最近的出⼝&#xff08;medium&#xff09; 题目解析 讲解算法原理 编写代码 被围绕的区域&#xff08;medium&#xff09; 题目解析 1.题目链接&#xff1a;. - 力扣&a…

创建docker虚拟镜像,创建启动服务脚本

进入系统命令服务目录 编辑服务 [Unit] DescriptionDocker Application Container Engine Documentationhttps://docs.docker.com Afternetwork-online.target firewalld.service Wantsnetwork-online.target [Service] Typenotify ExecStart/usr/bin/dockerd ExecReload/bin/…

[旧日谈]关于Qt的刷新事件频率,以及我们在Qt的框架上做实时的绘制操作时我们该关心什么。

[旧日谈]关于Qt的刷新事件频率&#xff0c;以及我们在Qt的框架上做实时的绘制操作时我们该关心什么。 最近在开发的时候&#xff0c;发现一个依赖事件来刷新渲染的控件会导致程序很容易异常和崩溃。 当程序在运行的时候&#xff0c;其实软件本身的负载并不高&#xff0c;所以…

【量化交易】聚宽安装

安装JQData 更换源&#xff1a; 如果使用的是pip默认的PyPI源&#xff0c;可以尝试更换为一个更快的国内镜像源。例如阿里云、豆瓣等提供的PyPI镜像。 更改方法可以通过设置环境变量或者在pip命令中直接指定&#xff1a; PS C:\Users\bilirjs\Documents> pip config set …

fastadmin 多商户模式下侧边栏跳转路径BUG

记录&#xff1a;仅作自己项目记录&#xff0c;在一个域名下部署多套项目时&#xff0c;若是多商户模式项目会出现跳转路径问题。 修改 \manystore\library\Auth.php 文件的 getSidebar 方法 // 1 改为&#xff1a; $v[url] isset($v[url]) && $v[url] ? $v[url] :…

一键快捷回复软件助力客服高效沟通

双十一临近&#xff0c;电商大战一触即发&#xff01;在这个购物狂欢的热潮中&#xff0c;客服团队的效率至关重要。今天我要和大家分享一个非常实用的快捷回复软件&#xff0c;特别是为电商客服小伙伴们准备的。这款软件能够极大地提高你的工作效率&#xff0c;让你在处理客户…

前端布局与响应式设计综合指南(二)

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;Css篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来Css篇专栏内容:前端布局与响应式设计综合指南(二) 目录 23、行内元素和块级元素&#xff1f;img算什么&…

音视频入门基础:FLV专题(15)——Video Tag简介

一、引言 根据《video_file_format_spec_v10_1.pdf》第75页&#xff0c;如果某个Tag的Tag header中的TagType值为9&#xff0c;表示该Tag为Video Tag&#xff1a; 这时StreamID之后紧接着的就是VideoTagHeader&#xff0c;也就是说这时Tag header之后的就是VideoTagHeader&…

热成像人像算法呈现方式!

一、热红外成像技术 热红外成像技术利用物体发出的红外辐射进行成像&#xff0c;这种辐射与物体的温度有关。因此&#xff0c;热红外成像可以不受光照条件的影响&#xff0c;且在图像中&#xff0c;人体由于温度较高&#xff0c;通常会比背景显得更亮。 二、图像处理算法 阈…

远翔原厂芯片设计开发软件:降压恒流共阳极无频闪调光芯片FP7126/7127/7128,舞台灯磁吸轨道灯智能家居应用方案

FP7126 FP7127 FP7128是平均电流模式控制的 LED 驱动 IC&#xff0c;具有稳定输出恒流的能力&#xff0c;优秀的负载调整率与高精度的电流控制。不用额外增加外部补偿元件&#xff0c;简化 PCB 板设计。FP7126 FP7127 FP7128可接受 PWM 数位调光&#xff0c;建议调光频率 0.1kH…

[C++ 核心编程]笔记 4.1.4 类和对象 - 案例1

类和对象: 案例1: 设计立方体类(Cube) 求出立方体的面积和体积分别用全局函数和成员函数判断两个立方体是否相等。 设计方法: 创建立方体类设计属性设计行为 求立方体面积和体积分别用全局和成员函数 判断立方体是否相等 #include<iostream> using namespace std;clas…

音频剪辑在线工具 —— 让声音更精彩

你是否曾梦想过拥有自己的声音创作空间&#xff0c;却苦于复杂的音频编辑软件&#xff1f;接下来&#xff0c;让我们一同揭开这些音频剪辑在线工具的神秘面纱&#xff0c;看看它们如何帮助你实现从录音到发布的无缝衔接。 1.福昕音频剪辑 链接直达>>https://www.foxits…

勇攀保研高峰:解锁环节与要点,更容易上岸成功

在大学的逐梦之旅中&#xff0c;保研宛如一座令人向往的学术高峰&#xff0c;吸引着无数优秀学子奋力攀登。对于那些渴望在学术道路上更进一步的同学来说&#xff0c;了解保研的各个环节和考察要点至关重要。那么&#xff0c;保研究竟有着怎样的神秘路径呢&#xff1f;让我们一…

ArcGIS中分区统计栅格值前需要进行投影吗(在投影坐标系下进行吗),为什么?

最近&#xff0c;我接到了一个分区统计栅格数值前需要进行投影&#xff0c;或者说是必须需要在投影坐标系下进行吗的咨询。 答案是不需要刻意去变。 但是他又说他把地理坐标系下分区统计结果与投影坐标系下的分区统计结果分别做了一遍&#xff0c;并进行了对比&#xff0c;两个…

day11-SpringMVC

一、SpringMVC 1.SpringMVC流程分析 2.各种注解 3.接收请求参数 3.1 简单类型 3.2 对象类型 3.3 数组类型 3.4 集合类型 3.5 日期类型 3.6 json参数类型 3.7 路径参数 二、统一异常处理 三、Restful

基础教程 | 用VuePress搭建一个简单的个人博客(附源码)

先附上自己个人博客页面&#xff1a;https://illusionno.github.io/ 源码也在这里&#xff1a;https://github.com/illusionno/my-blog &#xff08;如果觉得有帮助&#xff0c;可以点颗star✨&#xff09; 使用的主题是vuepress-theme-reco2.x&#xff0c;并在上面进行了一些调…

软考——计算机网络概论

&#x1f550;计算机网络分类 1️⃣通信子网和资源子网 通信子网&#xff1a;通信节点&#xff08;集线器、交换机、路由器等&#xff09;和通信链路&#xff08;电话线、同轴电缆、无线电线路、卫星线路、微博中继线路和光纤缆线&#xff09;。用户资源子网&#xff1a;PC、…

快速理解http的get和post

在网络通信中&#xff0c;HTTP 协议扮演着非常重要的角色&#xff0c;而不同的 HTTP 方法决定了客户端与服务器之间的交互方式。 这里讲一下最常用的两种方法——GET 和 POST。 一、GET 方法 GET 方法用于从服务器获取资源。 这就像去图书馆借书——你向图书馆请求一本特定的…

理解智能合约:区块链在Web3中的运作机制

随着区块链技术的不断发展&#xff0c;“智能合约”这一概念变得越来越重要。智能合约是区块链应用的核心之一&#xff0c;正在推动Web3的发展&#xff0c;为数字世界带来了前所未有的自动化和信任机制。本文将深入探讨智能合约的基本原理、运作机制&#xff0c;以及它在Web3生…

如何破解 AI 聊天机器人让它们吐露秘密!窥探 AI 系统指令的 10 种技巧

​ 有时&#xff0c;为了确保 AI 的安全性和透明性&#xff0c;用户需要自己动手&#xff0c;揭开系统指令的面纱。 如果人工智能现在已经成为生活中的事实&#xff0c;并影响着我们的福祉&#xff0c;人们理应知道它的运作原理。 对一些人来说&#xff0c;科幻电影中的经典…