Android ImageView 正确使用姿势

Android Glide使用姿势与原理分析_安卓 glide 自定义图片压缩策略通过实现接口实现。该接口包含方法,可以在其中定义自定义的压缩操作。// 自定义压缩算法return "customTransformation" // 返回唯一标识符,用于缓存// 自定义压缩算法实现// ....load(url)通过实现接口,你可以根据需求制定不同的压缩算法,以满足特定的图片压缩需求。 阅读详情


转载:Android ImageView 正确使用姿势

导语

本文主要介绍了ImageView的相关重要方法,从源码角度剖析了一些容易令人混淆或百思不得其解的问题。

正确合理使用ImageView 的src 和background

src :为ImageView 原图内容,存放原图大小,不会被拉伸;

background:为Imageview的背景,会根据ImageView给定的长宽进行拉伸;

在ImageView中,可以同时设置src和background属性(为了减少绘制,可以根据使用场景来设置相应属性); 由于src中存放的是原图大小,如果需要对其缩放,就需要使用android:scaleTyle这个属性(scaleType 只对src属性有效),另外还可以对background设置透明度。

正确设置Imageview的透明度

设置ImageView的透明度有啥正确不正确的,如直接就mImageView.setAlpha(100),不就行了吗?(答案是不确定,后续分析)

ImageView 设置透明度主要有以下三种方法:

  1. setAlpha(@FloatRange(from=0.0, to=1.0) float alpha) (View提供)

  2. setAlpha(int alpha) (已经标记为@Deprecated)

  3. setImageAlpha(int alpha) (API>=16))

其中,setImageAlpha内部调用setAlpha(int alpha)方法,查看API可知,setAlpha 主要是针对image而言,使用setImageView,一方面在命名上更为贴切与View中的setAlpha方法区分,同时做好兼容性,目前只能使用在API>=16的场景。

另外, 像Drawable 和Paint中的都是调用setAlpha(int alpha))

在本节前就提了一个问题:直接使用mImageView.setAlpha(100),来设置ImageView的透明度是否正确?


正确答案是:

android:src在设置ImageView的setAlpha(int alpha)时,起作用;

android:background在设置ImageView的setAlpha(int alpha)时,不起作用。

为什么呢?

在前面介绍中,已经指出ImageView中的setAlpha(int alpha)方法是针对image有效的,想弄清就直接看源码:

  • setAlpha(int alpha)方法

这里写图片描述

  • 通过applyColorMod方法可知,ImageView.setAlpha(int alpha)方法,是通过Drawable.setAlpha(int alpha)实现的

这里写图片描述

那么mDrawable 是怎样得到的了:

这里写图片描述

setImageDrawable(Drawable d) 中调用 updateDrawable(Drawable d),而mDrawable 正是在updateDrawable(Drawable d)中赋值的:

这里写图片描述

现在知道为什么有时候ImageView.setAlpha(int alpha)没起作用了吧。

  • 在applyColorMod()中为什么使用Drawable.mutate()方法

直接引用Drawable.mutate()的JavaDoc:

Make this drawable mutable. This operation cannot be reversed. A mutable drawable is guaranteed to not share its state with any other drawable. This is especially useful when you need to modify properties of drawables loaded from resources. By default, all drawables instances loaded from the same resource share a common state; if you modify the state of one instance, all the other instances will receive the same modification.Calling this method on a mutable Drawable will have no effect.

上述解释的很清楚,一个drawable如果使用了mutate()方法,那么对这个drawable属性(包括设置drawable的透明度)修改将不会共享。

mImageView.setBackgroundDrawable(mDrawable);
mImageView.getBackground().setAlpha(100);

上述代码有问题吗?

“肯定没有额,通过这种方式透明度没有问题额,亲试可用”。如果你所使用的mDrawable是图片资源(ColorDrawable 中使用了mutate方法),而且多处使用,你就会发现,其他地方透明度也变了。

上述代码正确写法:

mImageView.setBackgroundDrawable(mDrawable.mutate());
mImageView.getBackground().setAlpha(100);
  • 总结

通过上面的分析可知,设置ImageView的透明度,坑还是相当多的,目前来看使用View提供的setAlpha(float alpha)更好。

