加载大图片防止OOM异常
在加载图片时,不管是网络上下载的还是自定义的一个图片动辄就是好几M,这时候手机运行一方面会造成卡顿,另一方面手机性能较差的话会造成软件运行OOM异常,为了更好的用户体验,需要将图片进行原比例缩放,不失真的同时显示想要设定的图片样式,好了,不妨多说,,如下是代码
package com.oblivion.loadbigimage;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
public class MainActivity extends AppCompatActivity {
//声明全局变量,配置文件中ImageView
private ImageView iv_loadbigimage;
//声明全局变量,配置文件中ImageView
private Button bt_loadbigimage;
private Handler handler = new Handler();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
iv_loadbigimage = (ImageView) findViewById(R.id.iv_loagbigimage);
bt_loadbigimage = (Button) findViewById(R.id.bt_loadbigimage);
bt_loadbigimage.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.i(TAG, "点击加载");
new Thread() {
@Override
public void run() {
//获取 选择项Options
BitmapFactory.Options options = new BitmapFactory.Options();
//仅获取所选择图片的边框
options.inJustDecodeBounds = true;
//作为参数传入到要加载的图片中
BitmapFactory.decodeFile(Environment.getExternalStorageDirectory() + "/IMG_0248.JPG", options);
//设置适配值
options.inSampleSize = getSize(options);
//将仅选择边框设定为false
options.inJustDecodeBounds = false;
//定义显示的图片
final Bitmap newBiemap = BitmapFactory.decodeFile(Environment.getExternalStorageDirectory() + "/IMG_0248.JPG", options);
handler.post(new Runnable() {
@Override
public void run() {
//子线程更新UI
iv_loadbigimage.setImageBitmap(newBiemap);
}
});
}
}.start();
}
});
}
/**
* 获取放置OOM溢出的边框适配值
*
* @param options 选择项
* @return 需要设定的缩放值
*/
public int getSize(BitmapFactory.Options options) {
//通过WindowManager 获取界面的宽高
WindowManager mwm = (WindowManager) getSystemService(WINDOW_SERVICE);
int wmHeight = mwm.getDefaultDisplay().getHeight();
int wmWidth = mwm.getDefaultDisplay().getWidth();
//要加载的图片的宽高
int relHeight = options.outHeight;
int relWidth = options.outWidth;
//比较两者的宽高比,返回较大值
return (relHeight / wmHeight) > (relWidth / wmWidth) ? (relHeight / wmHeight) : (relWidth / wmWidth);
}
}
UI界面
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.oblivion.loadbigimage.MainActivity">
<Button
android:id="@+id/bt_loadbigimage"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/loadBigImage" />
<ImageView
android:layout_below="@+id/bt_loadbigimage"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/iv_loagbigimage"/>
</RelativeLayout>