手机客户端加载图片99%不会直接加载,而是需要放缩。比较宽和高的缩放比例,哪个大会用哪个进行缩放。
Example : 比如加载手机根目录的一张图片
首先获取权限
permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
使用RxJava动态获取权限时,首先需要在module gradle文件下面引入下面两个组件:
implementation 'io.reactivex:rxjava:1.1.6' //引入RxJava
implementation 'com.tbruyelle.rxpermissions:rxpermissions:0.7.0@aar' //RxPermission
布局文件只有一个imageView组件,因此省略,Java代码如下,主要是scaleLoad函数。
public class MainActivity extends AppCompatActivity {
private ImageView imageView;
private String name = "example.jpg";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageView = findViewById(R.id.imageView);
loadImage();
}
private void loadImage() {
RxPermissions.getInstance(this) //Android 6.0 系统动态获取权限
.request(Manifest.permission.WRITE_EXTERNAL_STORAGE)
.subscribe(new Action1<Boolean>() {
@Override
public void call(Boolean aBoolean) {
if (aBoolean){
scaleLoad();
}
}
});
}
private void scaleLoad(){
Log.i("path","path = " + Environment.getExternalStorageDirectory());
File file = new File(Environment.getExternalStorageDirectory(),name);
if (!file.exists()) return;
BitmapFactory.Options opts = new BitmapFactory.Options();
opts.inJustDecodeBounds = true; //设置为true,代表加载器不加载图片,只把图片的宽和高读取出来
BitmapFactory.decodeFile(file.getAbsolutePath(),opts);
int imageWidth = opts.outWidth;
int imageHeight = opts.outHeight;
Log.i("bitmap","imageWidth =" + imageWidth);
Log.i("bitmap","imageHeight = "+imageHeight);
//得到屏幕的宽和高
Display display = getWindowManager().getDefaultDisplay();
DisplayMetrics displayMetrics = new DisplayMetrics();
display.getMetrics(displayMetrics);
int screenWidth = displayMetrics.widthPixels;
int screenHeight = displayMetrics.heightPixels;
Log.i("screen","screenWidth = "+screenWidth);
Log.i("screen","screenHeight = "+screenHeight);
//计算缩放比例
int widthScale = imageWidth/screenWidth;
int heightScale = imageHeight/screenHeight;
int scale = widthScale > heightScale ? widthScale : heightScale;
Log.i("scale","scale = "+scale);
//设置为false,加载器就会加载图片了
opts.inJustDecodeBounds = false;
//使用缩放比例进行缩放加载图片
opts.inSampleSize = scale;
Bitmap bm = BitmapFactory.decodeFile(file.getAbsolutePath(),opts);
imageView.setImageBitmap(bm); //显示在iamgeView上
}
}