正确设置ImageView的前景(foreground)

有时候设计需要在ImageView 上面覆盖一层(如灰色),面对这样的需求时,要区分是静态的ImageView还是异步的ImageView (使用后台回包数据)。

  1. 静态ImageView (此场景基本很少,设计切图即可)

合理使用src (前景)和background(背景)就可以实现

  1. 异步ImageView

此就需要使用ImageView的前景(View 提供了一个setForeground(Drawable foreground))

这里写图片描述

这里写图片描述

根据上述源码可知,如果ImageView要使用setForeground()方法,必须保证targetSdkVersion>=23。

如果此时要在targetSdkVersion<23情况使用,就必须自己去实现,好在afc框架中ExtendImageView已经考虑到这种情况,已经实现了setForeFround()方法。

正确使用ImageView的“android:adjustViewBounds”

adjustViewBounds的介绍如下:

Set this to true if you want the ImageView to adjust its bounds to preserve the aspect ratio of its drawable.

Note:If the application targets API level 17 or lower, adjustViewBounds will allow the drawable to shrink the view bounds, but not grow to fill available measured space in all cases.This is for compatibility with legacy MeasureSpec and RelativeLayout behavior.

设置View的最大高度,单独使用无效,需要与setAdjustViewBounds一起使用;如果想设置图片固定大小,又想保持图片宽高比,需要如下设置:

  1. 设置setAdjustViewBounds为true;

  2. 设置maxWidth、MaxHeight;

  3. 设置设置layout_width和layout_height为wrap_content

正确使用ImageView的“android:scaleType”

如前所说,ImageView的“android:scaleType”属性是对src才有效的,如下图所示,需要对下面原图进行缩放控制,效果如下:

(1)原图

列表内容

(2)使用ScaleType.CENTER_CORP

这里写图片描述

设计大大觉得不合理,要是图片整体能下来一点点就好了,查看一遍ScaleType,能到达这样效果的只有FIT_XY,那就试试看

(3)使用ScaleType.FIT_XY

这里写图片描述

图片确实下移了,但是图却明显的被拉长了

(4)使用ScaleDrawable.CROP_START

这里写图片描述

ScaleDrawable类是afc框架中提供了一个专门处理Drawable scale的类,在ImageView的ScaleType的基础上额外提供了11中裁剪方式:

  1. CROP_CENTER
  2. CROP_START
  3. CROP_END
  4. FIT_CENTER
  5. FIT_START
  6. FIT_END
  7. MATCH_WIDTH_TOP
  8. MATCH_WIDTH_BOTTOM
  9. MATCH_WIDTH_CENTER
  10. CENTER
  11. CROP_BY_PIVOT


(5)XML设置android:scaleType=”fitXY”属性

这里写图片描述

xml中设置scaleType属性

这里写图片描述

java代码中设置ScaleDrawable.CROP_START属性

看到上述代码,有人可能觉得很疑惑,既然在java代码中设置了ScaleDrawable.CROP_START属性,为什么XML中还要设置“android:scaleType=”fitXY”,能否不设置或者设置其他属性。

答案是否定的,如果要保证ScaleDrawable.CROP_START属性设置成功,在xml中一定要设置“android:scaleType=”fitXY”,原因如下:

  • 通过ScaleDrawable设置scaleType

这里写图片描述

  • 在updateDrawMatrix()中更新目的宽高 (dstWidth和dstHeight)

这里写图片描述

可以看到,如果要ScaleDrawable.CROP_START属性设置起作用,那个getBounds()方法获取一定要准确。

  • 通过查看ImageView中的configBounds()方法可知,在dwith和dheight(原图Drawable的宽高)都不为0的情况下,如果要使用vwidth和vheight,则ImageView的ScaleType必须设置为ScaleType.FIT_XY

这里写图片描述

最后

本人能力有限,分析可能不到位或错误的地方,如果发现,请告知谢谢!

