首先扯点别的:
昨天晚上怕97拳皇交流群里喊我打拳皇,都没敢上QQ,怕被虐,也是艰难啊。行,今天少扯点,直接进入正题:Android ImageView 的scaleType属性详解
- 1 首先看看Android中的ImageView在xml文件中的用法
<!--今天讨论的就是android:scaleType="fitCenter"-->
<ImageView
android:id="@+id/imageView"
android:layout_width="150dp"
android:layout_height="150dp"
android:layout_marginTop="30dp"
android:scaleType="fitCenter"
android:background="#ff3344"/>
2 scaleTyple 的取值有8种:看看Api
本Markdown编辑器使用[StackEdit][6]修改而来,用它写博客,将会带来全新的体验哦:3 那就从头往下捋一捋(这篇文章先捋前四个,后四个在下一篇文章中再讨论)
3.1 第一个取值是CENTER(中间的意思)意思是把图片放在ImageView 的中间,不进行缩放。如果图片的宽高都小于ImageView的宽高,就直接把图片放入ImageView的中间,如果图片的宽高大于ImageView的宽高则截取图片的中间部分放进ImageView中,光说没意思看效果:
小图片效果
大图片效果,先看看原图娱乐一下
然后把她放进ImageView,效果如下
3.2 第二个取值是CENTER_CROP(中间剪裁)意思是:保持纵横比对图片进行缩放,因此图片会和ImageView同等大小,或者大于ImageView的尺寸。
因为缩放是根据图片的短边与ImageView对应的边长度保持一致(可能是放大或缩小,会导致图片的长等于或者大于ImageView的长边导致整个图片显示不下)。最终结果是完全填充满ImageView.还是看效果
小图片的效果
大图片的效果
3.3第三个取值是CENTER_INSIDE (中间 里面,(废话,会英语的谁不认识这两个单词))解释是:保持纵横比对图片进行缩放,因此图片会和ImageView同等大小,或者**小于**ImageView的尺寸。直到整幅图能够居中显示在ImageView中;小于ImageView的图片不变,直接居中显示,不放大。看效果图
小图片不放大
大图片
3.4第四个取值是FIT_CENTER (适合,中间,是ImageView的默认的缩放模式)解释是:计算一个能保持图片原来面貌的的缩放比例,同时确保图片完全充满整个ImageView,如果不能保证图片整个充满ImageView的话,至少保证图片的一条边完全充满ImageView的对应的边。图片位于ImageView的中间。还是看效果,说不明白,我都蒙圈了。
小图怡情
大图就不咋的了
- 这就是前四种效果了,接下来贴一下代码吧。注意加载图片的时候不要出OOM问题
xml文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_horizontal"
android:orientation="vertical">
<ImageView
android:id="@+id/imageView"
android:layout_width="150dp"
android:layout_height="150dp"
android:layout_marginTop="30dp"
android:scaleType="fitCenter"
android:src="@mipmap/ic_launcher"
android:background="#ff3344"/>
<Button
android:id="@+id/btnPickImg"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="从相册选择图片" />
</LinearLayout>
java 代码
package com.imageviewdemo;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.provider.MediaStore;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private Button btnPickImg;
private ImageView imageView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnPickImg= (Button) findViewById(R.id.btnPickImg);
btnPickImg.setOnClickListener(this);
imageView= (ImageView) findViewById(R.id.imageView);
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.btnPickImg:
//打开手机图库选择一张照片
Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(intent, 7);
break;
default:
break;
}
}
/**
* 选择照片后返回,将图片加载到imageView中
* @param requestCode
* @param resultCode
* @param data
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if(requestCode==7&&resultCode==RESULT_OK) {
Uri uri = data.getData();
String[] filePathColumn = {MediaStore.Images.Media.DATA};
Cursor cursor = getContentResolver().query(uri, filePathColumn, null, null, null);
cursor.moveToFirst();
int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
String picturePath = cursor.getString(columnIndex);
Log.e("TAG", "picturePath:" + picturePath);
cursor.close();
imageView.setImageBitmap(decodeSampledBitmapFromFile(picturePath, imageView.getWidth(), imageView.getHeight()));
//imageView.setImageBitmap(decodeSampledBitmapFromFile(picturePath, 400, 400));
}
}
/**使用这个方法,首先你要将BitmapFactory.Options的inJustDecodeBounds属性设置为true,解析一次图片。
* 然后将BitmapFactory.Options连同期望的宽度和高度一起传递到到calculateInSampleSize方法中,
* 就可以得到合适的inSampleSize值了。之后再解析一次图片,使用新获取到的inSampleSize值,
* 并把inJustDecodeBounds设置为false,就可以得到压缩后的图片了。
* @param path
* @param reqWidth
* @param reqHeight
* @return
*/
public Bitmap decodeSampledBitmapFromFile(String path, int reqWidth, int reqHeight) {
// 第一次解析将inJustDecodeBounds设置为true,来获取图片大小
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(path, options);
// 调用上面定义的方法计算inSampleSize值
options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);
// 使用获取到的inSampleSize值再次解析图片
options.inJustDecodeBounds = false;
return BitmapFactory.decodeFile(path, options);
}
/**计算压缩比
* @param options
* @param reqWidth
* @param reqHeight
* @return
*/
public int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) {
// 源图片的高度和宽度
final int height = options.outHeight;
final int width = options.outWidth;
int inSampleSize = 1;
if (height > reqHeight || width > reqWidth) {
// 计算出实际宽高和目标宽高的比率
final int heightRatio = Math.round((float) height / (float) reqHeight);
final int widthRatio = Math.round((float) width / (float) reqWidth);
// 选择宽和高中最小的比率作为inSampleSize的值,这样可以保证最终图片的宽和高
// 一定都会大于等于目标的宽和高。
inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;
}
return inSampleSize;
}
}
基本就是这样了,另外4中缩放类型和效果图下篇再说。