Android ImageView 使用详解

文章目录

ImageView 是 Android 中用于显示图片的核心控件,下面我将从基本使用到高级功能全面介绍 ImageView 的用法。

一、基本使用

1. XML 中声明 ImageView

xml 复制代码
<ImageView
    android:id="@+id/imageView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/my_image"  <!-- 设置图片资源 -->
    android:scaleType="centerCrop"    <!-- 设置缩放类型 -->
    android:adjustViewBounds="true"   <!-- 保持图片宽高比 -->
    android:contentDescription="@string/image_desc" /> <!-- 无障碍描述 -->

2. Java/Kotlin 中设置图片

java 复制代码
ImageView imageView = findViewById(R.id.imageView);

// 设置图片资源
imageView.setImageResource(R.drawable.my_image);

// 设置Bitmap
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.my_image);
imageView.setImageBitmap(bitmap);

// 设置Drawable
Drawable drawable = ContextCompat.getDrawable(this, R.drawable.my_image);
imageView.setImageDrawable(drawable);

二、图片缩放类型 (scaleType)

ImageView 提供了多种缩放方式:

scaleType 值 描述
center 不缩放,居中显示
centerCrop 等比例缩放,填充整个View,可能裁剪
centerInside 等比例缩放,完整显示在View内
fitCenter (默认) 等比例缩放,居中显示
fitStart 等比例缩放,顶部/左边对齐
fitEnd 等比例缩放,底部/右边对齐
fitXY 不等比缩放填满整个View
matrix 使用矩阵变换
java 复制代码
// 代码设置缩放类型
imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);

三、加载网络图片

1. 使用 Glide (推荐)

添加依赖:

gradle 复制代码
implementation 'com.github.bumptech.glide:glide:4.12.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.12.0'

使用示例:

java 复制代码
Glide.with(this)
    .load("https://example.com/image.jpg")
    .placeholder(R.drawable.placeholder)  // 加载中显示
    .error(R.drawable.error)             // 加载失败显示
    .centerCrop()                       // 缩放方式
    .into(imageView);

2. 使用 Picasso

gradle 复制代码
implementation 'com.squareup.picasso:picasso:2.8'
java 复制代码
Picasso.get()
    .load("https://example.com/image.jpg")
    .placeholder(R.drawable.placeholder)
    .error(R.drawable.error)
    .resize(300, 300)  // 调整大小
    .centerCrop()
    .into(imageView);

四、高级功能

1. 圆形图片

使用 Glide 实现圆形图片:

java 复制代码
Glide.with(this)
    .load(imageUrl)
    .apply(RequestOptions.circleCropTransform())
    .into(imageView);

2. 圆角图片

自定义圆角转换器:

java 复制代码
public class RoundedCornersTransformation extends BitmapTransformation {
    private final int radius;
    
    public RoundedCornersTransformation(int radius) {
        this.radius = radius;
    }
    
    // 实现转换逻辑...
}

// 使用
Glide.with(this)
    .load(imageUrl)
    .transform(new RoundedCornersTransformation(20))
    .into(imageView);

3. 图片点击缩放动画

java 复制代码
imageView.setOnClickListener(v -> {
    if (imageView.getScaleType() == ImageView.ScaleType.CENTER_CROP) {
        imageView.animate().scaleX(1.5f).scaleY(1.5f).setDuration(300).start();
    } else {
        imageView.animate().scaleX(1f).scaleY(1f).setDuration(300).start();
    }
});

五、性能优化

  1. 图片压缩

    java 复制代码
    BitmapFactory.Options options = new BitmapFactory.Options();
    options.inSampleSize = 2; // 缩小为1/2
    Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.large_image, options);
    imageView.setImageBitmap(bitmap);
  2. 内存回收

    java 复制代码
    @Override
    protected void onDestroy() {
        super.onDestroy();
        // 清除图片引用
        imageView.setImageDrawable(null);
    }
  3. 使用合适的图片格式

    • PNG:适合有透明度需求的图片
    • JPEG:适合照片类图片
    • WebP:更高效的现代格式

六、常见问题解决

  1. OOM(内存溢出)问题

    • 使用图片加载库(Glide/Picasso)
    • 加载适当尺寸的图片
    • 在滚动列表中使用暂停加载功能
  2. 图片变形问题

    • 确保设置正确的scaleType
    • 使用adjustViewBounds="true"
    • 保持图片原始宽高比
  3. 图片模糊问题

    • 提供足够高分辨率的图片
    • 避免过度缩放
    • 使用矢量图(SVG/VectorDrawable)替代位图

通过以上方法,可以充分利用ImageView展示各种图片,并确保良好的性能和用户体验。

相关推荐
杨杨杨大侠21 小时前
手把手教你写 httpclient 框架(八)- 实战案例集锦
java·http·github
肖老师xy21 小时前
uniapp 苹果端bug合集
java·服务器·uni-app
zlpzlpzyd21 小时前
idea 2025.2 在Windows 11中执行maven命令中文乱码处理
java·maven·intellij-idea
2501_9151063221 小时前
上架 App 全流程解析,iOS 应用上架步骤、App Store 审核流程、ipa 文件上传与测试分发经验
android·ios·小程序·https·uni-app·iphone·webview
刘一说21 小时前
IntelliJ IDEA 查找和替换使用指南
java·ide·intellij-idea
白露与泡影1 天前
2025年高质量Java面试真题汇总
java·python·面试
꒰ঌ 安卓开发໒꒱1 天前
Java 面试 -Java基础
java·开发语言·面试
菠菠萝宝1 天前
【Java八股文】13-中间件面试篇
java·docker·kafka·rabbitmq·canal·rocketmq·es
瓯雅爱分享1 天前
基于Java后端与Vue前端的MES生产管理系统,涵盖生产调度、资源管控及数据分析,提供全流程可视化支持,包含完整可运行源码,助力企业提升生产效率与管理水平
java·mysql·vue·软件工程·源代码管理
补补234561 天前
解决漫步者H180Plus(TypeC)耳机连接三星手机后每次播放音频出现滴滴声
android·音视频·三星·typec·edifier·h180plus·滴滴声