群晖NAS实战:Python项目部署全流程解析 本文详细解析了在群晖NAS上部署Python项目的完整流程。从开启SSH、选择连接工具,到通过套件中心一键安装Python3、配置pip及国内镜像源,再到上传项目、安装依赖、后台运行及排错,提供了清晰的避坑指南。旨在帮助用户将群晖NAS从存储设备转变为可执行自定义任务的智能服务器,实现自动化脚本、数据监控等应用。 阅读详情

相关推荐

从原理图到PCB:Cadence Allegro 17.4网表同步全流程详解(含第三方网表配置)

本文详细解析了Cadence Allegro 17.4中从Orcad原理图到PCB布局的网表同步全流程。核心内容包括标准的第一方网表同步步骤,以及针对第三方网表导入时关键的封装库路径配置方法,并提供了常见同步错误的排查思路,帮助工程师高效、准确地完成设计数据传递,确保PCB设计顺利开局。

salt9的博客 655

【腾讯Bugly干货分享】Android ImageView 正确使用姿势

本文主要介绍了ImageView的相关重要方法,从源码角度剖析了一些容易令人混淆或百思不得其解的问题。

腾讯Bugly的专栏 2364

手把手教你用ZEMAX复现贝塞尔光束:从Thorlabs锥透镜到Edmund透镜的完整光路搭建

本文详细介绍了如何在ZEMAX光学设计软件中复现贝塞尔光束,从Thorlabs锥透镜到Edmund透镜的完整光路搭建过程。通过逐步指导,帮助研究人员和工程师掌握光学设计技巧,实现无衍射特性的贝塞尔光束生成,适用于激光加工和生物成像等领域。

weixin_33737774的博客 182

android imageview设置src

tv_play.setImageDrawable(getResources().getDrawable(R.mipmap.bof));

简公子的博客 4326

K210视觉项目上位机避坑指南:解决C#解析ESP8266 TCP图像流的乱码、卡顿与连接中断

本文详细解析了K210与ESP8266在视觉项目中的上位机开发问题,重点解决TCP图像流解析中的乱码、卡顿与连接中断问题。通过自定义协议、JPEG流重组、TCP连接优化等实战技巧,提升系统稳定性和性能,适用于嵌入式视觉开发者和C#上位机程序员。

weixin_28730131的博客 402

【OCCT】第3讲 OpenCasCade&VTK实现三维建模Demo

本文分享OpenCasCade&VTK共同实现三维建模Demo,希望对各位小伙伴有所帮助!1. 新建Visual Studio工程新建空项目添加main.cpp添加main函数2. 配置OpenCasCade & VTK 库配置包含路径:配置库文件:添加链接库:添加运行环境:注意:VTK库的版本要与编译OpenCasCade库时选择的版本一致,否则会出错!

qq_40041064的博客 781

源码分析Android 中ImageView的设置src与background绘制流程

众所周知ImageView可以通过src和Background两种方式设置显示资源。和大家一起通过源码来了解两种属性的绘制流程有何不同。 热身案例 先上两段小代码: ImageView android:layout_width="200dp" android:layout_height="300dp" android:backgroun

付之一笑的专栏 3940

Cursor锁机了怎么办?实测这个开源插件帮你无限“续杯”,附详细安装与防踩坑指南

本文提供了Cursor锁机问题的详细解决方案,包括使用开源插件`cursor-fake-machine`修改机器标识、锁定配置文件权限以及优化使用规范。同时介绍了如何利用Cursor开发油猴脚本将微信公众号文章高效转换为Markdown格式,提升内容创作效率。

weixin_26805597的博客 768

【Android】Drawable 和src 的区别和理解

使用 background 属性时,可以使用 android:backgroundTint 属性来给背景图像应用一个颜色过滤器,实现背景图像的着色效果。它可以接受一个图像资源的引用,可以是一个图片文件、矢量图形或者是一个网络图片的 URL。在 Android 中,ImageView 的 src 属性和 background 属性用于设置不同类型的图像内容。使用 src 属性时,可以使用 android:tint 属性来给图像应用一个颜色过滤器,实现图像的着色效果。

weixin_44002043的博客 665

树莓派5安装ROS2小白指南避坑攻略

手把手教你如何在树莓派5上顺利安装ROS2,避开常见问题与陷阱,提升配置效率。针对树莓派5安装ros2过程中的依赖冲突、源配置错误等高频难题提供解决方案,适合新手快速上手。

