ImageView的scaleType设置不当,导致使用Glide时出现OOM

本文通过实例演示如何解决使用Glide加载大图片时遇到的内存溢出问题,介绍了正确配置ImageView的scaleType以提高性能的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转载地址:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0606/3002.html

来源 http://www.licheetec.com/2015/05/16/imageview-scale-type/

之前看到一篇介绍图片加载库——Glide的文章。

http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0327/2650.html

看到连Google官方也在用。自动缓存,自动图片压缩,支持加载网络图片、加载Gif等等,支持集成Volley和okHttp,总之好处多多。

于是找到 Glide 在Github上面的项目主页,按照说明写了个简单的Demo。

glide

简单描述一下Demo吧,就是在tomcat上面弄一个webapp,里面就放了70来张非常大的jpg图片(某个エロゲーム 的CG,因为内容比较和谐,我就不细说了,总之每张图都有2560*1400分辨率,sample,刚好用来测试性能),还有包含着这些图片地址的json文件。

然后就是写个ListView,加载这些图片了。什么convertView复用,ViewHolder也弄好了。

运行,图片顺利加载,慢慢拖动,貌似也没问题,但是一快速滑动(也就是fling),就变得非常卡,Logcat出现 OutOfMemoryError。

OOM

检查了下程序逻辑,没啥问题,Glide的介绍提到了会按照ImageView大小了缩放和缓存图像,不至于这样啊。

百思不得其解,就去Glide项目页那里,用蹩脚的英文发了个issue,然后@TWiStErRob大神也很用心地回答了。

https://github.com/bumptech/glide/issues/464

Glad it helped. Feel free to ask further questions if you’re stuck.

For posterity: fitXY forces Glide to read at full resolution and then let the ImageView handle the distortion (fitXY doesn’t keep aspect ratio). If you want to keep distorting the images, you can keep fitXY on the imageView and call centerCrop() or fitCenter() before load(): this will make Glide downsample the image (less memory) before handing it to ImageView for distortion.

Here’s a further tip I just noticed: you could also change android:src to tools:src. That way you will save some layout passes (ImageView does a layout on every setImage*() call) and you can skip loading a bitmap (launcher icon when inflating each item) unnecessarily (you’ll overwrite it anyway with Glide). The tools attributes are not compiled into the apk, so it’s optimal to use them in these situations.

原来是ImageView的scaleType的问题,当设置为fitXY时,虽然ImageView显示那么点尺寸,但是,但是Glide加载图片时,却是以全分辨率加载的,于是加载几张,就OOM了。
改成fitCenter或者centerCrop(试了一下fitStartfitEnd也行,总之看需求了),就好了,会自动缓存小图,滚动起来也非常流畅。

完全没想到原来坑在scaleType上面,这下记住了。

最后感谢@TWiStErRob大神的耐心回答,Github已follow。

<think>我们正在处理用户的问题:如何在Android中通过点击图片启动全屏Activity,并在其中使用ImageView显示图片。根据用户提供的引用和之前的问题,我们可以总结出以下步骤:1.在主Activity中,为ImageView设置点击事件监听器。2.在点击事件中,创建一个Intent,跳转到全屏显示图片的Activity(例如FullScreenImageActivity)。3.通过Intent传递图片资源(例如资源ID、URL或Bitmap等)。4.在全屏Activity中,设置全屏模式(隐藏状态栏和导航栏)。5.使用ImageView来显示传递过来的图片。下面我们将详细说明每一步的实现方法,并提供代码示例。步骤1:主Activity中设置ImageView的点击事件引用[1]中给出了主Activity的示例代码,我们在此基础上进行说明。步骤2:创建全屏显示的Activity引用[4]提到了需要修改Activity的Theme来实现全屏,同注意父类使用android.app.Activity(但实际上我们通常继承AppCompatActivity,所以需要正确设置主题)。步骤3:全屏Activity中接收图片资源并显示具体实现:1.主Activity代码(MainActivity.java):-设置ImageView的点击事件,在点击启动FullScreenImageActivity,并传递图片资源(这里以资源ID为例,也可以传递其他类型,如URL等)。2.全屏Activity(FullScreenImageActivity.java):-在onCreate中设置全屏模式(可以通过代码设置,也可以通过主题设置)。-获取传递过来的图片资源ID。-使用ImageView加载图片,并设置ImageView的属性(如缩放类型等)。3.修改全屏Activity的主题(在styles.xml中定义全屏主题)。注意:引用[4]提到,修改主题后如果使用AppCompatActivity,则不会报错,因为AppCompatActivity是兼容的。代码示例:首先,在MainActivity中:</think>### Android 点击图片启动全屏Activity的实现方法 以下是实现点击图片启动全屏Activity的完整步骤和代码示例: #### 1. **主Activity实现** 在点击事件中传递图片资源并启动全屏Activity: ```java // MainActivity.java public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ImageView imageView = findViewById(R.id.image_view); imageView.setOnClickListener(v -> { // 创建跳转Intent Intent intent = new Intent(MainActivity.this, FullScreenActivity.class); // 传递图片资源ID intent.putExtra("imageResId", R.drawable.sample_image); startActivity(intent); // 添加过渡动画 ActivityOptions options = ActivityOptions .makeCustomAnimation(this, R.anim.fade_in, R.anim.fade_out); startActivity(intent, options.toBundle()); }); } } ``` #### 2. **全屏Activity实现** ```java // FullScreenActivity.java public class FullScreenActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 设置全屏模式 requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); setContentView(R.layout.activity_fullscreen); // 获取传递的图片资源 int imageResId = getIntent().getIntExtra("imageResId", 0); ImageView fullScreenIv = findViewById(R.id.fullscreen_image); fullScreenIv.setImageResource(imageResId); // 点击退出 fullScreenIv.setOnClickListener(v -> finish()); } } ``` #### 3. **布局文件** `activity_fullscreen.xml`: ```xml <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@android:color/black"> <ImageView android:id="@+id/fullscreen_image" android:layout_width="match_parent" android:layout_height="match_parent" android:scaleType="fitCenter" /> </FrameLayout> ``` #### 4. **添加过渡动画** 在`res/anim/`目录下创建: ```xml <!-- fade_in.xml --> <alpha xmlns:android="http://schemas.android.com/apk/res/android" android:duration="300" android:fromAlpha="0.0" android:toAlpha="1.0" /> <!-- fade_out.xml --> <alpha xmlns:android="http://schemas.android.com/apk/res/android" android:duration="300" android:fromAlpha="1.0" android:toAlpha="0.0" /> ``` #### 5. **AndroidManifest配置** ```xml <activity android:name=".FullScreenActivity" android:theme="@style/FullScreenTheme" /> ``` 在`styles.xml`中定义主题: ```xml <style name="FullScreenTheme" parent="Theme.AppCompat.Light.NoActionBar"> <item name="android:windowFullscreen">true</item> <item name="android:windowContentOverlay">@null</item> </style> ``` ### 关键点说明: 1. **资源传递**:通过Intent传递图片资源ID(或URL)[^1] 2. **全屏设置**: - 代码方式:`getWindow().setFlags()` - 主题方式:`android:windowFullscreen`属性[^4] 3. **过渡动画**:使用`ActivityOptions`实现平滑切换效果[^3] 4. **退出机制**:点击全屏图片执行`finish()`返回 ### 优化建议: - 对于大图使用`Glide`或`Picasso`加载防止OOM - 添加手势支持(如双指缩放) - 使用共享元素动画增强体验(API 21+) > 此方案适合基础需求,如需高级功能(缩放/手势)建议使用[PhotoView库](https://github.com/chrisbanes/PhotoView)
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值