三三要成为安卓糕手
<ImageView
android:layout_width="100dp"
android:layout_height="150dp"
android:alpha="0.5"
android:scaleType="centerInside"
android:src="@drawable/bg_bitmap" />
如果我们仅设置src,可以看到我们的图片与控件的尺寸并不完美匹配,这里我们就得优化一下了
参数0~1,值越小越透明
scaleType 本意翻译:缩放类型
控制图片的缩放模式,适应ImageView的边界
参数特性:
scaleType 值 | 使用 | 缩放规则 | 是否保持原图比例 | 是否裁剪图片 | 是否可能留白 | 核心特点 |
---|---|---|---|---|---|---|
fitXY | √ | 强制拉伸图片宽高,使其完全匹配 ImageView 尺寸 | ❌ 不保持 | ❌ 不裁剪 | ❌ 无留白 | 填满容器但可能导致图片拉伸变形(如宽高比失调) |
centerInside | √ | 按原图比例缩放,确保图片宽高均不超过 ImageView 尺寸,缩放后居中显示 | ✅ 保持 | ❌ 不裁剪 | ✅ 可能留白 | 完整显示图片,无变形,但容器与图片宽高比不同时会留空白 |
centerCrop | √ | 按原图比例缩放,使图片宽高至少填满 ImageView 尺寸,超出部分裁剪后居中显示 | ✅ 保持 | ✅ 裁剪 | ❌ 无留白 | 填满容器且不变形,但可能裁剪图片边缘(优先保证中间内容可见) |
center | √ | 不缩放图片,直接将原图居中放置在 ImageView 中 | ✅ 保持(不缩放) | ❌ 不裁剪 | ✅ 可能留白 | 图片尺寸小于容器时居中显示(留空白),大于容器时仅显示中间部分(等效于不缩放裁剪) |
fitStart | 按原图比例缩放至完全适配容器(宽或高其一匹配),缩放后靠左上角对齐 | ✅ 保持 | ❌ 不裁剪 | ✅ 可能留白 | 完整显示且不变形,图片位置靠容器起始端(左上角) | |
fitEnd | 按原图比例缩放至完全适配容器,缩放后靠右下角对齐 | ✅ 保持 | ❌ 不裁剪 | ✅ 可能留白 | 完整显示且不变形,图片位置靠容器末端(右下角) | |
fitCenter | 按原图比例缩放至完全适配容器,缩放后居中对齐(默认值) | ✅ 保持 | ❌ 不裁剪 | ✅ 可能留白 | 完整显示、不变形且居中,是 centerInside 的 “适配容器优先” 版本(可能放大图片) |
传入参数@drawable/图片名字
我们一般把图片放到res源文件的drawable文件夹下;
命名规则:必须由小写字母、数字和下划线构成;不能以数字开头,不能有空格和特殊字符,不能有关键字,长度不允许超过255个字符,不要有中文
public class ImageViewActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_image_view);
/**
* 三种获取图片的方式
* 1:图片转drawable,再使用setImageDrawable()
* 2:直接使用setImageResource(),传参源图片即可
* 3:获取手机中图片的路径,转化为uri对象,在使用setImageURI()
*/
ImageView ivTest = findViewById(R.id.iv_test);
Drawable drawable = ContextCompat.getDrawable(ImageViewActivity.this, R.drawable.icon_face);
ivTest.setImageDrawable(drawable);
ivTest.setImageResource(R.drawable.icon_face);
String path = "/data/data/com.xlong.myapplication/files/icon_face.png";
Uri uri = Uri.fromFile(new File(path));
ivTest.setImageURI(uri);
}
}
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/iv_test"/>
ImageView ivTest = findViewById(R.id.iv_test);
Drawable drawable = ContextCompat.getDrawable(ImageViewActivity.this, R.drawable.icon_face);
ivTest.setImageDrawable(drawable);
解释一下
①获取xml下ImageView对象
②上下文工具类把图片转化为Drawable对象
③把Drawable对象设置给ImageVIew
上下文工具类中的静态方法,获取drawable
源码这部分咱们也看不懂啊xd,这里右边的图片调用了getDrawable()方法,能看懂一点
ImageView ivTest = findViewById(R.id.iv_test);
ivTest.setImageResource(R.drawable.icon_face);//拿到资源id对应的图片,在进行设置
这两句代码也很直观,直接获取res下的图片(res下的文件资源在系统加载的时候,会被转化为Drawable对象,可以这么简单的理解)
ImageView ivTest = findViewById(R.id.iv_test);
String path = "/data/data/com.xlong.myapplication/files/icon_face.png";
Uri uri = Uri.fromFile(new File(path));
ivTest.setImageURI(uri);
在安卓当中去查看手机的文件可以在Device Explorer去查看,这里我们icon_face.png图片放了进去,复制了它的路径作为path
了解即可窝里哇
图片的一种:简单记
优点:不会被压缩,细节更丰富,图片更为清晰(其实本质上就是没有被压缩,所以放大后的细节更好)
缺点:占用磁盘空间及运行内存较大(你想嘛,一个像素点就占用1~24个bit,896*1341就问你大不大吧)
加载到手机中,占用的是内存,想想一下子加载个千二八张的,手机直接起飞xd~~
ImageView ivTest = findViewById(R.id.iv_test);
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.bg_bitmap);
ivTest.setImageBitmap(bitmap);
BitmapFactory.decodeResource
是 Android 开发中用于从资源中解码出 Bitmap
对象的一个静态方法
decode(解码)
BitmapFactory中有两种加载位图的方法
第一种方式:Resource:传入Resource资源和相应的图片id,系统就能识别到图片并解码成对应的位图
第二种方式:文件,传入图片的路径
getResources
方法的作用通过 getResources()
获取到的 Resources
对象,可用于加载和访问各种资源,在
特性 | Drawable | Bitmap |
---|---|---|
内存占用 | 轻量级,仅存储绘制指令(如颜色、形状参数),不直接保存完整像素数据。 | 重量级,直接存储所有像素信息,占用内存高(尤其大图或高分辨率图像)。 |
缩放与适配 | 支持矢量图形(如 VectorDrawable),可无损缩放,完美适配不同屏幕密度。 | 缩放时易出现模糊(需手动处理多分辨率资源或使用 BitmapFactory 调整采样率)。 |
状态管理 | 内置状态切换支持(如 StateListDrawable),自动响应视图状态变化(按下、选中、禁用等)。 | 需手动编写代码处理不同状态下的图像切换。 |
动态修改 | 可在运行时修改属性(颜色、透明度、形状等),无需重建对象。 | 修改像素需重新创建 Bitmap 或使用 Canvas 绘制,操作复杂。 |
渲染方式 | 按需渲染(在绘制时生成像素),适合简单图形和频繁更新的场景。 | 预加载所有像素,适合静态图像或需要直接操作像素的场景(如图像处理)。 |
实现形式 | 多种类型:ColorDrawable、ShapeDrawable、VectorDrawable、NinePatchDrawable 等。 | 单一类型,直接表示位图数据。 |
性能开销 | 渲染简单图形时效率高,GPU 压力小。 | 渲染大型 Bitmap 时可能导致内存抖动或性能下降。 |
典型应用场景 | 图标、背景、状态按钮、动画效果、矢量图形。 | 相机拍照、图像处理、游戏贴图、复杂图像。 |
上面的表格,看着就头大。
一句话,Drawable
在大多数 UI 场景中直接秒了,Bitmap
在需要直接操作像素的场景中可以Barking一下。
这是一张png的图片,能看到图片中有非常明显的锯齿状纹路,这就是我们要解决的问题
vector asset [ˈvektə®] [ˈæset]
矢量资源 是一种图形
优势:在不影响图片质量的情况下可伸缩,体积小(减小了安装包的体积)
劣势:安卓5.0以上才支持,兼容性不够;相对于位图,图形细节效果不好(如模糊和阴影)
一般图片资源都放置在drawable文件夹下
两种创建方式;本地会提供一些资源图标供使用
传入SVG和PSD类型的图片生成矢量图
实际上就是,在xml文件中定义的一组点线条和曲线及其关联的颜色信息
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="32dp"
android:height="32dp"
android:viewportWidth="1024"
android:viewportHeight="1024">
<path
android:pathData="M291.3,396.3c0,29.7 24.1,53.8 53.8,53.8s53.8,-24.1 53.8,-53.8 -24.1,-53.8 -53.8,-53.8 -53.8,24.1 -53.8,53.8zM613.9,396.3c0,29.7 24.1,53.8 53.8,53.8s53.8,-24.1 53.8,-53.8 -24.1,-53.8 -53.8,-53.8 -53.8,24.1 -53.8,53.8zM506.4,772.6c-110.1,0 -206.8,-74.2 -234.5,-181.2 -3.6,-14.8 5.1,-29.7 20,-33.8 14.8,-3.6 29.7,5.1 33.8,20 25.6,100.9 128.5,161.3 228.9,135.7 66.6,-16.9 118.3,-69.1 135.7,-135.7 3.6,-14.8 18.9,-24.1 33.8,-20 14.8,3.6 24.1,18.9 20,33.8 -28.2,108 -126,182.8 -237.6,181.2zM918.5,343c-22.5,-53.2 -54.8,-100.9 -95.7,-141.8S734.2,128 681,105.5c-54.8,-23.6 -113.2,-34.8 -173.6,-34.8s-118.8,11.8 -173.6,34.8C280.6,128 233,160.3 192,201.2S119.8,290.3 97.3,343c-23.6,54.8 -34.8,113.2 -34.8,173.6s11.8,118.8 34.8,173.6c22.5,53.2 54.8,100.9 95.7,141.8s88.6,73.2 141.8,95.7c54.8,23.6 113.2,34.8 173.6,34.8s118.8,-11.8 173.6,-34.8c53.2,-22.5 100.9,-54.8 141.8,-95.7s73.2,-88.6 95.7,-141.8c23.6,-54.8 34.8,-113.2 34.8,-173.6 -1,-59.9 -12.8,-118.3 -35.8,-173.6zM777.7,786.9c-72.2,72.2 -167.9,111.6 -269.8,111.6s-198.1,-39.9 -269.8,-111.6c-72.2,-72.2 -111.6,-167.9 -111.6,-269.8s39.9,-198.1 111.6,-269.8 167.9,-111.6 269.8,-111.6 198.1,39.9 269.8,111.6 111.6,167.9 111.6,269.8 -39.4,197.6 -111.6,269.8z"
android:fillColor="#bfbfbf"/>
</vector>