weixin_35754962的博客 1005

实验5 振幅调制(集成乘法器幅度调制电路)

目录5-1 振荡调制的基本工作原理一.振幅调制和调幅波1.普通调幅波(AM)(1)调幅波的表达式、波形(2)调幅波的频谱2.抑制载波双边带调幅(DSB)3.抑制载波单边带调幅(SSB)二.普通调幅波的产生电路三.抑制载波调幅的产生电路5-2 振幅调制实验电路 5-1 振荡调制的基本工作原理 根据电磁波理论知道,只有频率较高的振荡才能被天线有效地辐射。但是人的讲话声音变换为相应电信号的频率较低,不适于直接从天线上辐射。因此,为了传递信息,就必须将要传递的信息“记载”到高频振荡上去。这一“记载”过程称为调

胡毛毛的博客 3万+

完美解决ImageView src/background 动态设置对应关系

有些时候我们如下资源中设置了图标背景 但是我们希望在图片按下后,变成两外一张背景图标,我们就需要对控件ImageView进行动态设置背景图片,但是有时候我们调用了ImageView的方法setBackground后,并没有达到我们的预期,而是多出来了一个背景覆盖上去了,那么我们究竟应该调用什么方法呢?

hnjzfwy的博客 1913

华为OD机试 - 魔法收积木 - 二进制(Java 新系统 200分)

华为OD机试 新系统 题库疯狂收录中,刷题。

学Java,找哪吒 443

android imageview方法,Android ImageView 正确使用姿势

一、正确合理使用ImageView 的src 和backgroundsrc :为ImageView 原图内容,存放原图大小,不会被拉伸;background:为Imageview的背景,会根据ImageView给定的长宽进行拉伸;在ImageView中,可以同时设置src和background属性(为了减少绘制,可以根据使用场景来设置相应属性); 由于src中存放的是原图大小,如果需要对其缩放,就...

weixin_39572168的博客 603

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

android imageview浮动,Android ImageView 正确使用姿势

一、正确合理使用ImageView 的src 和backgroundsrc :为ImageView 原图内容,存放原图大小,不会被拉伸;background:为Imageview的背景,会根据ImageView给定的长宽进行拉伸;在ImageView中,可以同时设置src和background属性(为了减少绘制,可以根据使用场景来设置相应属性); 由于src中存放的是原图大小,如果需要对其缩放,就...

weixin_30189559的博客 522

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Android选中添加边框,ImageView添加边框的正确姿势

前言在开发Android TV应用的时候,往往需要对于焦点进行着重显示,让用户知道当前选中的东西是啥,一般来说就是放大选中的控件并且添加一个发光的边框即可,今天遇到了一个ImageView添加边框的问题,下面就介绍下踩坑之旅。使用shape以及.9图对于ImageView来说,有两个地方可以设置“内容”,一个是android:background另一个是android:src,分别对应着设置Ima...

weixin_39520353的博客 2187

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

[转]Android ImageView 正确使用姿势

原文地址:http://geek.youkuaiyun.com/news/detail/125375导语本文主要介绍了 ImageView 的相关重要方法,从源码角度剖析了一些容易令人混淆或百思不得其解的问题。**一、正确合理使用ImageView的src和background**src :为 ImageView 原图内容,存放原图大小,不会被拉伸; background:为 Imageview 的背景,会根据

u011116615的博客 274

PullToRefreshListView addHeadView的正确姿势

PullToRefreshListView addHeadView正确姿势 一.比如加一个imageView到顶部 refreshListView = (PullToRefreshListView) layout.findViewById(R.id.refresh_listview); ListView mListView = refreshListView.getRefresh

Java# 3821

Android Glide使用姿势与原理分析

Android Glide是一款强大的图片加载库,提供了丰富的功能和灵活的使用方式。本文将深入分析Glide的工作原理,并介绍一些使用姿势,助你更好地运用这个优秀的库。

Android23333的博客 1555
上一篇: Kotlin-枚举
下一篇: Kotlin-函数
行云间
博客等级 码龄12年 438粉丝 173原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值